注册
环信即时通讯云

环信即时通讯云

单聊、群聊、聊天室...
环信开发文档

环信开发文档

Demo体验

Demo体验

场景Demo,开箱即用
RTE开发者社区

RTE开发者社区

汇聚音视频领域技术干货,分享行业资讯
技术讨论区

技术讨论区

技术交流、答疑
资源下载

资源下载

收集了海量宝藏开发资源
iOS Library

iOS Library

不需要辛辛苦苦的去找轮子, 这里都有
Android Library

Android Library

不需要辛辛苦苦的去找轮子, 这里都有

环信视频直播在线技术支持下周正式上线

为了给使用环信产品的同学们提供更好的服务,自2016年3月31起,我们启动视频直播答疑(试运行)。   详情如下 在咨询问题的过程中,描述不清楚问题怎么办? 解决问题的过程中,工程师给出的解决方案自己看不懂怎么办? 环信视频直播答疑已开启,面对...
继续阅读 »
为了给使用环信产品的同学们提供更好的服务,自2016年3月31起,我们启动视频直播答疑(试运行)。
 
详情如下



45e86b6e3f8ae495578f847ff1f0676b.png



在咨询问题的过程中,描述不清楚问题怎么办?
解决问题的过程中,工程师给出的解决方案自己看不懂怎么办?

环信视频直播答疑已开启,面对面交流,工程师还通过分享桌面的形式演示,以后再也不用担心交流困难,看不懂解决方案了。

不知道小伙伴们去体验了没有?反正用过了都说好用哈!
 
这里要做一个公告:“视频直播技术支持暂停一周,下周正式上线!
 
这周我们在做界面还有内容优化,保证下次上线时给各位开发者童鞋更好的体验!
 
当然如果小伙伴们上班过程中因为环境限制不能观看直播,也可以去原有的渠道联系环信技术支持哈。
 
最后就是欢迎大家吐槽啦,对视频直播技术支持有任何问题建议欢迎评论留言,老规矩,直接现金打赏收起阅读 »

环信荣获2015开发工具及服务年度最佳品牌影响力奖

2015开发工具及服务年度大奖评选结果已于近日正式出炉,由国内多位知名技术专家组成的专家评审团最终确认了 “最佳技术创新奖”、“最佳行业竞争力奖”、“最佳用户服务奖”、“最佳品牌影响力奖”、“最佳成长潜力奖”、“最佳影响力人物奖”六大奖项的50家获奖单位和5位...
继续阅读 »
2015开发工具及服务年度大奖评选结果已于近日正式出炉,由国内多位知名技术专家组成的专家评审团最终确认了 “最佳技术创新奖”、“最佳行业竞争力奖”、“最佳用户服务奖”、“最佳品牌影响力奖”、“最佳成长潜力奖”、“最佳影响力人物奖”六大奖项的50家获奖单位和5位获奖人员名单。

即将于2016年1月15日举办的【2015开发工具及服务年度大奖评选颁奖典礼】上,除各个获奖厂商前来领奖外,主办方还为所有获奖厂商制作珍藏版纪念奖杯,表彰其过去一年来的卓越成绩,以期鼓励开发工具及服务从业者在2016年继续耕耘,为行业贡献更全面细致的服务、更夯实稳健的工具。


568f2a2311866.jpg


随着开发工具及服务不断涌现,从云服务、即时通讯、安全到统计监测、人工智能、物联网平台等,越来越多的从业者提供了优质的服务,也有越来越多的开发者从中受益,综合提高了开发效率。2015开发工具及服务年度大奖评选是CSDN创立的针对开发工具及服务的评选大奖,目的在于推动开发服务及工具质量的提升,提高行业的专业性,表彰行业内的优秀的工具/服务提供商,从而激励整个行业的从业者,促进行业的发展。
 
最佳品牌影响力奖




568f474640dec.png


【环信】


入选理由:
2015年,环信进击移动客服领域,由PaaS到SaaS。旗下拥有两个产品,IM云和移动客服,一个是PaaS一个是SaaS,两个产品的技术跨度比较大,但基于自身PaaS的SaaS产品的优势也不言而喻,环信未来会将移动客服推向两个方向:一是更智能,二是建立生态圈和平台。
收起阅读 »

环信首席架构师:一个单元化架构的例子

微博粉丝服务平台在单元化架构方面的实践已经在QCon讲过,这次重又写起文章,我想传播知识已经不那么重要(单元化架构不是创新,稍后会详细介绍),更重要的是还是希望能够借此引起诸位的思考,能够在架构层面多投入精力思考和尝试。   为什么要有架构实践? 很多人喜欢...
继续阅读 »
微博粉丝服务平台在单元化架构方面的实践已经在QCon讲过,这次重又写起文章,我想传播知识已经不那么重要(单元化架构不是创新,稍后会详细介绍),更重要的是还是希望能够借此引起诸位的思考,能够在架构层面多投入精力思考和尝试。
 
为什么要有架构实践?

很多人喜欢的是细节,因为有句名言叫魔鬼在细节里,于是都去细节里寻找魔鬼。但是打败了魔鬼就能看到天使么?未必。细节其实是最容易掌握的部分,细节之外还有很多。就像有了水泥和沙子,你能够做出混凝土,但是离建成高楼大厦还有很长的路要走一样,你要学着去设计架构。

但是事情并没有完,就像没有唯一的真理一样,架构也并不是只有一种。你不可能一朝学会,从此天下无敌。如果要赈灾,你需要的是帐篷,如果要重建,你需要的是瓦房。不同的住所需要的是不同的架构。
 
不同的服务也需要不同的架构设计,这也就是我们需要架构实践的重要原因。在这之后的原因,是我们做任何服务,都要考虑服务的性能和成本。

但优化有很多方式,为什么是架构呢?诚然,从硬件到操作系统,从共享库到应用软件,从算法到架构,每一层都可以优化,但每一层所做的工作量和收益也都是不同的。架构可能是需要投入最多精力的,但在很多时候却也是很少的可以提供超过数量级的提升方式。

所以,思维方式的转变才是你最应该在意的部分,单元化只是一个例子,而粉丝服务平台只是这个例子的例子,而已。

言归正传,接下来本文将从三个问题来介绍这次实践,单元化是什么,为什么要用以及我们如何做到的。

 
1. 单元化是什么

单元化架构是从并行计算领域发展而来。在分布式服务设计领域,一个单元(Cell)就是满足某个分区所有业务操作的自包含的安装。而一个分区(Shard),则是整体数据集的一个子集,如果你用尾号来划分用户,那同样尾号的那部分用户就可以认为是一个分区。单元化就是将一个服务设计改造让其符合单元特征的过程。



640.webp_.jpg


图 1 :洋葱细胞的显微镜截图,单元化要达到的目的就是让每个单元像细胞一样独立工作


在传统的服务化架构下(如下图),服务是分层的,每一层使用不同的分区算法,每一层都有不同数量的节点,上层节点随机选择下层节点。当然这个随机是比较而言的。




640.webp_(1)_.jpg


图 2 :传统的服务化架构,为伸缩性设计,上层节点随机选择下层节点


与其不同的是,在单元化架构下,服务虽然分层划分,但每个单元自成一体。按照层次来讲的话,所有层使用相同的分区算法,每一层都有相同数量的节点,上层节点也会访问指定的下层节点。因为他们已经在一起。




640.jpg


图 3 :单元化架构,为性能和隔离性而设计,上层节点访问指定下层节点


 
 2. 为什么要用单元化

在性能追求和成本限制的情况下,我们需要找到一种合适的方法来满足服务需求。在传统的分布式服务设计,我们考虑的更多是每个服务的可伸缩性,当各个服务独立设计时你就要在每一层进行伸缩性的考虑。这是服务化设计(SOA)流行的原因,我们需要每个服务能够单独水平扩展。
但是在摩尔定律下,随着硬件的不断升级,计算机硬件能力已经越来越强,CPU越来越快,内存越来越大,网络越来越宽。这让我们看到了在单台机器上垂直扩展的机会。尤其是当你遇到一个性能要求和容量增长可以预期的业务,单元化给我们提供另外的机会,让我们可以有效降低资源的使用,提供更高性能的服务。

总体而言,更高性能更低成本是我们的主要目标,而经过单元化改造,我们得以用更少(约二分之一)的机器,获得了比原来更高(接近百倍)的性能。性能的提升很大部分原因在于服务的本地化,而服务的集成部署又进一步降低了资源的使用。

当然除了性能收益,如果你做到了,你会发现还有很多收益,比如更好的隔离性,包括请求隔离和资源隔离,比如更友好的升级,产品可以灰度发布等。单元化改造后对高峰的应对以及扩容方式等问题,各位可以参考#微博春节技术保障系列#中的单元化架构文章,也不在此一一赘述。


3. 我们如何做到

此次单元化改造基于微博现有的业务,因此这里也先行介绍一下。粉丝服务平台是微博的内容推送系统(代号Castalia),可为V用户提供向其粉丝推送高质量内容的高速通道(单元化之后已到达百万条每秒)。整个服务涉及用户筛选、发送计费、屏蔽检查、限流控制和消息群发等多个子服务。由于改造思想相通,这里以用户筛选和消息群发两个服务为例,下面两图分别为商业群发在服务化思想和单元化思想下不同的架构。



640.webp_(2)_.jpg


图 4: 服务化思想下的商业群发架构设计(旧版)

640.webp_(3)_.jpg


图 5 :商业群发在单元化思想下的架构设计(新版)


对于筛选服务,在服务化架构里,需要去粉丝服务获取粉丝关系,然后去特征服务进行用户特征筛选,最后将筛选结果传输到群发服务器上;而在单元化架构里,粉丝关系直接就在本地文件中,用户特征服务也在本地,最后的筛选结果再不需要传输。服务本地化(粉丝关系和用户特征存储)减去了网络开销,降低了服务延时,还同时提高了访问速度和稳定性,而筛选结果本地存储又进一步节省了带宽并降低了延迟。以百万粉丝为例,每次网络操作的减少节省带宽8M左右,延时也从400ms降为0。

群发服务同样如此。由于在服务化架构里,我们使用MySQL和Memcache的方案,由于关系数据库的写入性能问题,中间还有队列以及相应的队列处理机,所有四个模块都有单独的机器提供服务,而在单元化架构里,四合一之后,只需要一套机器。当然机器的配置可能会有所提升,但真正计算之后你就会发现其实影响微乎其微。原因除了前面介绍的硬件增长空间外,上架机器的基本配置变高也是一个原因。而且,在单元化方案里,当我们把缓存部署在本地之后,其性能还有了额外的20%提升。


一些业务特有问题

不过群发这个场景,我们也遇到了一些特定的问题,一是分区问题,一是作业管理。这里也与各位分享下我们的解决方法。

分区问题分区问题其实是每个服务都会遇到的,但单元化后的挑战在于让所有服务都适配同一分区算法,在我们的场景下,我们按照接收者进行了分区,即从底层往上,每一层都来适配此分区算法。这里有特例的是用户特征和屏蔽服务,由于总体容量都很小,我们就没有对数据进行分区,所有单元内都是同一套全量数据,都是一个外部全量库的从库。不过由于本单元内的上层服务的关系,只有属于本分区的用户数据被访问到。所以,适配同一分区算法在某种程度上讲,可以兼容即可。

作业管理按照前面的分区方式,将群发服务的整体架构变成了一个类似Scatter-Gather+CQRS的方案,因为Gather不是一个请求处理的必须要素。也就是说,一个群发请求会被扩散到所有单元中,每个单元都要针对自己分区内的用户处理这个群发请求。广播方式的引入,使得我们首先需要在前端机进行分单元作业的处理监控,我们在此增加了持久化队列来解决。同时,由于单元内每个服务也都是单独维护的,作业可能在任何时间中断,因此每个作业在单元内的状态也都是有记录的,以此来达到作业的可重入和幂等性,也就可以保证每个作业都可以在任何时间重做,但不会重复执行。

除此之外,我们还对服务器进行了更为精细的控制,使用CPU绑定提高多服务集成部署时的整体效率,使用多硬盘设计保证每个服务的IO性能,通过主从单元的读写分离来提高整体服务等等。

后记

我平时不善文章,现在要成文发表,还是有一点紧张的。不过想到或许可以抛砖引玉,有机会向各位大牛学习,或者跟各位同学一起交流,内心又有些许期待。关于微博或者其他任何网站的设计,欢迎大家一起探讨,随时在微博恭候。


640.webp_(4)_.jpg


  收起阅读 »

Android Studio 2.0 导入环信Demo3.10 问题

第一步解压后的SDK文件夹  在这里主要介绍后面四个文件夹内容:doc文件夹:SDK相关API文档 examples文件夹:ChatDemoUI(为开发者能够更深入理解SDK而提供的一个demo) libs文件夹:拥有实时语音,实时视频功能的SD...
继续阅读 »
第一步解压后的SDK文件夹 



20160307175502011.png



在这里主要介绍后面四个文件夹内容:
doc文件夹:SDK相关API文档
examples文件夹:ChatDemoUI(为开发者能够更深入理解SDK而提供的一个demo)
libs文件夹:拥有实时语音,实时视频功能的SDK(大小在1.34M左右)包和.so文件
libs.without.audio文件夹:无实时语音,实时视频功能的SDK包(大小在900多K)
tools官网没给解释(未知)
第二步我们要导入的是examples文件夹里的内容 



20160307175539636.png



接下来删除两个文件夹下的build.gradle 



20160307175617371.png



第三步导入项目 我是在打开项目的基础上又重新打开一个界面,导入方式就不多说了 



20160307175704872.png



导入后项目的运行可能是灰色的 我们通过进入Project Structure来先删除mod,在次导入mod 导入时选择easeUIDemo 



20160307175803123.png



第四步导入jar和io文件

在自行开发的应用中,集成环信聊天需要把libs文件夹下的easemobchat_2.1.6.jar和armeabi目录导入到你的项目的libs文件夹底下,如果不需要语音和视频通话功能,导入libs.without.audio下的jar文件即可。(这是环信文档)由于我是集成即时通讯,真实文件是下面这两个,复制粘贴到libs文件夹下 



20160307175903453.png




20160307180006013.png



报错:

Error:Execution failed for task ‘:easeUIDemo:compileDebugNdk’.
Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set “android.useDeprecatedNdk=true” in gradle.properties to continue using the current NDK integration.
解决方法 项目build.gradle下图对应位置加入如下代码 ( 可复制粘贴)
sourceSets.main { 
jni.srcDirs =
}




20160307180056545.png



然后就可以了,自己遇到的问题,希望能帮到面临这些问题的人
 
本篇Android studio集成由环信热心开发者提供,博客请点击Crazy丶code 收起阅读 »

环信直播课堂第六期--2.x和3.x的单聊的集成

日期与时间:2016年4月7日15:00 http://www.imgeek.org/video/23 持续时间:半小时 描述:集成环信2.x 3.x sdk怎么选?怎么用最简便的方法集成聊天功能? 本期环信直播课堂将由环信ios工程师shenc给大家带来...
继续阅读 »
日期与时间:2016年4月7日15:00
http://www.imgeek.org/video/23
持续时间:半小时

描述:集成环信2.x 3.x sdk怎么选?怎么用最简便的方法集成聊天功能?

本期环信直播课堂将由环信ios工程师shenc给大家带来ios 2.x和3.x集成介绍,并详细讲解头像昵称的实现,大家有其他问题也可以直接提问哦! 
 
PS:这是一份史上最全的环信iOS 2.x and 3.x SDK单聊的集成方案!

直播观看地址: http://www.imgeek.org/video/15
 
视频回放地址:http://www.imgeek.org/video/23 收起阅读 »

“App增长加速度”主题分享会:听环信解读”APP如何提升造血能力“

一、 活动介绍          随着移动互联网的发展,加上政府的鼓励和扶持,一股轰轰烈烈的全民创业大浪潮正席卷全国。然而,万众创新下的创业者们却面临着流量被垄断和马太效应等重重创业关卡。         2016年,如何突围缺钱、缺人、缺流量关卡,加速A...
继续阅读 »
一、 活动介绍

         随着移动互联网的发展,加上政府的鼓励和扶持,一股轰轰烈烈的全民创业大浪潮正席卷全国。然而,万众创新下的创业者们却面临着流量被垄断和马太效应等重重创业关卡。

        2016年,如何突围缺钱、缺人、缺流量关卡,加速App内增长,提升企业业务竞争力及商业价值?或许可以用共享经济法则和移动应用新技术mLink切入万亿级App市场,或许可以借力大数据揭秘资本寒冬下的增长之道,又或许可以试试用户人群精细化运营的正确姿势……本期“App增长加速度”主题分享会邀您一起发现改变力!

【时间】2016年4月9日下午13:00—17:00

【地点】成都高新区软件园A9 3楼(十分咖啡·投资家)

【人数】300人

【人群】欢迎移动端App创业者、研发人员、架构师、产品经理报名参加!

二、活动福利

•尝鲜硅谷最新创业创新理念及实操干货经验

•和来自北京上海增长最快的技术创业团队面对面探讨创业经

•免费获得魔窗价值30000元/月的VIP账号

•免费获得GrowingIO企业版代金券4000元

•免费获得猿团周边礼品包1份
 
三、活动流程

13:00-13:15  签到、交换名片

13:15-13:30  主持人:初笋科技创始人冷治福

13:30-14:00  魔窗创始人兼CEO 姜孟君:《如何用共享经济法则切入万亿级App市场》

14:00-14:30  GrowingIO创始人、CEO 张溪梦:《数据驱动增长——GrowingIO》

14:30-15:00  Testin西南区技术总监李小川:《APP全生命周期质量》

15:00-15:30  环信高级产品市场经理谢韩:《资本寒冬,APP如何提升造血能力》

15:30-16:00  猿团科技创始人&CEO谢恩明:《App+》

16:00-16:10  休息

16:10-16:40  圆桌会议:现场提问+嘉宾答疑

16:40-       自由交流


四、分享嘉宾&主题
1、分享嘉宾:魔窗创始人兼CEO姜孟君



30342286476709304.jpg



 企业级和互联网解决方案双料专家,多年大数据资深从业者,O2O经验咨询平台“在行”资深行家。从业15年+,拥有大型企业级SAAS解决方案及多年营销大数据经验,擅长软件云化与服务化、大数据处理与应用、社会化倾听、电子商务、互联网精准营销相关及团队建设等方面。曾在一年半内从零组建一支30多人规模的互联网创业团队,并交付4个明星级别产品,单一产品线第一年收入超过500万。

 曾担任惠普中国、惠普美国数据管理平台和新一代数据中心核心负责人;SAP首席工程师,SAP云加速特别行动小组首位中国区代表;AdMaster研发副总裁及上海研发中心总经理。

 两年前加入互联网创业浪潮,开创App Growth Engine——魔窗(MagicWindow),为App提供变革式的面向服务的开发方式,1天让APP变本地开放平台,提升App用户体验及转化率,让每一个App都可以轻松情景式相连,让创业更加轻松愉悦!

分享主题:《如何用共享经济法则切入万亿级App市场》
•探讨共享经济理念在APP创业者当中能否成立
•阻断App创业者协同创业最大的瓶颈是什么
•如何打破资源和流量的马太效应完成有机增长
•2016移动端应用的变革——mLink

2、分享嘉宾:GrowingIO创始人、CEO张溪梦



30372286477679388.jpg



 GrowingIO创始人、CEO。前LinkedIn美国商业分析部高级总监,美国Data Science Central评选其为“世界前十位前沿数据科学家”,亲手建立了LinkedIn将近90人百人商业数据分析和数据科学团队,支撑了LinkedIn公司所有与营收相关业务的高速增长。2015年5月,从硅谷创办基于用户行为的新一代数据分析产品GrowingIO,提供全球领先的数据采集和分析技术。企业无需在网站或app中埋点,即可获取并分析全面、实时的用户行为数据,以优化产品体验,实现精益化运营,用数据驱动用户和营收的增长。2015年12月,荣获DOIT评选的2015中国十大数据英雄,由他创办GrowingIO并获得《快公司》评选的2015年中国最佳创新公司50。
分享主题:《数据驱动增长——GrowingIO》

•来自硅谷增长黑客秘密
•海盗法则 Pirates AARRR
•增长黑客实现方法
•如何衡量?建立合理的KPI体系
•GrowingIO案例分享

3、分享嘉宾:Testin西南区技术总监李小川



30332286478139420.jpg



  八年互联网产品测试及质量管理经验,曾任北京邮电大学信息安全中心研究员、华为测试经理、北京云蜘蛛科技副总,曾担任过6个运营商级项目的测试经理,对于产品质量控制和自动化测试有丰富的经验。


分享主题:《APP全生命周期质量》

 互联网的根本是用户,APP产品如何留住用户?红利、互联网推广还是好的用户体验?根据Testin数据分析,随着移动互联网人口红利的逐步消失,新用户的比例在逐步减少,相反,老用户的比例攀升。这一变化预示着用户对于应用的选择将越来越苛刻,部分用户体验较差、运营不佳的应用将被迅速淘汰。因此,如何做好APP质量,提升用户体验是重点。
 如何做好APP产品质量,Testin分享APP质量之APP全生命周期测试:功能、兼容、性能、体验、压力、安全。

4、分享嘉宾:环信高级产品市场经理谢韩



30262286478949487.jpg



 IT行业跨领域市场研究者,先后从事网络、安全、互联网领域的市场研究与分析工作,对商业技术趋势有较深理解。
分享主题:《资本寒冬,APP如何提升造血能力》
 随着外部资金渠道的趋紧,依靠APP自身实现内源性增长成为必然的选择,这就需要App能够自我造血,具备吸引用户和转化用户的能力。在这个过程中,连接人与人的IM技术,连接人与商业的移动客服,是帮助App建立社区,实现商业变现过程中的有力助手。在此基础上,基于连接属性所进行的人群和内容大数据分析,也能够推动App实现精准化营销和精细化运营。

5、分享嘉宾:猿团科技创始人&CEO谢恩明



30122286479889547.jpg



80后青年创业者,十年连锁企业负责人。08年加入互联网行业,曾任职于金山、腾讯,具备丰富的客户服务、企业培训、企业管理等经验。之后创立猿团科技,担任CEO,猿团科技在他的带领下,半年时间从估值两千万到两个亿,随后创立猿团投资公司,猿团传媒公司,目前已经帮助40+个项目进行创业。
分享主题:《App+》
 
报名请点击阅读原文
 
  收起阅读 »

【活动报名】HTML5 app轻架构高性能开发交流会,4月9日北京

 H5 app已成趋势!        如果认为这是危言耸听,那么你危险了。在W3C宣布html5正式定稿一年半以来,h5技术带来的产业变革已经不再停留在“干打雷”,而是掀起了“疾风骤雨”:        Adobe支持用户放弃Flash,鼓励...
继续阅读 »
 H5 app已成趋势!


       如果认为这是危言耸听,那么你危险了。在W3C宣布html5正式定稿一年半以来,h5技术带来的产业变革已经不再停留在“干打雷”,而是掀起了“疾风骤雨”:

       Adobe支持用户放弃Flash,鼓励使用html5;

       微信即将推出应用号;

       Facebook、谷歌、微软、BAT等纷纷全面支持html5;

       html5病毒式疯狂传播案例的频频出现;

       … …

       移动应用开发领域亦受到html5技术风暴的“席卷”。

       然而,面对HTML5带来的变革机遇,你是否因为对h5 app的种种担心,放缓了抢占市场先机的步伐?

       ——担心h5 app性能不稳定,交互体验效果差,影响用户体验感

       ——担心自身技术不过硬,无法快速进入h5 app开发者行列

       ——担心开发平台限制多,应用源码及产权难保障

       … …

       4月9日13点30分,北京百川创业营,由WeX5移动应用开发平台主办的html5 app轻架构高性能开发交流会(北京)将给你答案!。

       届时,WeX5首席技术运营官将为您的问题进行解答,并与您分享诸多干货:

       h5 app为何成为颠覆App既有行业格局的力量;

       如何规避h5 app开发中的各种坑;

       WeX5开发平台为开发者带来哪些极致体验;

       深入交流探讨html5 app轻架构、高性能开发的技术问题和案例现场讲解;

       WeX5开发app过程视频展示。     

       此外,本次技术交流活动不仅为各位开发者准备了技术盛宴,还提供有各种精美礼品,幸运者更可享受WeX5产品VIP服务,让您领航h5 app开发之路。

【活动时间】

        2016年4月9日(周六)下午13:30—16:30

【报名入口】

        点击“阅读原文”,即可免费报名。

【活动地点】

        北京市海淀区长春桥路11号万柳亿城中心C2裙房B1百川创业营

       (C2楼北侧进,电梯下往B1层即到)



640.webp_.jpg



【主办方】



QQ图片20160405115529.png



【合作伙伴】



640.webp_(1)_.jpg



阅读原文 收起阅读 »

Android 3.1.1, iOS3.1.1 release

新功能: 音视频增加弱网/断网检测功能; 音视频增加音频、视频流暂停、恢复功能; 音视频增加录制功能; 发送图片默认压缩图片,节约流量; bug fix: Fix iOS demo退到后台后某些情况下crash的bug。 点击下载:http://www...
继续阅读 »

Img387233141.jpg



新功能:

音视频增加弱网/断网检测功能;
音视频增加音频、视频流暂停、恢复功能;
音视频增加录制功能;
发送图片默认压缩图片,节约流量;

bug fix:

Fix iOS demo退到后台后某些情况下crash的bug。


点击下载:http://www.easemob.com/download
  收起阅读 »

Uber弃用email客服改用应用内客服,App内置客服将成趋势?

Uber的用户求助服务一直是通过Email沟通,而近日Uber将该服务切换到了应用内部。这么做理由何在呢? 因为在Uber一直希望获取大量市场份额的部分国家,例如中国和印度,用户并不像西方人那样习惯使用Email。  我们从上世纪90年代中叶开始...
继续阅读 »



640.webp_.jpg



Uber的用户求助服务一直是通过Email沟通,而近日Uber将该服务切换到了应用内部。这么做理由何在呢? 因为在Uber一直希望获取大量市场份额的部分国家,例如中国和印度,用户并不像西方人那样习惯使用Email。



640.webp_(1)_.jpg



 我们从上世纪90年代中叶开始就习惯了往来的电子邮件传达信息,而中国的大部分用户甚至连Email地址都没有。因为互联网不那么让人觉得靠得住,在中国和印度,人们更喜欢使用微信这样的聊天软件进行交流。在2015年,微信已拥有超过10亿用户。



0.webp_.jpg



Uber的“用户沉迷”产品经理Michael York说,虽然新的应用内服务去年晚些时候在美国铺开,实际上为了从Email交流转变为应用内沟通,Uber已潜心研究数年。Uber现在正在将其业务拓展到这样一些国家——为留住用户,Uber需要帮助用户找回不小心落下的东西、或处理其他投诉,这些工作需要牵涉到乘客和司机两个方面。

York说“(这种转变)对于中国、印度及其他更喜欢即时聊天的地区用户而言是巨大的。”而这种转变也同样减轻了客服部门的压力。Uber专家以往需要同时处理无礼乘客、失物找回等各类投诉Email,而这已成为过去式,因为彼时Uber还没有这么多用户。

Uber还一直因为不提供电话协助服务而饱受批评,因为有的时候发邮件几乎是不可能的。而且Uber的客服邮件一般都是自动回复的统一信息,之后才会有人工回复。

在过去的几年,Uber开始投入“数百万”的资金建立其支持中心的网络以加快反应速度。中心已建立在包括芝加哥(美国)、凤凰城(美国)、利默里克(爱尔兰)、克拉科夫(波兰)、武汉(中国)、海德拉巴(印度)、马尼拉(菲律宾)等许多地方。然而公司与用户之间的沟通需要比用Email更接地气的方式。

Uber的全球运营主管Michael Mizrahi说,为应对这样的改变,工程师不得不在后端重写整个支持系统,新的Uber应用将会在未来几周内推出。美国市场将最先获得更新,然后再陆续推广至全球其他地区。

如果您的公司也有和Uber一样的客服困境,那么现在市场上主流的SaaS移动客服是您的不二选择:1,极简快速集成,一天时间即可让您的APP拥有应用类客服功能。2,按需付费。3,弹性扩容。4,智能机器人提高效率降低成本。5,全媒体接入,包括微博、微信、网页、H5、APP、呼叫中心等一键集成一网打尽。

环信移动客服是全球首创的全媒体智能云客服平台。支持全媒体接入,包括网页在线客服、社交媒体客服(微博、微信)、移动端客服和呼叫中心等多种渠道。环信移动客服基于环信业界领先的IM长连接技术保证消息必达,并通过强大的智能机器人技术极大降低人工客服工作量。

截至2015年底,环信移动客服共服务了12000家企业用户,现已覆盖包括电商、O2O、互联网金融、在线教育、在线旅游、移动医疗、智能硬件、游戏等20大领域的Top10客户,典型用户包括国美在线、58到家、楚楚街、随手记、海尔、51talk,链家自如客等众多互联网和传统企业。根据易观国际发布的《中国SaaS客服市场专题研究报告2015》显示:截至2015年第三季度,环信移动客服在SaaS移动端客服用户覆盖占比为77.4%,以绝对优势稳居行业第一。

此番Uber弃用传统email客服改用应用内客服其实是一个必然趋势,那么是否会对亚太乃至整个客服市场造成影响?我们拭目以待。
 
环信编译自“techcrunch美国”,请点击“阅读原文”跳转至英文链接。
 
阅读原文 收起阅读 »

清明节特辑:那些过时却仍在使用的技术

清明节对于中国人来说是祭祖和扫墓的日子。不过在新旧更替、大浪淘沙的互联网行业,过去一年也有不少技术难逃过时的命运,当然原因也是各种各样。 但是笔者一直觉得,有些技术虽然已经过时,但是不会死,只会慢慢消亡。今天就来一起盘点下,那些已经过时,却仍在使用的技术! ...
继续阅读 »
清明节对于中国人来说是祭祖和扫墓的日子。不过在新旧更替、大浪淘沙的互联网行业,过去一年也有不少技术难逃过时的命运,当然原因也是各种各样。

但是笔者一直觉得,有些技术虽然已经过时,但是不会死,只会慢慢消亡。今天就来一起盘点下,那些已经过时,却仍在使用的技术!

1、拨号上网



wKioJlJ4am7jyED-AACHFSzUiyE658.jpg



我记得在我上一次使用拨号上网的时候是希望从某网站上下载一份学习报告,但在忍受了长时间的蚂蚁网速后,我终于下定决心同拨号上网说拜拜。然而,根据皮尤公布的《互联网与美国人生活习惯研究项目》(Pew Internet & American Life Project)数据显示,大约有4% 的美国人仍然在使用拨号上网。这也就是说,有超过 1000 万人在以不超过 56.6k/s的速度访问互联网!

需要指出的是,这4% 的拨号上网用户中可能有一部分是由于地处偏远地区而没有宽带互联网连接(这部分人群大约占据全美总人口的6%),剩下的一部分人则可能是基于费用或者其他原因而没有安装宽带。

2、传呼机



wKioOVJ4am7gXuRAAABZUMpimy4274.jpg



在上世纪 90 年代,人们彰显自己身份的标志之一便是传呼机。在那个年代,如果你拥有一部传呼机的话,人们通常会把你认作是企业 CEO,或者是一名外科医生,因此续续时刻同外界保持联系。但在几年的时间内,可以同时让人们收发信息手机的出现已经逐渐使传呼机退出了历史舞台。

尽管目前手机已经拥有着绝对统治地位,但传呼机仍然拥有着一定的市场份额。根据美国消费电子协会的报告指出,2012 年美国人总共采购了总金额为 700 万美元的传呼机,数量约为 1 万部左右。如果说你希望在能够保持同外界接触的情况下保留一定个人隐私的话,传呼机似乎的确是一个不错的选择。

说到这里,你可能会想象到一个个其貌不扬的毒品贩子在街头通过传呼机联络的画面。但事实上,现在有许多医院仍然倾向于为医生配备一部传呼机,因为他们认为传呼机网络相比手机网络更加可靠,尤其是在紧急情况发生的情况时。

3、点阵打印机



wKioOVJ4am7yYxK3AABpstLfCM0544.jpg



尽管在很多场合内,点阵打印机的地位早已被喷墨打印机所取代,但根据知名市场研究公司 NPD 公布的数据显示,美国人在 2012 全年还是购买了大约 2 万部全新点阵打印机。而且,在亚马逊购物网站上,我们仍然发现点阵打印机拥有一个完全独立的板块,其售价也往往比普通的喷墨打印机贵上了一倍左右(最低售价为 205 美元)。

那么,现在还有哪些企业或者工作人员需要使用到这个出生于 1983 年的老旧技术呢?事实上,许多仓库、销售点或者其他一些业务系统都仍然十分依赖于这一设备,因为他们往往需要开具一式五联的单据,而开具这样单据的最好方法便是通过点阵打印机来实现。

4、PDA(个人数字助理)



wKioJlJ4am7AIgmCAAB_rhhZ67I623.jpg




在很久以前,我曾经拥有过一部 Palm Pilot 个人助理设备,这是有史以来用户第一次可以从通讯录里直拨电话的设备。随后,我又用上了拥有彩色显示屏幕的 Cassiopeia。但是,我和个人数字助理设备之间的情缘也就到此为止了,因为智能手机的出现几乎使 PDA 变得一无是处。

然而,根据美国消费电子协会给出的数据显示,去年美国地区依然卖出了大约 35 万部全新 PDA 设备。该协会行业分析主管史蒂夫-科尼格透露,“人们购买 PDA 并不是因为他们因循守旧,而是因为许多垂直市场依旧需要使用随身 PDA 来收集数据,尤其是在仓库和医院这样的特殊办公场所”

5、公共电话



wKioJlJ4am7i_AZTAACAO4IqMKw579.jpg




根据美国公共交流委员会(American Public Communications Council)在 2012 年第三季度给出的数据显示,全美境内目前仍然拥有多达 30500 个公共电话,对于知名乐队 Maroon 5 的粉丝来说,这或许是个不错的消息(该乐队的最近一张专辑的主打歌曲就是“Pay Phone”)。

事实上,这些公共电话直到现在也仍然在发挥着自己的巨大作用。美国公共交流委员会透露,2012 年人们总计使用这些公共电话拨打了超过 5000 万次电话。那么,到底有哪些人会直到现在仍然在使用公共电话呢?

分析人士认为,那些无力购买一部手机的低收入群体、希望保持自己匿名身份的人、手机在路上突然没电的用户以及那些突然无法接收运营商信号的人都有可能使用到公共电话服务。

6、录像带和磁带



wKioOVJ4am6zphMKAACB_yAK9xc884.jpg




在互联网高速发展的时代,人们已经可以在线下载许许多多的音乐和其他数字内容。亦或者,用户也可以选择继续沉浸在 1985 年的生活中,也就是利用磁带录下广播中的歌曲、利用录像带录下电视中正在播放的节目。

7、固定电话



wKioOVJ4am7Qo7lxAACUKB7Fvg0195.jpg




在 2012 年中期,全美大约 34% 成年人家中没有安装固定电话。但与此同时,仍有 66% 的成年人不仅在家里安装了固定电话,而且还会为这套系统购买新硬件。根据美国消费电子协会给出的数据显示,美国人 2012 年总共购买了 500 万部固定电话和 2150 万部无绳电话。

8、CRT 电视



wKioJlJ4am-zSohXAACGGhxKXYk800.jpg




虽然目前仍然有相当数量的美国家庭在使用老旧的 CRT 电视,但大多数消费者电子产品公司已经基于种种理由而停止了这类产品的生产、开发工作。因为这些 CRT 电视不仅丑陋、过时,其内部笨重零部件的生产和海外运输成本也十分高昂。但是,根据知名市场研究机构 NPD 给出的数据显示,美国人在去年总计购买了 1 万台全新 CRT 电视,其中大多数 CRT 电视的主要观看群体是儿童。

9、胶卷



wKioJlJ4am-RVcZ_AACeB6uyoxU227.jpg




现在,绝大多数用户手中的智能手机都已经配置了高清摄像头,但传统一些的卡片式照相机以及数码单反相机也依旧十分流行,现在用户甚至只需要花费不到 100 美元的价格便可以购买一部成像效果相当不错的数码相机。因此,考虑到用户利用数码相机所拍摄图片的持久性、可分享性以及高品质,我们实在很难想象现在依旧有人在使用老式胶卷相机。

然而根据 NPD 给出的数据显示,美国人似乎依旧对于这种老式的生活记录方式情有独钟,因为美国地区在去年依旧卖出了高达 3500 万卷相机胶卷。其中,部分人们是 Lomo 拍摄方式的狂热爱好者,另有一部分人则仅仅是不愿意同自己的宝丽来相机说分手而已。

10、Windows 98 和 Windows 98 操作系统



wKioOVJ4am-TGanCAACetzHFh74311.jpg




虽然绝大多的人们都喜欢驾驶配置了诸如先进燃油喷射、安全气囊和操控体验的新款汽车,但世界上总有那么一部分人更喜欢驾驶老式的本田 Civic 车型,而这一点在人们所使用的一些复古操作系统中也可见一斑。

据市场调研究公司网络应用(Net Applications)公布的数据显示,目前仍然有 0.05% 的美国人在使用 Windows 98 和 Windows 2000 操作系统。与此同时,The Computer Industry Almanac 则表示,考虑到目前美国总计拥有 3.11 亿部电脑的事实,我们可以发现仍有超过 15 万人在使用来自上个世纪的操作系统。

11、传真机



wKioOVJ4am_ADOyNAACIum-eEd4208.jpg




早在上世纪 70 年代,传真机就成为了一款必不可少的办公室设备。但在过去了整整 40 年后,随着电子邮件、即时通讯应用等服务的兴起,传真机似乎已经失去了自己继续存在下去的理由。然而,事情的发展却没有同人们的想象保持一致,由于许多商业合同的签订仍然需要企业高层的亲笔签名,因此传真机在现代企业中仍然十分普遍。

根据 NPD 的数据显示,美国人总计在 2012 年内购买了 35 万部新传真机,但相比 2011 年同比下降了 14%。

12、黑胶唱片机



wKioJlJ4am-TBoOCAAB-WbR6n4g467.jpg




当猫王正处于流行舞台最中央的时候,黑胶唱片机也成为了当时许多年轻人听歌的第一选择。但是,在当今数字音乐下载和流媒体服务大红大紫的年代,看似“过时”的黑胶唱片却显示出了卷土重来之势。

尽管这一技术已经面世了很长时间,但现在有越来越多的新唱片开始以黑胶唱片的形式发行,其中就包括来自蠢朋克乐队(Daft.Punk)和僵尸周末乐队(Vampire Weekend)的最新作品。根据美国知名数据分析机构 Nielsen SoundScan 日前公布的数据显示,美国人在 2012 年总计购买了 460 万张黑胶唱片,同比上升了 17.7%。尽管这一数字相比 2012 年 1.18 亿数字专辑的销量还相去甚远,但这一“古老”产业的复兴似乎已经成为了一件不争的事实。
 
总结:

虽说科技在近年来迎来了前所未来的巨大飞跃,在对于许多普通人来说,我们的日常生活中还是能够时时刻刻看到许多“古老”技术的存在。比如,对于诸如拨号上网、磁带播放器、录像机等这些物品相信大家都不会陌生。就此,美国消费电子协会(CEA)行业分析主管史蒂夫-科尼格(Steve Koenig)就表示:“真正淘汰一项技术所需要的时间恐怕会超出你的想象。”

与此同时,美国消费电子协会日前公布的一份研究报告也指出,“大约仅有13-15%的人们是新兴技术的早期试用者,另有超过60%的人则通常会在一段时间以后才选择升级自己的老设备、或者采纳新技术。

在传统的客服中心领域也正在发生这种技术变革,传统的呼叫中心正在被以全媒体、智能机器人、移动端等特性的SaaS客服所颠覆和取代。新时代的SaaS客服集成简便快速,按需付费,弹性扩容,结合新一代的智能机器人技术极大的提高效率帮助企业降低成本,最后最重要的一点就是“价格特别低,价格特别低,价格特别低。”重要的事情说三遍。环信移动客服——全媒体智能云客服倡领者,1500元/坐席 一年的价格是不是童叟无欺。PS:两个坐席以内还完全免费哦。
环信移动客服是全球首创的全媒体智能云客服平台。支持全媒体接入,包括网页在线客服、社交媒体客服(微博、微信)、移动端客服和呼叫中心等多种渠道。环信移动客服基于环信业界领先的IM长连接技术保证消息必达,并通过强大的智能机器人技术极大降低人工客服工作量。
收起阅读 »

环信视频直播答疑(试运行)开启!有问题速度进来问

为了给使用环信产品的同学们提供更好的服务,自2016年3月31起,我们启动视频直播答疑(试运行)。 请直接在右侧输入你的呢称后进入“直播间”,进入“直播间”后在“问答区”用文字提出你的问题,我们的技术服务工程师将用语音直接回复;如果需要花较多时间才能解决,技...
继续阅读 »
为了给使用环信产品的同学们提供更好的服务,自2016年3月31起,我们启动视频直播答疑(试运行)。

请直接在右侧输入你的呢称后进入“直播间”,进入“直播间”后在“问答区”用文字提出你的问题,我们的技术服务工程师将用语音直接回复;如果需要花较多时间才能解决,技术服务工程师将会引导你采用另外方式进一步获取答案。
 
http://view.csslcloud.net/api/view/index?userid=7A8985E0D49B72B8&roomid=CA10D703BDF6DC969C33DC5901307461 收起阅读 »

环信直播课堂第五期--消息输入状态与群组@人

日期与时间:2016年3月31日15:00 持续时间:半小时 描述:想知道对方是否正在回复你的消息?群组里想把消息说给指定的人,群消息太多对方没关注怎么办? 本期环信直播课堂将由环信Android工程师zhuhy给大家带来“如何实现消息输入状...
继续阅读 »
日期与时间:2016年3月31日15:00

持续时间:半小时

描述:想知道对方是否正在回复你的消息?群组里想把消息说给指定的人,群消息太多对方没关注怎么办?

本期环信直播课堂将由环信Android工程师zhuhy给大家带来“如何实现消息输入状态与群组@功能!
 
PS:有些妹子真是太倔强了,明明可以靠脸吃饭,偏要靠才华...

直播观看地址: http://www.imgeek.org/video/15
 
直播视频回放:http://community.easemob.com/video/22
 
消息输入状态与群组@人demo下载↓↓↓
  收起阅读 »

环信“连接”沙龙第五期技术干货全分享:一切不以变现为目的的APP运营都是对投资人耍流氓

3月26日,环信在北京中关村左岸公社“Wepac”空间成功举办了第五期“连接”沙龙技术活动,本期活动主题为“APP变现之路”。一切不以变现为目的的APP运营都是对投资人耍流氓。环信旨在通过沙龙活动,连接开发者与开发者,开发者与用户,共同探讨当前的热点和趋势。整...
继续阅读 »
3月26日,环信在北京中关村左岸公社“Wepac”空间成功举办了第五期“连接”沙龙技术活动,本期活动主题为“APP变现之路”。一切不以变现为目的的APP运营都是对投资人耍流氓。环信旨在通过沙龙活动,连接开发者与开发者,开发者与用户,共同探讨当前的热点和趋势。整场活动干货满满,当天到场近200人,座无虚席。



640.webp_.jpg


在“对,就是这个胖子”的小声议论中, 环信市场VP程开源上台致欢迎词...


在活动现场,演讲嘉宾围绕App变现,从不同维度,不同角度与参会者分享了自己的观点。演讲嘉宾包括环信大数据产品总监马冀、云账户联合创始人兼CTO邹永强、魔窗CTO张申竣、北京妙创意科技联合创始人苏然分别从大数据分析、App金融SDK、Deep Link技术、场景化造物等不同维度与到场的市场运营和开发者们进行了深入交流,气氛十分热烈。

一,深藏的金矿——社交大数据分析和挖掘



640.webp_(1)_.jpg


环信颜值担当大数据产品总监,九头身欧巴马冀走着台步就上来了...


针对当前众多App所困扰的变现问题,环信大数据产品总监马冀分析了App变现面临的难题以及从大数据的角度,如何破解。首先App需要明确的几个问题,“要卖什么?”“卖给谁”、“真实用户有多少?”只有在了解了当前APP的真实状况后,才能进行精准化的营销。



640.webp_(2)_.jpg



基于大数据的社交分析能够帮助运营者了解当前App的真实用户粘性。目前,环信大数据平台已经为App提供了数十个指标,包括DAU,日存留用户、具有IM行为的用户数、每日消息数等等。有了这些实际数字,App运营者就可以清晰的知道当前真实的用户群状况,从而采取相应策略的提升用户粘性。 



640.webp_(3)_.jpg



其次,基于大数据的社交分析能够帮助App进行精准化的营销。一是对用户内容进行分析。例如,当前App中有哪些主题和关键字最受用户关注,哪些用户对这些主题最热衷,哪些用户对这些关键最反感等等。基于内容的分析能够帮助App运营者找到用户的关注点。其次,大数据还能够对用户进行分析,例如,找到用户之间的关系圈,哪些用户之间联系较为紧密,具有相同的兴趣爱好,这些用户最爱购买哪些商品。某款产品,哪些用户群的需求量最大。通过对社交的大数据分析,App可以清晰的对用户进行画像,从中挖掘出潜在的需求,进行精准化营销,从而实现商业变现。
PPT下载:http://www.imgeek.org/article/825307747
 
二,云账户,金融SDK助App流量变现



640.webp_(4)_.jpg


有着一张明星脸的云账户联合创始人兼CTO邹永强上来很爽快的在活动群发了个大红包,场下有人嘀咕:“岳云鹏就是大方...”




640.webp_(5)_.jpg



邹永强博士认为广告离钱很近,但并不是唯一的变现方法。广告的产品形式不够丰富,与App场景的结合不是很好,而金融是离钱更近的行业,所以云账户提倡场景式金融,关心金融与App场景的结合。国内很多公司都在涉及互联网金融领域,例如58同城、同程等。”云账户的思路是通过做一个金融的SDK结合App去变现,包含多种模式。

云账户金融SDK具体包含四种模式:

1.社区式理财超市:包含各类的理财产品;

2.App内余额生息:为本身有用户余额体系的App提供生息服务;

3.押金理财:为保证金或押金增加理财功能;

4.红包:提供点对点红包、拼手气群红包、品牌红包、卡券,已集成至环信IM SDK。

云账户金融SDK提供多种服务,包括:

1.对接金融机构和产品,免去商务和技术成本;

2.对接监管系统,解决分布式事务、对账、性能等问题;

3.支持多种App接入方式;

4.提供运营解决方案,包括加息券、体验金,App定制活动,运营方案建议等;

5.提供数据分析系统,包括用户、投资、红包商户端、用户行为报表、自定义用户行为分析、第三方监测等;

6.提供多层次的安全体系,即信息安全、金融安全、反欺诈和业务安全。

流量变现是App的核心问题,场景化金融是新途径,云账户提供可定制的金融SDK帮助变现,在四种模式中涵盖了很多服务。金融SDK模式可以快速接入,并且不会导出用户流量。通过简单易操作、直接集成至IM SDK的红包功能,为新时代的App提供更多变现、促活的可能。环信即将联合“云账户”上线包括品牌特定主题红包及商家卡券等更多增值服务和新玩法,将为移动互联时代的App社交和变现提供更多的想象空间。

PPT下载:http://www.imgeek.org/article/825307751
 
三,Deep Link——移动应用的变革



640.webp_(6)_.jpg


极客范十足的魔窗CTO-张申竣,上场就问“亲,你知道Deep Link么?”直到他演讲完我估计大家都懂了...


Deep Link是一种无需通过传统的App启动方式即可呼起移动App的一种方式,是近期科技业内的热门。Deep Link这项技术使得App 有能力像web页面那样被传播,让用户一键直达App的内容页。每个App都可以利用Deep Link完成服务化,让每个需要传播的页面都能直接被访问。

针对Deep Link技术的落地,魔窗CTO张申竣介绍了mLink解决方案的优势。mLink解决方案能够额外为开发者带来微信内的直接唤醒,用户在没有安装过App情况下的各种策略优化,以及用户通过deep link在第一次安装打开应用后直接唤起相应的服务页。这些特性能够帮助App很好的利用Deep Link传播服务,实现有机增长。魔窗的mLink还能使得App能将自己的Deep Link服务注册到服务市场被其他app发现,传播并且评估效果。
PPT下载:http://www.imgeek.org/article/825307750
 
四,场景时代下的造物变现逻辑



640.webp_(7)_.jpg


苏然有多潮,现阶段电商就有多火...


北京妙创意科技联合创始人苏然和与会听众分享了关于场景造物和场景器官的APP变现思路。在当前,已经不是物以类聚的时代,而是人以群分的时代。传统的电商做物以类聚的事情,找出性价比,让消费者更容易看到它,以一个看起来奢侈品的包装卖出超级低的价格形成转化,这是传统电商的模式。而现在的时代是一个新场景的时代,移动电商下的人群并不是在卖货,而是卖一个人群下的同样发生下的场景。每一个APP也好,每一个流量也好,需要匹配变现的价值是场景延伸的价值。让一个场景产生延伸的能力,我们赐予它场景延伸的能力,这个东西叫场景器官。通过大量实际例子,苏然和大家分享了场景变现的思路和实践。
PPT下载:http://www.imgeek.org/article/825307749



640.jpg


我不会告诉你右侧环信市场部两位年轻人至今单身,除了加班无不良嗜好,性取向正常,请留言索要联系方式...




640.webp_(8)_.jpg


感谢以上小伙伴对本次活动的大力支持,未来还要一起玩耍一起飞...


 通过“连接”沙龙,环信旨在推动并打造一个互联网技术创新的平台,以期能够将有价值的技术资源整合推出,让更多的技术人开始分享技术,获得价值。

环信“连接”沙龙第七期(上海站)开始报名
APP变现之路 ——环信“连接”沙龙第七期(上海站)开始报名。可以点击“环信“连接”沙龙第七期(上海站)”查看详情以及报名,敬请期待!ps:上海站演讲人有中华小姐出境哦,有些人真是太倔强了,明明可以靠脸吃饭,偏要靠才华...
 
环信“连接”沙龙第七期(上海站) 收起阅读 »

Deep Link——移动应用的变革

演讲嘉宾:张申竣 魔窗CTO  企业级 SaaS 服务,移动技术和大数据专家。 超 过 10 年服务世界知名科技企业以及国内知名数据监 测公司,曾领导开发了 MMA China 的第一版移动端 监测 SDK。 现带领魔窗技术团队研发魔窗 SDK、 魔窗 Sa...
继续阅读 »
演讲嘉宾:张申竣
魔窗CTO  企业级 SaaS 服务,移动技术和大数据专家。 超 过 10 年服务世界知名科技企业以及国内知名数据监 测公司,曾领导开发了 MMA China 的第一版移动端 监测 SDK。 现带领魔窗技术团队研发魔窗 SDK、 魔窗 SaaS 平台以及大数据计算平台的研发。
1.Deep Link的重要性及现状

为什么在没有 Deep Link 的情况下,在花费了大量研发成本后开发出的 App 的下载量始终很低。

2.Deep Link冰山之下的技术

是否只要实现了 URI Scheme 和路由跳转后,就能充分利用 Deep Link 提高用户转化率。

3.Deep Link平台化的技术要求

Deep Link 如何被发现,如何被管理,如何被监测。
 
讲师PPT下载↓↓↓
 
  收起阅读 »

场景电商运营成功案例分享

演讲嘉宾:苏然 北京妙创意科技联合创始人  4A 跨界场景电商创意人。陌陌、聚美优品、百合网、铁血网场景电商,IP 电商顾问。京东 UED 教练讲师。易观、优米专家讲师。摩根士丹利电商投资顾问。 1.星巴克的场景流量变现思考 2.场景延伸和场景器官 3.场景人...
继续阅读 »
演讲嘉宾:苏然
北京妙创意科技联合创始人  4A 跨界场景电商创意人。陌陌、聚美优品、百合网、铁血网场景电商,IP 电商顾问。京东 UED 教练讲师。易观、优米专家讲师。摩根士丹利电商投资顾问。
1.星巴克的场景流量变现思考
2.场景延伸和场景器官
3.场景人群下的碎片化转化
4.我所经历的陌陌场景电商实验
5.百合网我会这么做场景电商
6.铁血网全网场景电商实例
7.场景造物法则
 
讲师PPT下载↓↓↓
 
  收起阅读 »

深藏的金矿——社交大数据分析和挖掘

演讲嘉宾:马冀 环信大数据产品总监  70后互联网老炮儿,8年互联网游戏制作经验,曾就职人人网,百度在线,社交产品极客,网络媒体杯足球老将。 1.社交大数据清晰度,对产品的意义 2.成功社交模型对产品的影响和指导 3.社交如何为变现提供坚实基础   讲师P...
继续阅读 »
演讲嘉宾:马冀
环信大数据产品总监  70后互联网老炮儿,8年互联网游戏制作经验,曾就职人人网,百度在线,社交产品极客,网络媒体杯足球老将。
1.社交大数据清晰度,对产品的意义

2.成功社交模型对产品的影响和指导

3.社交如何为变现提供坚实基础
 
讲师PPT下载↓↓↓
 
  收起阅读 »

测拉菜单的demo,加上个点开菜单后对应不同类型的商品信息

 self.view.backgroundColor=[UIColor whiteColor];     self.navigationController.navigationBar.barTintColor = NavColor; ...
继续阅读 »
 self.view.backgroundColor=[UIColor whiteColor];

    self.navigationController.navigationBar.barTintColor = NavColor;




    self.navigationItem.title = @"主页";




    self.navigationController.navigationBar.translucent = YES;

    

    GoodsImage = [NSMutableArray array];

    PhoneArray = [NSMutableArray array];

    ComputerArray = [NSMutableArray array];

    LifeGoodsArray = [NSMutableArray array];

    qitaArray = [NSMutableArray array];

    

    UIButton *menuBtn = [UIButton buttonWithType:UIButtonTypeCustom];

    menuBtn.frame = CGRectMake(0,0,30,40);

    //[menuBtn setImage:[UIImage imageNamed:@"2.png"] forState:UIControlStateNormal];

    [menuBtn setBackgroundImage:[UIImage imageNamed:@"2.png"] forState:UIControlStateNormal];

    [menuBtn addTarget:self action:@selector(openOrCloseLeftList) forControlEvents:UIControlEventTouchUpInside];

    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:menuBtn];

    SpeciesArray=@[@"手机数码",@"家具家电",@"日用百货",@"其他二手"];

   

    //左侧是tableview显示页面

    TableView = [[UITableView alloc]initWithFrame:CGRect1(0, 0, 120, 667-104) style:UITableViewStylePlain];

    TableView.delegate = self;

    TableView.dataSource = self;

    TableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    TableView.rowHeight = 70*SCALE1;

    [self.view addSubview:TableView];

    
 

    //右边是对应的collection对应的显示页面

    collection = [[UICollectionView alloc]initWithFrame:CGRect1(130, 80, 205, 563) collectionViewLayout:[[UICollectionViewFlowLayout alloc]init]];

    [collection registerClass:[MyCollectionViewCell class] forCellWithReuseIdentifier:@"cell"];

    collection.dataSource = self;

    collection.delegate  = self;

    collection.backgroundColor = [UIColor whiteColor];

    [self.view addSubview:collection];

    




}

//测拉菜单的实现开启

- (void) openOrCloseLeftList

{

    

    AppDelegate *tempAppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    

    if (tempAppDelegate.leftslidevc.closed)

    {

        [tempAppDelegate.leftslidevc openLeftView];

    }

    else

    {

        [tempAppDelegate.leftslidevc closeLeftView];

    }

}




/************tableView行数************/

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

    return SpeciesArray.count;

}

/************tableViewcell添加*********************/

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    static NSString *inder = @"cell";

    MainPageTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:inder];

    if (cell ==nil) {

        cell = [[MainPageTableViewCell alloc]initWithStyle:1 reuseIdentifier:inder];

    }

    cell.textLabel.text=SpeciesArray[indexPath.row];

   

    return  cell;

}

/****************tableview选中*********************/

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

    // [tableView deselectRowAtIndexPath:indexPath animated:YES];

    if (indexPath.row ==0)

    {

        self.navigationItem.title = @"手机数码";

        GoodsImage =[NSMutableArray arrayWithObjects:@"苹果皮",@"三星",@"华为",nil];

        

        [collection reloadData];

    }

    if (indexPath.row ==1)

    {

        self.navigationItem.title = @"家具家电";

        GoodsImage = [NSMutableArray arrayWithObjects:@"电视",@"冰箱" ,nil];

        [collection reloadData];

    }

    if (indexPath.row ==2)

    {

        self.navigationItem.title = @"日用百货";

        GoodsImage = [NSMutableArray arrayWithObjects:@"毛巾",@"脸盆" ,nil];

        [collection reloadData];

            }

    if (indexPath.row ==3)

    {

        self.navigationItem.title = @"其他二手";

        GoodsImage = [NSMutableArray arrayWithObjects:@"牙刷",@"奔驰" ,nil];

        [collection reloadData];

        

    }

    

}



  • 屏幕快照_2016-03-25_下午5.54_.07_.png



    屏幕快照_2016-03-25_下午5.54_.17_.png



收起阅读 »

iOS如何基于3.0SDK集成单聊界面

1.首先到环信官网下载3.0SDK的demo 网址:http://www.easemob.com/download (IM 3.0.1 下的最新SDK下载就是demo) 2.然后将demo中的SDK加入到你的工程中(SDK的文件名是 HyphenateSDK...
继续阅读 »
1.首先到环信官网下载3.0SDK的demo 网址:http://www.easemob.com/download (IM 3.0.1 下的最新SDK下载就是demo)

2.然后将demo中的SDK加入到你的工程中(SDK的文件名是 HyphenateSDK),SDK文件中有两个.a包,一个是带实时通话功能,一个是不带的,选其中一个,另一个删除掉。 具体看链接如何添加SDK以及SDK的依赖库:http://docs.easemob.com/doku.php?id=im:300iosclientintegration:20iossdkimport 

3. 添加完SDK之后,添加聊天页面,环信demo中UI的部分都封装在了EaseUI文件中(具体是聊天页面,回话列表界面,联系人界面),找到环信 demo中的EaseUI文件。将EaseUI内部的EaseUI,以及EaseUIResource里的Resource,以及export文件 --->resource文件-->EaseUIResource.bundle,将这3个文件加到你的工程中,编译的过程会报错,下面是避 免报错的解决方法(还有就是会遇到三方库重复的报错,报错会提示你是哪个三方重复,看名称和路径自己删除一个)。然后先找到EaseUI- Prefix.pch,将其中的 #define NSEaseLocalizedString(key, comment) [[NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"EaseUIResource" withExtension:@"bundle"]] localizedStringForKey:(key) value:@"" table:nil] 这段代码拷贝到自己的pch文件下, 在自己pch文件中所有代码的首尾加上#ifdef __OBJC__和#endif,具体看demo中的pch文件,然后再将NSObject+EaseMob这个类删除了,全局搜索就能搜索到。
然后将SDK的头文件引入到你的pch文件中,如果是用的带实时通话功能的SDK就引入 #import "EMSDKFull.h"  如果不带实时通话功能的引入 #import "EMSDK.h",同时在引入 #import "EaseUI.h"(UI的头文件)

4.工程编译成功后,在你的appdelegate,写上初始化环信appkey,以及登录环信服务器的方法:http://docs.easemob.com/doku.php?id=im:300iosclientintegration:30iossdkbasic (收发消息是根据环信ID,客户端一定要写登录环信服务器的方法,这个环信ID就是你环信管理后台应用下的IM用户)。然后自己可以写一个按钮,在按钮的点击事件中,跳转到聊天页面,方法如下:
EaseMessageViewController *message = [[EaseMessageViewController alloc] initWithConversationChatter:"这里填接受消息方的环信ID" conversationType:EMConversationTypeChat]; (EMConversationTypeChat是单聊类型)
这里用到的聊天页面就是EaseUI中的EaseMessageViewController.m聊天页面,自己引一下头文件

5.在聊天界面点击表情会崩的解决办法,可以在 在EaseMessageViewController.m类中的 viewdidload中的最后加上    EaseEmotionManager *manager= [[EaseEmotionManager alloc] initWithType:EMEmotionDefault emotionRow:3 emotionCol:7 emotions:[EaseEmoji allEmoji]];
[self.faceView setEmotionManagers:@[manager]];来进行处理。

6.在聊天界面收发消息,退出页面后再重新进入会看不到之前消息的处理方法,也是在EaseMessageViewController.m类中的 viewdidload中 调用[self tableViewDidTriggerHeaderRefresh];就可以了。
环信demo中用到的聊天类是ChatViewController.m是继承于EaseMessageViewController.m类的,具体的可以去看下(如果以后使用ChatViewController类的话,把上面5,6中添加的代码都注释掉,要不会出现问题)

7.以上步骤基本集成单聊的聊天页面,如果遇到了其他问题,可以到环信官网联系技术支持。 收起阅读 »

环信直播课堂第四期--消息撤回 和 阅后即焚

日期与时间:2016年3月24日15:00 持续时间:半小时 描述:聊天的时候不小心说错了话,还是发错了人,真的有后悔药吗? 环信最新版本sdk 新增阅后即焚,消息撤回功能,让聊天更加有趣,打造社交新玩法! 本期将由环信Android工程师--一鸣 ,...
继续阅读 »
日期与时间:2016年3月24日15:00

持续时间:半小时

描述:聊天的时候不小心说错了话,还是发错了人,真的有后悔药吗?

环信最新版本sdk 新增阅后即焚,消息撤回功能,让聊天更加有趣,打造社交新玩法!

本期将由环信Android工程师--一鸣 ,他将给大家讲解消息撤回与阅后即焚的原理,并现场手把手教你如何实现消息撤回与阅后即焚!

直播观看地址:http://www.imgeek.org/video/
 
 
稍后直播完会把视频和demo更新在本篇文章后面!
 
视频回放:http://www.imgeek.org/video/20
  收起阅读 »

环信高级客服培训经理给O2O标杆用户58到家做SaaS客服培训,2天6场,欢迎围观

58到家客服总监王辉表示:"接入环信移动客服以后解决了58到家业务量暴增导致客服资源严重不足的问题,同时环信移动客服支持全渠道接入把服务渠道统一,把客户引流到线客服上,提供了一站式的客户服务体验解决方案。同时环信的精准用户画像功能帮助58到家实现精准...
继续阅读 »

ea790d9djw1f27r0tldmvj20m80godi9.jpg




ea790d9djw1f27r0tub0mj20go0m8wfw.jpg


58到家客服总监王辉表示:"接入环信移动客服以后解决了58到家业务量暴增导致客服资源严重不足的问题,同时环信移动客服支持全渠道接入把服务渠道统一,把客户引流到线客服上,提供了一站式的客户服务体验解决方案。同时环信的精准用户画像功能帮助58到家实现精准的反向营销,成单率高且用户不反感。把客服部门角色重新定义,实现从成本中心向盈利和营销中心变革。"
  收起阅读 »

环信联合创始人:App主流反垃圾服务难点和技术实现全解析

在近期做的一项2015年App统计中,以微信为首的社交类App占据了排行榜第一位,新闻类App位居第二,可见人们对社交的需求大过了获取新闻资讯的需求。在马斯洛需求层次理论中,社交需求仅次于生理需求和安全需求,位居第三,可见社交的重要性,恐怕这也是流行的那句话“...
继续阅读 »
在近期做的一项2015年App统计中,以微信为首的社交类App占据了排行榜第一位,新闻类App位居第二,可见人们对社交的需求大过了获取新闻资讯的需求。在马斯洛需求层次理论中,社交需求仅次于生理需求和安全需求,位居第三,可见社交的重要性,恐怕这也是流行的那句话“无社交、不App”的真实本源。



3e40001293ea663b391.jpg


环信联合创始人马晓宇



App开发者想方设法在App里集成IM功能,鼓励用户沟通、互动、分享。但在享受用户量迅速上涨的同时,却也面临着不小的麻烦——垃圾信息。用户数量上来后,各种广告、钓鱼、色情等垃圾信息也不请自来。影响用户体验不说,一旦涉及到政治类信息,甚至会给App带来下架的风险,这实际上已经有过前车之鉴。即使是过百万用户量,由于没有即时采取措施遏制垃圾信息泛滥,最终导致被用户抛弃的App也已是不乏其数了。有人对此总结了一句话:“始于约炮,发展于炫耀,终结于代购”。

App植入IM功能是大势所需,关键在于,如何有效过滤各种垃圾消息,让App满足用户真正的社交需求。

一,垃圾消息分类与伪装术

“知己知彼,百战不殆”,我们先了解一下当前IM软件上垃圾信息的特点。

从内容上来看,垃圾信息通常分成这么几类:


广告类:用于推销商品、网站、店铺等,例如减肥药、化妆品、四六级答案等;


324000a2d1af4a20854.jpg


钓鱼类:通过发布一些虚假信息,诱使人们点击或是回复,从而一步步陷入骗局;

326000a2b6adf299b70.jpg


色情类:用于色情交易或事色情网站宣传等;

327000a2a7f11dc1beb.jpg


SEO类:通过让用户点击提高小网站的搜索排名;

政治类:例如境外势力支持下的对重大事件的负面舆论。这类信息风险极大,一旦广为扩散极有可能造成App被下架。



对于简单的垃圾信息,管理员只要设置好关键字过滤即可。但发送者为了逃避拦截,通常都会对垃圾信息进行伪装,几种典型的伪装术:

不相关内容+垃圾内容。例如在四、六级或考研季来临时,常常会收到这种垃圾消息:“白日依山尽,黄河入海流。考研答案,联系QQ******”。前半句“白日依山尽,黄河入海流”即为干扰项。

添加随机噪声,包括文字变换,随机字母,不同字体等。例如,“QQ群”改写成“藤训裙”、“叩叩裙”等,或者同时使用符号、文字变换:



3e400012a5af7968579.jpg


使用多媒体技术,例如使用图片或者音视频来封装广告。



二、垃圾信息检测技术

从垃圾消息的伪装技术来看,仅依靠传统关键字过滤显然是无效的,必须另辟蹊径。目前在学术界和业界的几个研究方向:

1. antispam_based_user_keyword,基于敏感词的模糊匹配技术。

这项技术的核心是实用双数组字典树算法进行关键词的查询。首先服务会对输入的内容先进行简繁体、全半角、火星文、同义词、特殊字符过滤等一系列预处理。然后进行高效的关键词查询,主要功能点:

基于基本词库进行过滤(如政治、色情、暴力等),同时支持用户自定义词库;

大小写模糊匹配;

将需要屏蔽的关键词替换为通配符(如星号*);

2. antispam_based_user_behavior,基于用户行为检测

基于用户行为的反垃圾算法的核心是使用聚类算法对用户行为进行识别,识别维度包括行为要素(如发送者、发送时间、内容类型等等)和行为关系。所谓行为关系,是指用户的社交属性,例如消息发送频率,时间间隔,消息响应率等等。通过高效的聚类算法可实现:

单用户行为识别:如单一用户发送大量的垃圾信息;

多用户行为识别:大量马甲发送大量的垃圾信息;

识别图片、语音、视频等多媒体类型的垃圾信息。

3. antispam_based_user_content,基于用户内容的识别

基于内容的反垃圾服务的核心是构建分类器模型,采用自然语言处理技术(NLP),对内容进行语义分析,利用持续的机器学习与分类器训练,使机器能够理解语句的真实含义。该技术可实现:

经过内容伪装的垃圾信息。例如加入了随机干扰内容的垃圾信息;

局部热点聚类并拦截。通过聚类算法可识别一些特定范围内大量传播的垃圾信息,通过生产规则遏止这些信息进一步扩散。

国内市场上为APP提供即时通讯能力的厂商中,目前市场占有率第一的环信率先将上述技术集成至其IM产品中,为APP提供反垃圾信息服务。可以在APP中实现几种垃圾信息的拦截:

单一用户行为,如发送大量重复的“你好”、“hi”、可爱表情等打招呼行为,或冒充官网人员发送恶意链接、营销广告、色情信息等,这种类型的垃圾信息可基于用户行为检测技术+内容检测技术,同时借助NLP及训练模型对内容进行识别和拦截,紧急情况下可使用敏感词进行拦截。

多用户行为。例如垃圾信息发送者拥有马甲库,切换不同马甲来进行垃圾信息发送,甚至展开小型DDoS攻击,此类可基于全局用户行为检测技术,以及全局消息内容聚合进行识别和拦截;

高级形式的垃圾信息。如“目的内容+随机干扰”,这种形式的垃圾信息可通过局部聚类检测技术对热词进行识别,同时结合语义分析技术进行识别拦截;

对于内容完全随机的垃圾信息,可以采用发送频率限制技术增加发送者的成本,让他们趋于正常用户的行为,削减影响。



3e50001269315379692.jpg


环信反垃圾技术流程图



从在APP中实际部署的效果来看是非常明显的,过滤率基本在99%左右。下图是在环信产品后台看到的实际拦截效果,分别是基于行为的拦截和基于内容的拦截。



3e50001282a1eeb5512.jpg


基于行为的垃圾信息拦截




3e50001283e4e15593e.jpg


基于用户内容的垃圾信息拦截


反垃圾信息服务是一项“长期斗争”,除了技术手段外,还可以采取一些管理手段。例如,注册时要求绑定手机号,而非邮箱号。设置举报机制和拉黑功能等等,从而提升垃圾消息发送者的成本。通过技术手段,再辅以管理手段,必将遏止App中的垃圾消息,打造一个健康的网络社交环境。


作者简介:

马晓宇,环信联合创始人,拥有17年研发经验,先后任职于Symbian、Nokia,带领团队主持开发了数款Nokia手机的操作系统及内核软件,手机操作系统,手机应用软件专家。


收起阅读 »

【转帖】App测试中的那些不可遗忘的基础知识

App测试是一项批判性的工作,目的就是找出软件中的缺陷。这里暂时不去深究为什么要进行App测试,以及App测试带来的好处。只介绍App测试中一些基本的测试方法。根据是否查看代码程序分为黑盒测试和白盒测试;根据是否运行软件又可分为静态测试和动态测试。 黑盒测试:...
继续阅读 »


App测试是一项批判性的工作,目的就是找出软件中的缺陷。这里暂时不去深究为什么要进行App测试,以及App测试带来的好处。只介绍App测试中一些基本的测试方法。根据是否查看代码程序分为黑盒测试和白盒测试;根据是否运行软件又可分为静态测试和动态测试。
黑盒测试:又叫功能测试或行为测试,只需考虑各个功能,不需要考虑整个软件的内部结构及代码。
白盒测试:访问代码,通过检查代码的线索来协助测试。
静态测试:测试软件不运行的部分,只是检查和审核。
动态测试:使用和运行软件进行测试。
1、静态黑盒测试:检查产品说明书,并在软件编写之前找出问题
· 对产品说明书或软件需求报告进行高级审查:
(1)站在一个设计者的角度进行审查,找出根本性问题或遗漏之处
(2)站在客户(使用者)的角度来审查,因为软件质量的定义是满足客户的需求
(3)研究现有的标准和规范,可以是公司习惯用语和约定、行业要求、GUI、安全标准;检查所用标准是否正确、遗漏,是否与标准和规范相抵触
(4)审查和测试类似软件,检查它的规模、复杂性、测试性、质量和可靠性、安全性
· 对产品说明书或软件需求报告进行低层次测试:
一份优秀的产品说明书或者需求报告:必须是完整、准确、精确(不含糊、清晰)、一致、贴切、合理、代码无关、可测试性
2、动态黑盒测试:在不了解软件如何工作的前提下进行测试
两种基本方法:通过性测试和失效性测试
选择测试用例:等价类划分:把软件具有相似输入,相似输出,相似操作的分在一组。一个等价类或等价类划分是指测试相同目标或者暴露相同软件缺陷的一组测试用例。
     等价类划分的目标:把可能的测试用例集缩减到可控制且仍然足以测试软件的小范围内。
(1)测试数据
通过性测试:
a) 边界条件:软件运行在计划操作界限的边界情况。测试边界包括测试临近边界的有效数据、测试最后一个可能有效的数据、测试刚超过边界的无效数据。
b)次边界条件:典型的次边界条件:2的幂、ASCII表
c)测试默认、空白、空值、零值和无这些数据
失效性测试:
d)测试非法、错误、不正确和垃圾数据
(2)测试状态
软件状态:软件当前所处的条件或者模式。

状态测试:测试程序的状态及其转换。

步骤:
1)建立状态转换图
2)减少要测试的状态及其转换的数量
    a. 每一种状态至少访问一次

    b. 测试状态之间最不常用的分支

    c. 测试所有错误状态及其返回值

    d. 测试随机状态转换

    e. 测试看起来是最常见和普遍的状态转换
** 通过性状态测试**:审查软件,描绘状态,尝试各种合法可能性,确认状态及其转换正常。
失效性状态测试:竞争条件、重复(检查内存泄漏)、压迫(在不够理想条件下运行:内存小,磁盘空间少...尽量限制软件的必要条件)、重负(提供条件任其发挥)。
3、静态白盒测试:在不执行软件的条件下有条理地仔细审查软件设计、体系结构和代码,从而找出软件缺陷的过程
(1) 编码标准和规范:可靠性、可读性/可维护性、可移植性
(2)通用代码审查清单:
 a. 数据引用错误  ->   缓存区溢出

 b. 数据声明错误  <-  不正确地声明和使用变量和常量

   c. 计算错误

 d. 比较错误    <-  边界条件问题

 e. 控制流程错误  <-  循环等控制结构未按预期方式工作,由计算或比较错误间接引起

 f. 子程序参数错误 <-  子程序不正确地传递数据

   g. 输入/输出错误

 h. 其他检查    ->  编码、可移植、兼容
4、动态白盒测试:结构化测试,检查代码并观察运行状况,利用查找代码功能和实现方式得到的信息来确定哪些需要测试,哪些不需要,如何开展测试,包括如下内容:
(1) 直接测试底层函数过程,子程序和库(API)
(2) 以完整程序的方式从顶层测试软件,根据对软件运行的了解调整测试用例
(3)从软件获得读取变量和状态信息的访问权,确定测试与预期结果是否相符,强制软件以正常测试难以实现的方式运行
(4) 估算执行测试时命中的代码量和具体代码,调整测试,去掉多余的测试用例,补充遗漏的用例
动态白盒测试与调试的区别:都包括处理软件缺陷和查看代码的过程,但是它们的目标不同:测试的目标是寻找软件缺陷;调试的目标是修复缺陷
测试方法:分段测试(单元测试和集成测试)、数据覆盖、代码覆盖
数据覆盖:
数据流覆盖,在软件中完全跟踪一批数据。

次边界:与动态黑盒测试类似。

公式和等式:类似除法运算中,考虑除数为0的情况。

错误强制:迫使软件中的所有错误提示信息显示出来。
代码覆盖:测试程序的状态以及程序的流程,设法进入和退出每一个模块,执行每一行代码,进入软件每一条逻辑和决策分支
代码覆盖包括:程序语句和代码行覆盖、分支覆盖(比如判断语句中if分支和else分支)、条件覆盖(一个条件中可能包含几个子条件,要覆盖每一个子条件及它们的组合)。
App测试其实就是在用户之前使用和运行软件,尽早找出软件中存在缺陷。我们不可能对软件进行完全测试,只可能在测试有限的用例后使得软件仍然存在bug的概率尽可能小。以上所述仅仅只是一点皮毛,App测试覆盖的知识面很广,需要学习的还有很多!!
收起阅读 »

快讯! 环信sdk红包正式发布了。让所有的app都有属于自己的红包!

SDK下载 : http://www.easemob.com/download   注意红包功能现仅用于环信iOS, Android SDK 2.0, 3.0SDK暂未发布,请与我一起期待   文档已经包含在SDK包里,下载后可见。     快速体验...
继续阅读 »

QQ截图20160322232623.jpg


SDK下载http://www.easemob.com/download  
注意红包功能现仅用于环信iOS, Android SDK 2.0, 3.0SDK暂未发布,请与我一起期待
 
文档已经包含在SDK包里,下载后可见。
 

QQ截图20160322232525.jpg


 
快速体验带红包功能的demo 
 

QQ截图20160322233115.jpg



one more thing,
 
同期发布的SDK中一并增加了 阅后即焚,消息撤回的功能,有待你的发现哦。 
  收起阅读 »

本周末,中国开发者技术生态联盟邀你一同谈“技术”

云计算、VR、H5、即时通讯……本周末(3月27日),中国开发者技术生态联盟系列沙龙将走进杭州东部软件园。 如果你是一名不折不扣的“技术帝”并且想要扩大社群圈提升自我、充实技术和行业经验;如果你是一名与电商、零售、金融、互联网行业相关的创业者,想要了解大...
继续阅读 »


7338351_513325.jpg


云计算、VR、H5、即时通讯……本周末(3月27日),中国开发者技术生态联盟系列沙龙将走进杭州东部软件园。

如果你是一名不折不扣的“技术帝”并且想要扩大社群圈提升自我、充实技术和行业经验;如果你是一名与电商、零售、金融、互联网行业相关的创业者,想要了解大数据、云计算在实际行业中的实际应用,寻找创业技术合伙人;如果你是项目需求方、投资方、解决方案服务商,了解和认识新技术、新思想、发现和挖掘新的潜在独角兽,现场沟通与交流丰富自己的信息渠道。那一定不要错过这场技术界的“盛宴”。

据本次活动主办方崔牛会和中国开发者技术生态联盟介绍,本次活动将邀请到WeX5开发工具首席技术运营官王洁、环信技术经理杜超、UCloud高级架构师林超、极企科技联合创始人孙冰等行业大咖为与会的“技术宅”们带来“H5应用如何做到极速秒开”、“让APP快速实现即时通讯”、“资本如何看待开发者项目”等精彩分享。

如果你对此次活动感兴趣,如果你想提升自我,那就赶紧点击进入报名通道了解详情吧。咨询热线:15168266111 收起阅读 »

Ease3.0SDK 与EaseUI3.0 集成汇总 (卡壳的朋友们可以看看,已顺利集成成功)

这两天 因为公司项目要 集成环信SDK ,所以对环信SDK了解了点。从SDK 集成到 EaseUI 集成也是吃了很多苦头遇到很多问题。谨以此篇文章来总结一下,希望以后的朋友们少走些弯路。   首先 ,SDK 集成 ,很多人集成用cocoapods 来集成。一...
继续阅读 »
这两天 因为公司项目要 集成环信SDK ,所以对环信SDK了解了点。从SDK 集成到 EaseUI 集成也是吃了很多苦头遇到很多问题。谨以此篇文章来总结一下,希望以后的朋友们少走些弯路。
  首先 ,SDK 集成 ,很多人集成用cocoapods 来集成。一开始 我也是用的Cocoapods.但是出了很多问题。捯饬了很长时间也没有弄出个所以然,所以果断放弃了。目前状况,建议朋友们不要用Cocoapods来集成 。
  在SDK 集成的时候 要注意这样几点:
      1、注意一下SDK 下的 lib文件夹 因为 里边有两个SDK 一个是有实时语音的 一个是没有实时语音的 。你用哪个就删掉另一个。
       2、 注意Build settings下的 bitcode 要设置为NO ,因为 暂时 环信SDK 不支持bitcode编码。
      3、注意Build settings 下的other linker flags 这里 如果你设置了-ObjC 就不要设置 文档里-force_load 路径
           关键是要注意other linker flags下的其他设置。我之前是因为 里边 cocoapods 加载了一个-all_load字段 我删除这个 ,就解决问题了 。我相信 有很多朋友 也有这个字段 删掉就可以了 。
总体来讲 SDK 集成 成功与否 ,只需要看这三点就够了。
  下面说下 EaseUI集成 。我按照视频走到建完.pch文件。发现出现了8个错误 。这里 我去3.0EaseUI Demo 里 搜了下 .pch文件 发现有两个 居然 然后 参考了一下 发现有很多错误 具体 怎么试的 就不说了 直接上代码吧 .pch代码如下 :
 
#import <Availability.h>




#ifndef __IPHONE_3_0

#warning "This project uses features only available in iOS SDK 3.0 and later."

#endif




#ifdef __OBJC__

#import <UIKit/UIKit.h>

#import <Foundation/Foundation.h>

#import "EMSDKFull.h"

#import "EaseUI.h"

#define NSEaseLocalizedString(key, comment) [[NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"EaseUIResource" withExtension:@"bundle"]] localizedStringForKey:(key) value:@"" table:nil]

#define DEMO_CALL 1




#endif
以上就是 新建的PrefixHeader.pch中的代码 。
建完这个 你会发现 错误变成了一个。EaseMob 引用头文件not find  直接删掉这个头文件引用 。你会发现 又有了一个新的错误 NSObject +EaseMob 这个类中 出现了N个错误 。这里 不管它  直接删掉这个类 这个类是P作用都没有的 (我是挨个对比3.0Demo 的类 才发现 Demo 中 根本没有这个类)
做完了这步  。运行 ,恭喜你 集成环信3.0SDK,环信EaseUI 成功!!!! 
  收起阅读 »

【有奖调查】环信编程大赛奖品建议征集

  编程大赛开赛距今已有半月,在这半个月时间里,感谢为此奋斗的每位小伙伴。   今天已经公布了决赛提交地址,不知道各位小伙伴们的项目是否已经完成?   还没写完的小伙伴也不要着急,时间还很充裕,项目提交截止是4月15日。刚来的小伙伴现在报名还来得及^_^^_^...
继续阅读 »

QQ截图20160310114154.jpg


 
编程大赛开赛距今已有半月,在这半个月时间里,感谢为此奋斗的每位小伙伴。
 
今天已经公布了决赛提交地址,不知道各位小伙伴们的项目是否已经完成?
 
还没写完的小伙伴也不要着急,时间还很充裕,项目提交截止是4月15日。刚来的小伙伴现在报名还来得及^_^^_^^_^

今天刚公布就已收到数十份项目,写的都很不错(这可怎么评呀o(╯□╰)o),这里就不一一表扬了!
 
这里给大家分享一个数据



mmexport1457582444311.jpg



大赛开赛前一周,每天近一百的报名量


 
幸福与烦恼共存着



QQ截图20160321183348.jpg


编程大赛已公布奖品 


 
大奖有限的几个,怎么能辜负了其他小伙伴们呢?




Screenshot_2016-03-21-17-48-59-551_QQ.png


收集群里小伙伴建议


 
看来大家对技术书籍比较在意,感谢“华章图书”赞助了若干技术书籍 




QQ截图20160321182032.jpg


部分技术书籍(书籍还在整理,图片有些模糊,请点击原图查看)


 
不知道各位小伙伴们对大赛奖品还有什么中意的呢?
请在下方直接留言评论,我们将邀请您来到颁奖现场!(颁奖典礼除了已经公布的大奖,只要报名参赛的小伙伴到场均有神秘礼品赠送哦^_^^_^^_^)  收起阅读 »

我为什么给文章付费

图文无关 1.我有一种习惯。 阅读完一篇文章,如果从中得到了某种启发,或是单纯地很喜欢这篇文章,我会为其付费。(很多平台称这为打赏,但我并不喜欢这个透露着狂傲自大名词。任何一种创造都应该值得被尊重。) 讲真,我以为支付宝等在线支付的便捷手段出现,会使为...
继续阅读 »



1056883-8f626fe10c0515f2.jpg


图文无关



1.我有一种习惯。

阅读完一篇文章,如果从中得到了某种启发,或是单纯地很喜欢这篇文章,我会为其付费。(很多平台称这为打赏,但我并不喜欢这个透露着狂傲自大名词。任何一种创造都应该值得被尊重。)

讲真,我以为支付宝等在线支付的便捷手段出现,会使为创造付费会成为一种习惯。但是,我错了。


2.这个想法的出现,有两个原因。

一是前两天我读了梁欢的随笔集《我说的不一定对》,提到一个故事。他和的创业团队做了一个游戏,在国外的付费软件下载榜获得不错的成绩,口碑也很好。但是,当这个游戏传到国内的时候,一个网站就传出了它的破解版安装包,造成他们的巨大经济损失无法挽回,更令人惋惜的是使一个创业团队就此解散。

作为一个致力于游戏开发的成长版程序员,这个经历对我的触动非常大。

另一个原因是,前天,我给简书的一篇文章付费后,收到作者的一条短短的简信“太感谢了!!”。我觉得奇怪。难道是付费的人太少了,以至于收到一个读者的阅读费用会如此激动?

当然,亦可能是作者单纯地觉得这是读者对自己的一个鼓励,内心的激动难免,与钱无关。

总之,这使我开始思考一个问题。为什么我们都不习惯为无形的知识和创造付费?


3.举一个例子。

在十几年前,我们想要在家看电影,会先攒着一笔钱咬着牙买一台碟机和各种DVD,对着屏幕心满意足。但是,如今各种视频门户网站的影视众多,人们却开始变得吝啬。

“woc就看这么个破电影还要付费?!”

“看个剧还要充会员,你咋不上天?!”

资源极大的丰富,使人们越来越习惯于双眼一闭、两手一伸地索取,付费像是一种愚蠢的行为——你傻啊,这东西在某某网站可以免费下载,还去花那冤枉钱!

这种现象折射的一种心理便是,无形知识与创造不是一种宝贵的东西。我可以免费获得,为什么还要为此付费?


梁欢在《我说的不一定对》一书中,用他这个创业的经历做了一个有趣的比较。

有一个团队做出了一款付费游戏,但是不就一个网站就将它破解了,免费供人下载,瞬间下载量飙升。团队做出的游戏甚至没有获得开发的费用,解散了。

你会为此而愤怒吗?

先别急着回答。

又有一个水果商店,里面放着许多西瓜。但是某天有人将商店的锁撬开了,一时间人潮汹涌,西瓜就这样被抢光了。水果商店因此破产。

你感到愤怒吗?

如果答案是肯定的,那么不防再想一下。

你对谁而愤怒?撬锁的人,还是抢西瓜的人?

自始至终,人们没有将无形的知识和创造视为一种值得被购买的商品。


4这使我想起了在知乎上挺热门的问题

“设计师觉得最悲哀的事或者最悲哀的时刻是什么?”,热门回答多是某亲戚或某朋友请自己做一个logo或是设计某个东西,拿到成品之后没有支付酬劳或是表露感激,更有甚者觉得“不就是随便画几笔吗居然还要收钱怎么这么矫情”。

事实上,你理所当然索取着的免费产品,是别人花着你无法想象的时间与精力去学习的结果。

这些你都一无所知。又或许你根本不想知道。

因为,这和自己又有什么关系呢?
 
“没有关系”是一种很可怕的东西。当你拒绝接受对另一个领域的知识时,偏见就会由此产生了。

“你文章写得那么好,帮我写个广告宣传词吧,不用很长的……什么?还要收钱?(不就几个破字值那么多钱!)”

“你是画画的是吧,帮我设计个logo吧……就是画几笔的东西你收什么钱啊真是!又不是外人。(就是外人要收钱才来找你的嘛。)”

呵呵哒。

我会说,要不你自己来试一下?

这时他们又会说:“要是我会就不用找你啦!”

呵呵呵呵哒。

所以亲爱的,有时间的话,不如多去了解下不同领域的知识吧。


另,

看到喜欢的文章就选择为其“付费”吧´_>`
作者:Leoipaang 收起阅读 »

【美团外卖首页效果】三行代码轻松集成

下面这个界面有没有觉得很眼熟。打开你手里的App仔细观察,你会发现很多都有实现这个功能。比如美团外卖的首页模块,新浪微博的个人详情页面。要怎么样才能快速的实现这个功能呢!那下面由笔者来告诉你如何三行代码,集成这个功能。。。 原理介绍: 要想...
继续阅读 »
下面这个界面有没有觉得很眼熟。打开你手里的App仔细观察,你会发现很多都有实现这个功能。比如美团外卖的首页模块,新浪微博的个人详情页面。要怎么样才能快速的实现这个功能呢!那下面由笔者来告诉你如何三行代码,集成这个功能。。。


1.gif


原理介绍:
要想把一个view设计成透明的我们一下子就会想到两种方案,设置view的alpha值为0,或者设置view的backgroundColor为clearColor.但是UINavigationBar是一个比较特殊的视图,它是没有alpha属性的,那我们可以设置opaque(不透明度)为NO,上代码试一试.
//方案一:不透明度为NO
navigationBar.opaque = NO;
//方案二:背景颜色为clearColor
navigationBar.backgroudcolor = [UIColor clearColor];
结果,然并卵,完全没用。这时候该怎么办呢?这时候我们就得来看看UINavigationBar这个视图的结构了,如下图。


4.png


现在笔者教大家一个小技巧。请看下面代码:
- (void)clearNavBar{

//设置一张空的图片
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault];

//清除边框,设置一张空的图片
[self.navigationController.navigationBar setShadowImage:[[UIImage alloc]init]];
}
这时候再打开项目层次图,你会有惊人的发现

5.png


对比一下,你会发现只剩两层了。不要问为什么,这都是系统帮你做的。。。当你设置了背景图片的时候,就会出现这样的结果。

知道了上述的原理,这就好办了,现在只要监听,控制器内部的scrollView 的滚动,就可以实现导航条渐渐透明的效果了。
业务逻辑,功能实现其实都不是很难。但是也需要花费一些时间,笔者在这给大家分享一下自己写的一个分类。导入这个分类,你只需要调用两三个接口就可以实现这个功能了。
首先看一下分类提供的接口


3.png


分类介绍

我写的这个分类不仅可以在系统的UITableViewController 和UICollectionViewController中使用,(系统的只需调用分类中两个方法即可)。而且当你的UIViewController中有1个或多个可以垂直滚动的scrollView都可以使用。(需要告诉控制器需要监听哪个scrollView的滚动,即设置keyScrollView).
重要的是,这个分类的代码侵入性非常低,使用简单方便。当不需要这些功能的时候,你只需要注释掉两三行代码即可。
下面这个效果图是系统的UITableViewController,以下是效果图和代码


1.gif


代码:
 分类接口
#import <UIKit/UIKit.h>

@interface UIViewController (NavBarHidden)

@property (nonatomic,weak) UIScrollView * keyScrollView;

/** 清除默认导航条的背景设置 */
- (void)clearNavBar;

/** rate将决定颜色变化程度,值越大,颜色变化越明显,rate的取值范围是0.01 - 0.999999 isAlpha 决定导航条上的内容是否需要透明*/

- (void)scrollControlRate:(CGFloat)height colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue isNavBarItemAlpha:(BOOL)isAlpha;

@end


控制器代码

#import "TestViewController.h"
#import "UIViewController+NavBarHidden.h"

@implementation TestViewController

- (void)viewDidLoad{

[super viewDidLoad];

//清除默认导航条的背景颜色
[self clearNavBar];

//设置当有导航栏自动添加64的高度的属性为NO
self.automaticallyAdjustsScrollViewInsets = NO;

//设置tableView的头部视图
UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 0, 250)];
imageView.image = [UIImage imageNamed:@"1.jpg"];
self.tableView.tableHeaderView = imageView;

}


- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
//rate将决定颜色变化程度,值越大,颜色变化越明显,rate的取值范围是0.01 - 0.999999
[self scrollControlRate:0.5 colorWithRed:0.0 green:1.0 blue:0.0 isNavBarItemAlpha:YES];

}


2.gif


控制器代码如下
#import "TestCollectionController.h"
#import "UIViewController+NavBarHidden.h"

@interface TestCollectionController ()<UICollectionViewDataSource,UICollectionViewDelegate>

@property (nonatomic,weak) UICollectionView * collectionView;

@end

@implementation TestCollectionController

-(void)viewDidLoad{

[super viewDidLoad];

//1.清除默认导航条的背景颜色
[self clearNavBar];

//2设置当有导航栏自动添加64的高度的属性为NO
self.automaticallyAdjustsScrollViewInsets = NO;

//3.设置导航条内容
[self setUpNavBar];

//4.创建collectionView,初始化,并添加到self.view上
[self setUpCollectionView];

//5.告诉程序是根据哪个scrollView的滚动来控制状态栏的变化
self.keyScrollView = self.collectionView;

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
}
使用注意点,一定要在添加好collectionView,再设置keyScrollView,至于为什么,这个就不需要笔者解释了吧
滚动监听代码
#warning 监听滚动,调用框架接口
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

[self scrollControlRate:0.7 colorWithRed:1.0 green:0.0 blue:0.0 isNavBarItemAlpha:YES];
}
项目源码分享,希望大家喜欢,下载的时候顺便star一下,好人多福。https://github.com/newyeliang/HYNavBarHidden.git
  收起阅读 »

贪吃精灵小游戏demo

导读 下了班,闲着没事,写了两个小demo分享给大家练练手.一个通过简单动画完成的,另一个是绘图.你能1个小时写完俩个吗,在不参考源码的情况下,那说明你的动画和绘图掌握的很不错了.要是没能写出来,也不需要气馁,多敲敲你就掌握了. 下面这个是贪吃精灵小游戏dem...
继续阅读 »
导读
下了班,闲着没事,写了两个小demo分享给大家练练手.一个通过简单动画完成的,另一个是绘图.你能1个小时写完俩个吗,在不参考源码的情况下,那说明你的动画和绘图掌握的很不错了.要是没能写出来,也不需要气馁,多敲敲你就掌握了.
下面这个是贪吃精灵小游戏demo的效果图,这只是一共才200行代码的一个小demo哦.怎么样,看效果还挺不错吧!

源码链接https://github.com/newyeliang/EatDoudou欢迎star



1338042-539eac7da1334ac8.gif



·核心代码
//判断方向,往不同的方向移动
- (void)moveAnimation{

CGPoint center = self.eat.center;

switch (self.direction) {

case DirectionUp:{
self.eat.image = [UIImage imageNamed:@"3"];
[UIView animateWithDuration:0.05 animations:^{
self.eat.center = CGPointMake(center.x,center.y - self.speed);
}];
[self result];
}
break;

case DirectionLeft:{
self.eat.image = [UIImage imageNamed:@"2"];
[UIView animateWithDuration:0.05 animations:^{
self.eat.center = CGPointMake(center.x - self.speed,center.y );
}];
[self result];
}

break;
case DirectionDown:{
self.eat.image = [UIImage imageNamed:@"4"];
[UIView animateWithDuration:0.05 animations:^{
self.eat.center = CGPointMake(center.x,center.y + self.speed);
}];
[self result];
}
break;

case DirectionRight:{

self.eat.image = [UIImage imageNamed:@"1"];
[UIView animateWithDuration:0.05 animations:^{
self.eat.center = CGPointMake(center.x + self.speed,center.y );
}];
[self result];

}

break;

default:
break;
}
}

游戏结果判断代码
//计算游戏的分数,判断是否超出边界
- (void)result{

//eat 和 doudou相交,分数+100
if (CGRectIntersectsRect(self.eat.frame,self.doudou.frame)) {
//移除原来的豆豆
[self.doudou removeFromSuperview];

self.speed += 1;

self.scoreLabel.text = [NSString stringWithFormat:@"Score: %d",(int)(self.speed - 3) * 100];
//添加新的豆豆
self.doudou;
}

//超出边界,游戏结束
if ( CGRectGetMaxX(self.eat.frame) > self.backgroundView.bounds.size.width ||CGRectGetMaxY(self.eat.frame) > self.backgroundView.bounds.size.height||CGRectGetMinX(self.eat.frame) < 0||CGRectGetMinY(self.eat.frame) < 0) {

[self.timer invalidate];
[self.eat removeFromSuperview];

//game over 提示框
UILabel * deathTip = [[UILabel alloc]init];
deathTip.text = @"Game Over!!!";
deathTip.backgroundColor = [UIColor whiteColor];
[deathTip sizeToFit];
[self.backgroundView addSubview:deathTip];
deathTip.center = self.backgroundView.center;

[UIView animateWithDuration:4.0 animations:^{
deathTip.alpha = 0.0;
} completion:^(BOOL finished) {
[deathTip removeFromSuperview];
}];
}
}

 第二个是个太极图,看起来是不是很简单,你能画出来吗?打开Xcode试试吧!!!
没有任何业务逻辑,只需要你认真仔细的绘图,就OK了



1338042-cd92c1cffecf92e3.gif



·核心代码

源码链接https://github.com/newyeliang/TaiJIAnimation.git
//绘制太极图
- (void)drawImage:(CGSize)size{

float mid = size.width/2;

//1.开启图像上下文
UIGraphicsBeginImageContext(size);

//2.获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();

//3.绘图
//3.1 绘制黑色的半边
CGContextAddArc(ctx, mid, mid, mid, - M_PI_2, M_PI_2, 0);
CGContextAddArc(ctx, mid, mid + 0.5 * mid, mid * 0.5, M_PI_2, -M_PI_2, 1);
CGContextAddArc(ctx, mid, 0.5 * mid, mid * 0.5, M_PI_2, -M_PI_2, 0);
[[UIColor blackColor]set];
CGContextFillPath(ctx);
//3.2绘制白色的半边
CGContextAddArc(ctx, mid, mid, mid, - M_PI_2, M_PI_2, 1);
CGContextAddArc(ctx, mid, mid + 0.5 * mid, mid * 0.5, M_PI_2, -M_PI_2, 1);
CGContextAddArc(ctx, mid, 0.5 * mid, mid * 0.5, M_PI_2, -M_PI_2, 0);
[[UIColor whiteColor]set];
CGContextFillPath(ctx);

//3.3绘制白色的小圆
CGContextAddArc(ctx, mid, 0.5 * mid, 0.2 * mid, M_PI,- M_PI , 1);
CGContextFillPath(ctx);
//3.4绘制黑色的小圆
CGContextAddArc(ctx, mid, 1.5 * mid, 0.2 * mid, M_PI,- M_PI , 1);
[[UIColor blackColor]set];
CGContextFillPath(ctx);

//4.获取生成的图片
UIImage *image=UIGraphicsGetImageFromCurrentImageContext();
//5.显示生成的图片到imageview
self.backgroundColor = [UIColor colorWithPatternImage:image];
UIGraphicsEndImageContext();

}

  收起阅读 »

今天妹子直播的视频已上传

《环信直播第三期-Android自定义消息》视频已上传,快来一睹环信Android 妹子的风采吧。   观看地址http://community.easemob.com/video/19     把您想听的,想了解的通过下方评论留言告诉我们。对于环信直播有任何...
继续阅读 »
《环信直播第三期-Android自定义消息》视频已上传,快来一睹环信Android 妹子的风采吧。
 
观看地址http://community.easemob.com/video/19
 
 
把您想听的,想了解的通过下方评论留言告诉我们。对于环信直播有任何意见建议欢迎随时提出。
 
环信在线直播时间为每周四下午三点。每周四下午三点。每周四下午三点。 收起阅读 »

【高仿微信】基于环信SDK,Github 1,591 Star

 Social APP is popular all over the world, such as: Facebook, Line, Whatsapp, Kakao. You still worry about their own project socia...
继续阅读 »
 
Social APP is popular all over the world, such as: Facebook, Line, Whatsapp, Kakao.
You still worry about their own project social module? You also thinking WeChat function is how to achieve? Don't worry, come and look at this! This project is a high copy WeChat, and based on WeChat do to some experience and UI optimization.
 
  您还在为自己的项目社交模块烦恼吗? 您还在琢磨微信的功能是怎么实现的吗? 别愁了,快来这看看吧!
本项目为高仿微信,并在微信基础上对一些体验和UI上做了优化,IM聊天模块基于环信IM SDK,
实现功能有:
好友之间文字聊天,表情,视频通话,语音,语音电话,发送文件等。
群聊,从通讯录添加好友,二维码扫描添加好友,好友之间二维码扫描转账,
微信公众账号消息推送、朋友圈等

GitHub 代码下载,点击这里
APK下载地址,点击这里下载体验 
QQ交流群:476988719


104545g7hhsfyyfvy286dy.jpg




103552dw1v3x01h3z0xch1.jpg




103620y7hgouhzoho22676.jpg




103542r0az4zml4almk14h.jpg




103624z8z3wmvw3m44o487.jpg




103535ttzhsolx9zss889o.jpg




103532vjmmjzzcjk289rz8.jpg




105213d58q5v99z658of4o_(1).jpg

收起阅读 »

【转载】组合式测试:移动测试服务的发展趋势

由于国内移动设备和系统版本的碎片化,移动测试对于应用的质量保证变得至关重要,同时也催生了一批提供第三方测试服务的创业公司,BAT也都发布了自己的测试服务。但是,单一的测试服务往往不能完全满足开发者需求,测试服务的提供商也都在探索满足开发者需求的新方式。 自动...
继续阅读 »


由于国内移动设备和系统版本的碎片化,移动测试对于应用的质量保证变得至关重要,同时也催生了一批提供第三方测试服务的创业公司,BAT也都发布了自己的测试服务。但是,单一的测试服务往往不能完全满足开发者需求,测试服务的提供商也都在探索满足开发者需求的新方式。

自动化测试不能满足开发者需求

因为碎片化原因,开发者不可能手动测试所有的移动设备和系统版本,因此自动化测试对于移动测试来说是必须的。传统的第三方测试服务就是从这一点入手,以庞大 的云端真机测试为卖点,受到了开发者的认可。在社区里,自动化测试也最受关注,自动化测试的框架层出不穷,如何搭建自动化测试系统、编写测试脚本的内容最 受欢迎。一时间,自动化测试有一种彻底取代人工测试的势头。

但是,自动化测试实际上存在着一些问题,导致它并不实用,至少不能完全满足开发者的需求。据顾昕彪介绍,自动化测试的主要问题有:

新的功能很难做自动化测试。自动化测试大多数的作用是回归以前已经稳定下来的功能,对于一个新的功能,开发完以后要编写相应的测试用例,再进行自动化测试,这个时间比人工测试更长,因为人工测试可以直接开始测试,自动化测试有一个编写过程。

自动化测试需要有一些测试用例的积累,在版本大的迭代之后,很多测试用例可能就失效了,需要重新编写。因为移动应用发版很快,测试用例维护成本相对比较高。

自动化测试质量取决于编写测试用例的人的能力。有些时候测试用例能通过,但实际功能并不能用,要避免这点需要有丰富的测试经验和对移动开发的透彻的理解,而这对测试人员的要求太高了。

因此,自动化测试只能帮助开发者解决一部分兼容性问题,通常为了保证质量,开发者仍然需要采取其它测试手段。

施佳樑认为,人工测试之所以没有被市场所重视,是因为第三方人工测试服务的成本太高,如果能把人工测试的成本降下来,那么开发者还是会选择更有效的方式来满足测试需求,众测解决了这个问题。

众测成为测试工程师的业余职业

众包测试是在国外兴起的一种测试模式,通过将测试分配到多人手里,从而解决碎片化问题,并且避免自动化测试的一些弊端。

施佳樑介绍道,他们的众测平台拥有1500万用户,在这些用户中经过培训筛选,筛选出1000多个测试专家。这些测试专家已经能够像专业的测试人员一样,提供标准的测试报告来帮助开发者定位问题。

值得一提的是,这些测试专家里有些本来就是专业的测试人员,比如百度众测里会有百度的测试工程师利用业余时间来帮助别人做测试。事实上测试是一个需要经验和知识积累的职业,一般的众测人员只能模拟普通用户,效率较低,只有专业的测试人员才能高效的找出问题并提出报告。

通过众测这种模式,开发者能够以较低的成本请到多个较专业的测试人员进行测试,而测试工程师也能够在业余时间用职业技能赚些外快,这是一个双赢的事情。笔者认为这很可能成为众测模式的发展方向。

移动应用测试的未来:一体化服务

自动化测试和人工测试结合,能够得到一个较好的测试结果。但是,有一些情况没有包含在其中,比如应用crash,不借助辅助工具,要定位问题仍然比较困难,而crash上报服务正是为解决这个问题而生。

另外,对于应用性能,特别是不同网络条件下的应用表现的监测,使用应用性能管理服务(APM)更加有针对性。

要使用第三方服务来完全测试一个应用里可能出现的问题,开发者需要注册不同的服务,登录不同网站的管理后台来进行,这显然是很不方便的。而提供所有这些服务,同时将它们整合起来,将是移动测试服务未来一段时间的发展方向。

届时,开发者将只需登录一个网站,提交一次应用就可以得到一个多维度的、完整的测试报告,只有发展到这个阶段,移动测试服务才真正满足开发者的需求。



基于全球首创的对象识别技术,TestBird可以为客户提供深入到移动APP&游戏内部所有功能的深度解析能力。通过自助功能测试、远程真机调试、真机兼容性测试、真人体验测试、 真人压力测试和崩溃分析等产品,TestBird建立了云手机、云测试和云分析三大测试平台,为移动应用提供从研发到上线再到运营的一站式质量管理服务,帮助移动应用企业建立完善的质量管理体系和能力,全面提高移动应用的DAU、留存率以及付费情况。 收起阅读 »

环信推出红包功能,打造全民社交新玩法

2016年春晚全程没有出现的吉祥物“猴赛雷”被另外一种声音所替代,微信当晚共有4.2亿人参与红包互动,收发总量达到80.8亿,是去年除夕10.1亿的8倍之多。而承包了2016年春晚红包的支付宝,在“马云欠我一张敬业福”的声音下,大众依然狂摇手机“咻”了一晚上,...
继续阅读 »
2016年春晚全程没有出现的吉祥物“猴赛雷”被另外一种声音所替代,微信当晚共有4.2亿人参与红包互动,收发总量达到80.8亿,是去年除夕10.1亿的8倍之多。而承包了2016年春晚红包的支付宝,在“马云欠我一张敬业福”的声音下,大众依然狂摇手机“咻”了一晚上,仅在除夕第一轮支付宝互动次数就高达677亿次。显然,红包已经作为一种现象级产品引领着移动App的社交新玩法,以最直接的方式触碰用户G点,深入用户关系,是提高留存率带动App日活的绝佳利器。然而如此巨大的市场却被腾讯、阿里等互联网巨头把持,那么没有红包功能的中小型App,日子就不过了嘛?再小的个体也有自己的品牌,再小的App也要有自己的“红包”。

701457923506.png


让所有的App都能有属于自己的红包,国内最大的即时通讯云平台环信正式推出了红包功能,同时环信即时通讯云也是行业首家支持红包功能的产品。接入环信红包功能零费用,全方位适配移动端,仅需一天即可快速集成。将为兴趣社交、婚恋招聘、生活服务、移动电商、教育医疗、游戏等各大行业App量身打造最接地气的场景化社交服务。

28861457923506.png


 环信此次通过红包功能这一全民所追崇的社交交互形式,致力于帮助中小型App解决留存率低、日活低、运营难等问题。在红包主题、节日互动的带动下,增强用户体验,提高用户粘性,将App产品体验发挥到极致。   

  单身狗追女生无从下手,《撩妹大全》没教你怎么办?求职者想向猎头/企业HR请教问题,如何能成功引起他们注意?同圈层、同爱好兴趣的人们聚到一块儿,怎么促进一下深度交流?网游装备太贵,买了就得吃土,怎么让卖家给我友情价?——发个红包,一切SO EASY!打开社交坚冰,升职加薪走上人生巅峰,都可以从发一个红包开始。 

26871457923506.png


  目前,已有十余家App企业内测了环信红包,据某招聘行业龙头App CTO反馈数据显示,在集成了环信红包功能以后,用户粘性和活跃度获得了明显提升,日活数据更是获得了15-20%的提升。据悉,环信红包功能仅仅是其改变社交玩法的第一步,环信即将联合“云账户”上线包括品牌特定主题红包及商家卡券等更多增值服务和新玩法,将为移动互联时代的App社交和变现提供更多的想象空间。 

最后,亲们抢完红包请一定大力喊出“谢谢老板”哦!体验环信红包,请猛戳:http://www.easemob.com/downloads 收起阅读 »

感谢热心开发者@北京大鼓书意见反馈--Android语音文字切换输入的优化

 android最新官方demo有个细节小问题。聊天界面,点左边的语音,再点右边的+号,再输入框,会变成这样 在3.0的uidemo  还有一些3.0的ui 聊天小用户体验细节问题  第194行代码,官方demo是togg...
继续阅读 »
 android最新官方demo有个细节小问题。聊天界面,点左边的语音,再点右边的+号,再输入框,会变成这样


1.jpg


在3.0的uidemo

2.jpg



 还有一些3.0的ui 聊天小用户体验细节问题


3.jpg



 第194行代码,官方demo是toggleFaceImage ,这样点击表情笑脸不会自动切换软件键盘。改成我这样,可以在表情面板和键盘相互切换

 还一个是setModeKeyboard方法,官方的这个里面的代码 editText.requestFocus();根本不起作用。

在最后一行改成我这样才可以在 “按住说话”  和 键盘之间切换


4.jpg


各位小伙伴们在集成过程中有任何意见建议欢迎随时提出,我们会及时作出处理,并赠送神秘大奖的哈!

QQ图片20160313122002.jpg

收起阅读 »

环信首席架构师:做业务系统如何成长为架构师?

你需要的只是持续学习,包接口也可以变成包老师 之前说到在『在行』开了个聊天话题『如何成长为一个合格的架构师』。前段时间有个朋友找到我,问了个非常典型的问题。 图片来源:Live Business Art Board 他说:『我现在在做偏业务开...
继续阅读 »
你需要的只是持续学习,包接口也可以变成包老师

之前说到在『在行』开了个聊天话题『如何成长为一个合格的架构师』。前段时间有个朋友找到我,问了个非常典型的问题。



32400035d3ad3e91de7.jpg


图片来源:Live Business Art Board



他说:『我现在在做偏业务开发方向的工作,在平时需要如何积累基础服务和系统架构方面的经验和知识。 』

很显然他意识到了两种系统的区别,而且正在试图转型。然而我知道,他也走进了一个让人难以反驳的认识误区,这就是,因为业务系统技术要求不高,所以开发人员在走向架构师的路上成长缓慢。

业务系统技术要求有多高

如果说从门槛来看,业务逻辑确实是最容易写的代码。产出好量化,功能又好测试。就算真的坏了,系统一般不会因此垮掉。只是,门槛低并不意味着容易做好。

有一种工作是API设计与实现,行话叫『包接口』,也是很多同学刚毕业的第一份工作。这事说起来简单,只要调用方跟被调用方协商一致即可,但是真正做的时候你会发现很多问题。

调用方首当其冲。如果命名混乱,找到想要的接口和参数就会变得很难。而如果你错误码定义得不够清晰,调通一个接口将会变成一个令人崩溃的事情。

被调用方也没有轻松到哪里去。如果没有遵循正交原则,那么你每个接口都可能涉及后端的很多资源调用和库的引用,导致服务不可避免得变大。一个资源的变化,都将有可能会影响到很多接口,这对回归测试和问题排查都将是一个灾难。

如果你在做一个平台,情况会变得更加严重。抽象不足的话,用户的每一个需求都会变成新的接口。而一旦发布出去,你就要保持其兼容性,也就是说,这辈子都是你的接口了。如果开始的时候没考虑到版本,那么恭喜你,从此要转行技术支持了。

这方面微信的开放平台接口,基本算是一个反例。返回数据JSON和XML混排,超出限制后无响应!?可惜的是,由于平台变大,作为调用方的开发者只能被欺(qiang)负(jian)。

现在所有的服务都在云化,其中的基础就是API化,这个事情也变得越来越重要。推荐在做这方面工作的看看 Principles of good RESTful API Design。http://codeplanet.io/principles-good-restful-api-design/

做业务系统会遇到很多这样的工作,做出来简单,但做好却难。是什么让我们却止步于做出来,并因此想做些有挑战的事呢?



32600035d27c6ca22c6.jpg


图片来源:Surreal &amp; Conceptual Photography by Diggie Vitt


被逼的工作,被逼的学习

因为大多数人都需要工作,很多人在做着自己不那么喜欢的工作。或因为感情,或因为压力,必须做完现在的事情。不喜欢意味着不会朝思暮想,不会为伊消得人憔悴。再好的职业素养,也不会改变做完即可的态度。

如果你是被逼学习型,找一份自己更喜欢的工作,事不宜迟。这里有一点个人的建议是,如果要走技术路线,不要做外包。

我们不排除有些工作因为容易掌握,大多数人都只是做完即可,但更多的情况是,不是工作要求低,而是做的人放低了对自己的要求。就像本文前面的业务系统,虽说离架构设计很远,但是基本功都是一样的。

值得注意的是,在一个分工明确的团队里,并不是所有人要做所有事,但是好的团队里所有人会了解所有事。一个开发者如果不了解上层服务的需求,不了解下层服务的设计,很难做好服务的。

只有对其他组件建立足够的了解,才能设计出一致的服务,减少过度优化和不当依赖。知道什么时候该容忍错误,什么时候该放弃请求,才能在出问题的时候快速定位,才能一起做好服务。

这种了解,就来自于对架构设计的理解。

不要被你的思想局限

如果你喜欢自己现在的事情,那么要恭喜你,你很幸运。而你需要注意的是,不要被自己的思想局限。虽然没人会要求你像卖油翁一样,在能倒油的时候练习从铜钱内穿过,但你至少要知道,还是有很多可以做的。

就拿本文开头的例子,你以为只是设计一个API,但其实API到底层数据到映射和转换,已经涉及了架构设计的基础。你以为只是设计成RESTful,但其实还可以做成自动测试的框架,像Swagger,或者RAML,或者API Blueprint。你以为你只是在包接口,其实是放弃了对自己的要求而已。

人永远不知道自己不知道的东西,这也是我们需要持续学习的原因。

包接口也能变成包老师。



2cc00093cdf5af50a8c.jpg


图片来源:苍老师书法



阅读其他文章,请关注知乎专栏『 一乐来了

dd88e60c37992dbe18a1492ad099fa17.jpg

收起阅读 »

关于EaseSDKHelper官方做法,otherConfig参数无法关闭log问题

集成环信UI时, 文档中有下面一段代码     [[EaseSDKHelper shareHelper] easemobApplication:application                       didFinishLaunchingWithOp...
继续阅读 »
集成环信UI时, 文档中有下面一段代码
    [[EaseSDKHelper shareHelper] easemobApplication:application
                      didFinishLaunchingWithOptions:launchOptions
                                             appkey:kEaseMobKey
                                       apnsCertName:nil
                                        otherConfig:@{kSDKConfigEnableConsoleLogger:@NO}];
这段代码是为了注册环信, 其中otherConfig中的kSDKConfigEnableConsoleLogger,可以配置是否打开后台log打印。 但是实际上你传@NO 或者 @YES都是没用的, 原因是这个方法的实现中(CMD+左键),
    if ([otherConfig objectForKey:kSDKConfigEnableConsoleLogger]) {
        options.enableConsoleLog = YES;
    }
是这样判断的, 正确做法是
    if ([[otherConfig objectForKey:kSDKConfigEnableConsoleLogger] boolValue]) {
        options.enableConsoleLog = YES;
    }
需要加一个boolValue转换, 强迫症患者改一下, 就不会再有超多的log打印了~ 收起阅读 »

首届环信编程大赛,让世界感受中国程序员的力量!

一:大赛简介 根据IDC数据显示,中国有近200万开发者,身为一个程序员,我们生活在一个 IT 系统越发复杂且多变化的时代。有时候执行一个简单的开源项目,开发一个基础功能都需要精准定义并耗费大量时间专注任务。随着云计算的兴起,API 和SDK开始作为软件...
继续阅读 »


QQ截图20160310114154.jpg


一:大赛简介

根据IDC数据显示,中国有近200万开发者,身为一个程序员,我们生活在一个 IT 系统越发复杂且多变化的时代。有时候执行一个简单的开源项目,开发一个基础功能都需要精准定义并耗费大量时间专注任务。随着云计算的兴起,API 和SDK开始作为软件之间重要媒介而作为一种独立应用而存在,“一切皆软件,一切皆API,一切皆SDK”。通过API和SDK可以让开发者摆脱繁重的基础功能底层开发,短时间即可让App拥有各种诸如内置IM、统计等基础功能组件能力。

2014年,以环信为典型的众多云服务商将基于移动互联网的即时通讯能力,如单聊、群聊、发语音、发图片、发位置、实时音频、实时视频等,通过云端开放的Rest API和客户端SDK包的方式提供给开发者和企业。让App内置聊天功能和以前网页中嵌入分享功能一样简单。而开发者就可以集中精力处理自己产品的核心业务开发,不必为基础功能组件耗费自己太多精力,不仅省钱省力,更是加速了APP的上线速度。按照移动互联网时代的速度,往往两三个月就能够决定一款APP的成败。

因此,环信联合国内专业的技术测评平台猿圈共同推出“首届环信编程大赛”,让世界感受中国程序员的力量。本次环信编程大赛由线上初赛、决赛、颁奖典礼三个环节组成。其中初赛环节,通过猿圈网站在线测评平台进行编程挑战。决赛环节基于环信sdk开发一款移动端app,比赛结果将以初赛及决赛的综合评分决定。

二:大赛奖品

1.一等奖8000元,二等奖5000元,三等奖2000元。

2. 决赛前10可获得限量版瑞士军刀背包一个。

3.前五十可获得定制版精美T-shirt或卫衣。

还有更多神秘礼品等着大家,比如文件袋,多功能便携工具卡,环信CEO签名编程书籍等。

三:赛程设置

1.初赛:初赛题目将在国内最专业的技术人才测评平台猿圈上进行在线答题,通过猿圈在线编程评测系统可快速识别一个技术人员的技术水平及素养,在初赛中得分90分及以上的程序员将会获得决赛资格。(小贴士:初赛在线答题可挑战多次,取最好成绩)

2.决赛:基于环信sdk开发一款拥有聊天功能的app,类型自由选择,比如:游戏、工具、社交...决赛将根据APP功能复杂难易程度,项目代码简洁度等标准进行评选。

3,.本次编程大赛最终获奖项目将开源在imgeek社区供大家学习参考。

四:大赛日程安排

报名要求:全国程序员(不限年龄,职业等)

大赛进行时间:3月7日-4月15日

初赛题目:在猿圈平台上进行在线答题(Android/ios)

初赛参赛步骤:

1:在 http://t.cn/RGQ3Kwy 完成报名。

2:报名当日晚9点收到包含初赛链接地址的通知邮件。

3:按照邮件内提示,在线上完成初赛。

4:初赛筛选通过后将于3月21日告之决赛项目提交地址。

决赛题目:基于环信sdk开发一款移动端APP(Android/ios)

决赛参赛步骤:

1:在环信开发者平台注册开发者账号http://www.easemob.com

2:下载资源包,开发至少一款Android或ios 应用http://www.easemob.com/downloads

开发过程中遇到问题可通过以下路径获取技术支持:

1)社区发帖:imgeek社区http://www.imgeek.org

2)联系环信在线技术支持:官网首页最下方http://easemob.com

3)QQ群组讨论:编程大赛讨论群326754315 收起阅读 »

关于3.1集成时的两个错误, 主要是EaseUI。

先吐槽下官网的更新速度, 好不容易把企业做大了。 如果这就懈怠了, 马上就会被竞争对手超越的。 文档也不及时更新, 各种老旧文档和视频, 坑人不浅。   问题一: 引入UI的童鞋请查看 视频:集成视频http://v.youku.com/v_show/id_X...
继续阅读 »
先吐槽下官网的更新速度, 好不容易把企业做大了。 如果这就懈怠了, 马上就会被竞争对手超越的。 文档也不及时更新, 各种老旧文档和视频, 坑人不浅。
 
问题一: 引入UI的童鞋请查看
视频:集成视频http://v.youku.com/v_show/id_XMTQyMDc0NTQwMA==.html?from=y1.7-2
首先解释下为什么视频中同样的步骤集成不报错,视频中的集成是基于2015年10月30日的EaseUI, 最新更新的2016年2月2日的版本中对3.0demo和EaseUI的代码稍作了修改,以解决之前版本中的一些小问题。 但大家也不要着急,只要按视频中集成,再稍作修改即可。先找到EaseUI-Prefix.pch,将其中的 #define NSEaseLocalizedString(key, comment) [[NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"EaseUIResource" withExtension:@"bundle"]] localizedStringForKey:(key) value:@"" table:nil] 这段代码拷贝到自己的pch文件下即可。 再在自己pch文件中所有代码的首尾加上#ifdef __OBJC__和#endif。 好了,问题就这样解决啦!
 
问题二:上方回答是03/06之前好用的, 在新版本3.1.0更新以后, 需要额外引入libiconv.tbd框架。
 
问题三:NSObject+EaseMob类别报错, 找不到头文件#import "EaseMob.h", 大家需要把NSObject+EaseMob类别的h和m文件删除。 因为官方EaseUI的Demo中并没有引入此文件。  推测是这个文件不用了, 但是程序员光删除了索引但是忘记删除到垃圾桶了。 鄙视!!!
 
 
  收起阅读 »

表情mm|表情云™V1.2版本,整合环信3.0版Demo同步上线!

小伙伴们,大家好ヽ(✿゚▽゚)ノ。2016年03月02日,表情mm|表情云™发布了最新版SDK V1.2,全面支持iOS和Android平台,大家可以关注一下哦~ SDK新版本的功能优化点如下: 1. Android-优化了表情包批量下载(下载表情...
继续阅读 »
小伙伴们,大家好ヽ(✿゚▽゚)ノ。2016年03月02日,表情mm|表情云™发布了最新版SDK V1.2,全面支持iOS和Android平台,大家可以关注一下哦~

0.gif


SDK新版本的功能优化点如下:


1. Android-优化了表情包批量下载(下载表情包更快,更省内存);
2. Android-开放表情商店内标题栏背景颜色和高度设定;
3. iOS-解决了部分gif表情播放有残影的问题;
4. iOS-优化了SDK表情包下载和键盘的性能;
5. iOS-对环信2.0 Demo做了一些性能优化。


开发者们可以直接在表情mm官网下载最新版SDK 体验~



640.webp_.jpg



表情mm官网(http://www.biaoqingmm.com/
同时表情mm整合环信3.0 IM SDK的Demo也发布啦!欢迎下载体验噢~



640.webp_.jpg



目前,接入表情mm|表情云™的开发者涵盖兴趣社交、二次元社区、母婴电商、企业OA等多种类型的产品。未来,表情mm|表情云™在不断更新内容的过程中,还会逐步开放更多灵活定制接口,满足更多开发者的不同定制需求,让更多开发者轻松拥有专属自己产品的表情商店。 收起阅读 »

Android开发自定义ImageView控件实现圆角边框等功能

在开发中有时我们需要一个功能,或者一个控件,但是官方的又满足不了我们的需求,此时就需要我们自己实现这些功能; 下边边就是我们经常会需要的一个实现了图片的圆角,以及添加边框等功能的自定义控件;文章最后有项目源码地址 这个自定义ImageView控件实现了...
继续阅读 »
在开发中有时我们需要一个功能,或者一个控件,但是官方的又满足不了我们的需求,此时就需要我们自己实现这些功能;
下边边就是我们经常会需要的一个实现了图片的圆角,以及添加边框等功能的自定义控件;文章最后有项目源码地址

这个自定义ImageView控件实现了图片的圆角、圆形、边框等功能,同时具有按下改变颜色的效果,通过属性设置可以自定义按下的颜色,
以及颜色的透明度;还尅定义边框的颜色
Demo截图:

device-2015-05-04-101609.png


控件属性定义
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--自定义MLImageView的属性 加上了自己的前缀,防止和其他自定义控件冲突-->
<declare-styleable name="MLImageView">
<attr name="ml_border_color" format="color" />
<attr name="ml_border_width" format="dimension" />
<attr name="ml_press_alpha" format="integer" />
<attr name="ml_press_color" format="color" />
<attr name="ml_radius" format="dimension" />
<attr name="ml_shape_type" format="enum">
<enum name="none" value="0" />
<enum name="round" value="1" />
<enum name="rectangle" value="2" />
</attr>
</declare-styleable>
</resources>
控件代码的实现​
package net.melove.demo.chat.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;

import net.melove.demo.chat.R;

/**
* Created by lzan13 on 2015/4/30.
* 自定义 ImageView 控件,实现了圆角和边框,以及按下变色
*/
public class MLImageView extends ImageView {
// 图片按下的画笔
private Paint pressPaint;
// 图片的宽高
private int width;
private int height;

// 定义 Bitmap 的默认配置
private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
private static final int COLORDRAWABLE_DIMENSION = 1;

// 边框颜色
private int borderColor;
// 边框宽度
private int borderWidth;
// 按下的透明度
private int pressAlpha;
// 按下的颜色
private int pressColor;
// 圆角半径
private int radius;
// 图片类型(矩形,圆形)
private int shapeType;

public MLImageView(Context context) {
super(context);
init(context, null);
}

public MLImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}

public MLImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}

private void init(Context context, AttributeSet attrs) {
//初始化默认值
borderWidth = 6;
borderColor = 0xddffffff;
pressAlpha = 0x42;
pressColor = 0x42000000;
radius = 16;
shapeType = 2;

// 获取控件的属性值
if (attrs != null) {
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MLImageView);
borderColor = array.getColor(R.styleable.MLImageView_ml_border_color, borderColor);
borderWidth = array.getDimensionPixelOffset(R.styleable.MLImageView_ml_border_width, borderWidth);
pressAlpha = array.getInteger(R.styleable.MLImageView_ml_press_alpha, pressAlpha);
pressColor = array.getColor(R.styleable.MLImageView_ml_press_color, pressColor);
radius = array.getDimensionPixelOffset(R.styleable.MLImageView_ml_radius, radius);
shapeType = array.getInteger(R.styleable.MLImageView_ml_shape_type, shapeType);
array.recycle();
}

// 按下的画笔设置
pressPaint = new Paint();
pressPaint.setAntiAlias(true);
pressPaint.setStyle(Paint.Style.FILL);
pressPaint.setColor(pressColor);
pressPaint.setAlpha(0);
pressPaint.setFlags(Paint.ANTI_ALIAS_FLAG);

setClickable(true);
setDrawingCacheEnabled(true);
setWillNotDraw(false);
}

@Override
protected void onDraw(Canvas canvas) {

if (shapeType == 0) {
super.onDraw(canvas);
return;
}
// 获取当前控件的 drawable
Drawable drawable = getDrawable();
if (drawable == null) {
return;
}
// 这里 get 回来的宽度和高度是当前控件相对应的宽度和高度(在 xml 设置)
if (getWidth() == 0 || getHeight() == 0) {
return;
}
// 获取 bitmap,即传入 imageview 的 bitmap
// Bitmap bitmap = ((BitmapDrawable) ((SquaringDrawable)
// drawable).getCurrent()).getBitmap();
// 这里参考赵鹏的获取 bitmap 方式,因为上边的获取会导致 Glide 加载的drawable 强转为 BitmapDrawable 出错
Bitmap bitmap = getBitmapFromDrawable(drawable);
drawDrawable(canvas, bitmap);

drawPress(canvas);
drawBorder(canvas);
}

/**
* 实现圆角的绘制
*
* @param canvas
* @param bitmap
*/
private void drawDrawable(Canvas canvas, Bitmap bitmap) {
// 画笔
Paint paint = new Paint();
// 颜色设置
paint.setColor(0xffffffff);
// 抗锯齿
paint.setAntiAlias(true);
//Paint 的 Xfermode,PorterDuff.Mode.SRC_IN 取两层图像的交集部门, 只显示上层图像。
PorterDuffXfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
// 标志
int saveFlags = Canvas.MATRIX_SAVE_FLAG
| Canvas.CLIP_SAVE_FLAG
| Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
| Canvas.FULL_COLOR_LAYER_SAVE_FLAG
| Canvas.CLIP_TO_LAYER_SAVE_FLAG;
canvas.saveLayer(0, 0, width, height, null, saveFlags);

if (shapeType == 1) {
// 画遮罩,画出来就是一个和空间大小相匹配的圆(这里在半径上 -1 是为了不让图片超出边框)
canvas.drawCircle(width / 2, height / 2, width / 2 - 1, paint);
} else if (shapeType == 2) {
// 当ShapeType == 2 时 图片为圆角矩形 (这里在宽高上 -1 是为了不让图片超出边框)
RectF rectf = new RectF(1, 1, getWidth() - 1, getHeight() - 1);
canvas.drawRoundRect(rectf, radius + 1, radius + 1, paint);
}

paint.setXfermode(xfermode);

// 空间的大小 / bitmap 的大小 = bitmap 缩放的倍数
float scaleWidth = ((float) getWidth()) / bitmap.getWidth();
float scaleHeight = ((float) getHeight()) / bitmap.getHeight();

Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);

//bitmap 缩放
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

//draw 上去
canvas.drawBitmap(bitmap, 0, 0, paint);
canvas.restore();
}

/**
* 绘制控件的按下效果
*
* @param canvas
*/
private void drawPress(Canvas canvas) {
// 这里根据类型判断绘制的效果是圆形还是矩形
if (shapeType == 1) {
// 当ShapeType == 1 时 图片为圆形 (这里在半径上 -1 是为了不让图片超出边框)
canvas.drawCircle(width / 2, height / 2, width / 2 - 1, pressPaint);
} else if (shapeType == 2) {
// 当ShapeType == 2 时 图片为圆角矩形 (这里在宽高上 -1 是为了不让图片超出边框)
RectF rectF = new RectF(1, 1, width - 1, height - 1);
canvas.drawRoundRect(rectF, radius + 1, radius + 1, pressPaint);
}
}

/**
* 绘制自定义控件边框
*
* @param canvas
*/
private void drawBorder(Canvas canvas) {
if (borderWidth > 0) {
Paint paint = new Paint();
paint.setStrokeWidth(borderWidth);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(borderColor);
paint.setAntiAlias(true);
// 根据控件类型的属性去绘制圆形或者矩形
if (shapeType == 1) {
canvas.drawCircle(width / 2, height / 2, (width - borderWidth) / 2, paint);
} else if (shapeType == 2) {
// 当ShapeType = 1 时 图片为圆角矩形
RectF rectf = new RectF(borderWidth / 2, borderWidth / 2, getWidth() - borderWidth / 2,
getHeight() - borderWidth / 2);
canvas.drawRoundRect(rectf, radius, radius, paint);
}
}
}

/**
* 重写父类的 onSizeChanged 方法,检测控件宽高的变化
*
* @param w
* @param h
* @param oldw
* @param oldh
*/
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
width = w;
height = h;
}

/**
* 重写 onTouchEvent 监听方法,用来监听自定义控件是否被触摸
*
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
pressPaint.setAlpha(pressAlpha);
invalidate();
break;
case MotionEvent.ACTION_UP:
pressPaint.setAlpha(0);
invalidate();
break;
case MotionEvent.ACTION_MOVE:

break;
default:
pressPaint.setAlpha(0);
invalidate();
break;
}
return super.onTouchEvent(event);
}

/**
* 这里是参考其他开发者获取Bitmap内容的方法, 之前是因为没有考虑到 Glide 加载的图片
* 导致drawable 类型是属于 SquaringDrawable 类型,导致强转失败
* 这里是通过drawable不同的类型来进行获取Bitmap
*
* @param drawable
* @return
*/
private Bitmap getBitmapFromDrawable(Drawable drawable) {
try {
Bitmap bitmap;
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
} else if (drawable instanceof ColorDrawable) {
bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
} else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
BITMAP_CONFIG);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
} catch (OutOfMemoryError e) {
e.printStackTrace();
return null;
}
}

/**
* 设置边框颜色
*
* @param borderColor
*/
public void setBorderColor(int borderColor) {
this.borderColor = borderColor;
invalidate();
}

/**
* 设置边框宽度
*
* @param borderWidth
*/
public void setBorderWidth(int borderWidth) {
this.borderWidth = borderWidth;
}

/**
* 设置图片按下颜色透明度
*
* @param pressAlpha
*/
public void setPressAlpha(int pressAlpha) {
this.pressAlpha = pressAlpha;
}

/**
* 设置图片按下的颜色
*
* @param pressColor
*/
public void setPressColor(int pressColor) {
this.pressColor = pressColor;
}

/**
* 设置倒角半径
*
* @param radius
*/
public void setRadius(int radius) {
this.radius = radius;
invalidate();
}

/**
* 设置形状类型
*
* @param shapeType
*/
public void setShapeType(int shapeType) {
this.shapeType = shapeType;
invalidate();
}
}
控件使用方法​
使用方法很简单,就像在xml布局文件使用其他控件你那样引用就好;如果你不想引用过多的库, 可以直接复制MLImageView类到自己的项目中,
进行修改加工,让控件和自己的项目进行整合
<net.melove.dome.mlimageview.MLImageView
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_margin="8dp"
android:src="@mipmap/lz_bp_blue"
melove:border_color="@color/ml_white"
melove:border_width="4dp"
melove:press_alpha="50"
melove:press_color="#00ff00"
melove:radius="8dp"
melove:shape_type="rectangle" />
注意

要记着有一点,在使用自定义控件之前一定要添加自定义命名空间(命名空间的名字可以自己定义)
xmlns:melove="http://schemas.android.com/apk/res-auto"
项目源码:自定义ImageView控件 MLImageViewDemo
 
本文由环信Android工程师lzan13原创,博客地址http://melove.net/ 收起阅读 »

AndroidStudio新建及clone项目关于gradle出现的问题

在我们使用AndroidStudio创建或者clone一个新的项目的时候,一般会遇到一些问题,如下图那样,一般是因为在AndroidStudio每次更新版本都会更新Gradle这个插件,但由于墙的问题每次更新都是失败,又是停止在Refreshing Gradl...
继续阅读 »
在我们使用AndroidStudio创建或者clone一个新的项目的时候,一般会遇到一些问题,如下图那样,一般是因为在AndroidStudio每次更新版本都会更新Gradle这个插件,但由于墙的问题每次更新都是失败,又是停止在Refreshing Gradle Project,有时新建项目的时候报Gradle Project Compile Error等等相关的问题
解决这些问题办法是

tupian015.png


打开AndroidStudio项目,找到项目目录gradle\wrapper\gradle-wrapper.properties这个文件内容如下
#Wed Jul 08 23:06:25 CST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip
最重要的就是最下面一句,android studio会联网下载符合当前版本的gradle插件,而这个网址虽然可以访问但速度实在太慢,所以每次下载需要花很长时间或直接超时

解决办法就是自己去手动下载当前项目定义的版本,可以直接复制这个路径去下载,也可以去gradle官网自己选择版本下载
然后把下载下来的压缩包拷贝到C:\Users\lzan13\.gradle\wrapper\dists\gradle-2.5-all\d3xh0kipe7wr2bvnx5sk0hao8目录下后边这个长串的目录不一定相同,以自己的为准

重启AndroidStudio或选择工具栏Tools->Android->Sync Project Gradle Files

tupian016.png


等待更新完成,就ok了 收起阅读 »

38节特辑:我们一起追过的“程序媛“女神!

你造吗?世界上第一位程序员并不是男的,而是英国著名诗人拜伦的女儿爱达·拉夫拉斯伯爵夫人。她不仅思绪敏捷,聪颖过人,而且还貌美如花。 1.世界上第一位程序员,不仅思绪敏捷,聪颖过人,而且还貌美如花。她就是英国著名诗人拜伦的女儿爱达・拉夫拉斯...
继续阅读 »
你造吗?世界上第一位程序员并不是男的,而是英国著名诗人拜伦的女儿爱达·拉夫拉斯伯爵夫人。她不仅思绪敏捷,聪颖过人,而且还貌美如花。


{L__TFBTSS87TM)MP7PT}0.jpg



1.世界上第一位程序员,不仅思绪敏捷,聪颖过人,而且还貌美如花。她就是英国著名诗人拜伦的女儿爱达・拉夫拉斯伯爵夫人。



640.webp_.jpg


爱达.拉夫拉斯伯爵夫人


2. 美貌与智慧并重的玛丽莎·梅耶尔毫无悬念排名第二,梅耶尔毕业于斯坦福大学,1999年加入谷歌,是谷歌的第一位产品经理和首位女工程师,也是《商业周刊》“创新产业25位领军人物”之一。2012年7月17日,出任雅虎CEO。




640.webp_(1)_.jpg


 


3. 相信大家对这个妹子不算陌生,她就是2013年人人网上《这世界唯一的你》的相册女主人公。据了解,这位长相甜美的女孩是人人网的一名前端工程师。男网友看到纷纷表示爱慕,女网友看到纷纷表示“有个会拍照的男友是件多么幸福的事”。




640.webp_(2)_.jpg


 


4. 最近,雷军亲自指导小米美女工程师的图片爆红,下图就是“绯闻女主角”。这样一位美美的女子,竟然也是“码农”。




640.webp_(3)_.jpg


 


5. 在手机百度4亿用户庆祝会上,一位清纯可人,肤白貌美腿长的妹子惊艳全场,引起一众屌丝宅男们各种争相围观合影。据说,这妹子也是个程序媛,被称为百度“新度娘”。




640.webp_(4)_.jpg


 


6. 军中也有漂亮的程序媛妹纸,你没有看错!2000年考入国防科技大学计算机专业的李聪娜,目前在信息化人才缺乏的西北军营,从事网络安全工作。据说这位美女程序媛在90多昼夜编写代码40余万行,让多少男程序猿汗颜!




640.webp_(5)_.jpg


 


7. 把目光转向大洋彼岸,介绍下美国云储存公司Box工程部门的美女主管Kimber Lockhart,在加入Box之前,她曾自己创业为一家公司的CEO,后她领导Box公司的工程师团队开发了Box网站大多数的功能。现为旧金山One Medical Group程序部门的Vice President。




640.webp_(6)_.jpg


 


8. 目光再回到国内,下边这位被誉为全能程序媛的90妹子,除了业务能力突出以外,还会洗衣服、遛狗铲屎,精通lol,会花会活不粘人!……据悉,她已经被环信公司招至靡下,有图有真相!旁边这位合影的CEO据说除了招募人才能力突出以外,腰椎间盘也突出!




e4643f3277aa749d6685ab628503fdc4.jpg


 



我知道放这张照片我会被打死的......


IMG_1535.JPG



上面八位有木有你的心动女神?快快分享给你的朋友圈小伙伴们围观吧,据说分享此文的男程序猿2016年都会找到自己中意的妹子哦!

各位程序猿们,欢迎加入环信的大家庭,更多女神等着你:
简历请砸:jobs@easemob.com! 收起阅读 »

环信SDK 3.1.0 发布,全新的通讯协议

环信SDK 3.1.0已经发布,本次是在全新通讯协议的版本上更新。欢迎大家试用并反馈问题。 Android: 新功能 1. 增加android studio support。 2. 增加x86版本动态库,可以在模拟器上调试。 Bug fi...
继续阅读 »
环信SDK 3.1.0已经发布,本次是在全新通讯协议的版本上更新。欢迎大家试用并反馈问题。


ea790d9dgw1f1o68vf90lj20kg0d8q6n.jpg



Android:

新功能

1. 增加android studio support。

2. 增加x86版本动态库,可以在模拟器上调试。

Bug fix:

1. 修复了扩展字段解析的问题。

2. 修复了用户id中有下划线时,会话中id显示不完整的问题。

3. 修复了某些情况下创建cmd类型消息失败的问题。

iOS:

bug fix:

1. 修复了扩展字段解析的问题

2. 修复了用户id中有下划线时,会话中id显示不完整的问题
 
 
点击下载3.1.0SDK http://www.easemob.com/downloads 收起阅读 »

环信编程大赛开始报名了,是GEEK,你就来,等的就是你

编程大赛时间:3月7日至4月15日 了解详情http://www.easemob.com/event/hackathon/​    大赛简介 1. 本次编程大赛由线上初赛、决赛、颁奖典礼三个环节组成,其中初赛环节,通过猿圈网站Andriod,iOS在线测评平...
继续阅读 »
编程大赛时间:3月7日至4月15日
了解详情http://www.easemob.com/event/hackathon/​

 
 大赛简介


1. 本次编程大赛由线上初赛、决赛、颁奖典礼三个环节组成,其中初赛环节,通过猿圈网站Andriod,iOS在线测评平台进行编程挑战;决赛环节基于环信sdk开发一款移动端app,比赛结果将以初赛及决赛的综合评分决定
2. 初赛通过之后将邮件告知决赛项目提交地址



大赛奖品


1.一等奖8000元,二等奖5000元,三等奖2000元
2. 决赛前10可获得限量版瑞士军刀背包一个
3.前五十可获得定制版精美T-shirt或卫衣
还有更多神秘礼品就不多说拉,比如文件袋,多功能便携工具卡,环信CEO签名的神秘编程书籍



关于比赛题目


1. 初赛:初赛题目将在国内最专业的技术人才测评平台猿圈上进行在线答题,通过猿圈在线编程评测系统可快速识别一个技术人员的技术水平及素养,在初赛中得分90分以上的技术人才将会获得决赛项目的提交地址。最终比赛结果将结合初赛及决赛的综合成绩进行判定。
小贴士:初赛在线答题可挑战多次
2. 决赛:基于环信sdk开发一款拥有聊天功能的app,类型自由选择,比如:医疗,教育,社交...决赛将根据功能复杂难易,项目代码简洁评选
本次编程大赛最终获奖项目将开源在imgeek社区供大家学习参考


 
 
  收起阅读 »

凌晨两点零八分的环信

环信在即时通讯云取得的市场第一的成绩,环信在SaaS移动端客服取得的77.4%的市场占有率,核心是靠技术资源的海量投入。 靠着环信CTO带着研发团队年复一年日以继夜的奋战 ,只有市场第一的公司程序员才知道凌晨两点钟的北京三环是长什么样子的 
环信在即时通讯云取得的市场第一的成绩,环信在SaaS移动端客服取得的77.4%的市场占有率,核心是靠技术资源的海量投入。
靠着环信CTO带着研发团队年复一年日以继夜的奋战 ,只有市场第一的公司程序员才知道凌晨两点钟的北京三环是长什么样子的 

好PaaS才产好SaaS:环信已具备差异化竞争优势

原本,云计算是一个层次化清晰的架构,SaaS、PaaS和IaaS只是在基础设施层面环环相扣,却在业务层面井水不犯河水。而现在,层次化的架构规定似乎在变得越来越模糊,尤其是PaaS与SaaS之间。当一家PaaS服务商的能力足够强大,比如它的开发平台足够开放和灵活...
继续阅读 »
原本,云计算是一个层次化清晰的架构,SaaS、PaaS和IaaS只是在基础设施层面环环相扣,却在业务层面井水不犯河水。而现在,层次化的架构规定似乎在变得越来越模糊,尤其是PaaS与SaaS之间。当一家PaaS服务商的能力足够强大,比如它的开发平台足够开放和灵活,它能帮助客户实现定制化的开发,它消除了客户对性能、成本、安全性、兼容性、可用性等方面的所有顾虑,它就开始对向SaaS延展产生了兴趣。环信就是其一。



IMG0025116ac7334069909516.jpg


中国计算机报专访环信CEO刘俊彦


从PaaS起家:环信即时通讯云优势明显

在PaaS服务类别中,IM云服务是典型的代表。环信长期专注的就是IM云服务,能够为开发者提供基于移动互联网的即时通讯能力。客户选择环信通常是看重了它在IM云服务市场中展现出来的优势。比如,环信可以帮助客户有效地缩短即时通信平台的开发周期,可以帮助客户构建一个可承载上千万用户同时在线的大型IM系统,可以帮助客户节约开发成本和运维成本等。

环信在PaaS市场上获得的成功也帮助它赢得了资本市场的关注,截止目前,环信已获得近2200万美元的融资。

获得上述成绩,环信只用了两年了。在这两年里,环信在技术研发经验和用户数量上都有所积累。更重要的是,在两年的服务过程中,环信发现了一个前景更加广阔的发展方向。

“在未来,客户服务将会覆盖电话、PC、移动终端等多个渠道。又由于越来越多的用户在使用移动终端,移动终端也会成最重要的客户服务渠道。” 环信CEO刘俊彦如是说。

在客户服务形式上,以前用户熟悉的客服方式是邮件、电话、社交媒体(微博客服、微信客服),而现在情况有了变化,现在用户都去手机上了,用户希望能够在手机APP里能够直接联系到企业得到服务。所以,环信希望能从底层的通信服务商(PaaS)再上升一层,拓展为智能客服服务商(SaaS)。另外对于环信来说,这种拓展的商业意义更大,因为通常PaaS服务商与最终用户之间要么隔着服务,要么隔着产品,所以变现的路径稍长,变现的效率也较低。而提供SaaS客服服务后,环信就可以更贴近最终用户,以此缩短变现路径,提升变现效率。

SaaS 模式从去年开始在业内备受追捧,去年环信也趁热打铁推出了SaaS产品,基于在即时通信底层技术与市场运营方面的长期资源积累,环信的SaaS客服产品在智能客服项目的投标过程中仍旧优势明显。

“在App平台开发PaaS领域,IM类PaaS是典型代表,环信在IM类PaaS市场积累了一批用户,当客户采用了环信的PaaS服务后,如果发现这个客户也有客服需求,环信就很容易推动该客户转化成自己的SaaS客服客户。所以,环信SaaS客服客户从推出后也增长的很快。如果客户需要能够支撑几百万甚至几千万用户同时在线的客服系统,环信的胜出机会就很大。因为很多单纯只做SaaS的客服厂商很难具备这个能力,它们还需要获得第三方即时通信底层PaaS平台的支持,因为无法给客户直接提供一站式的服务,这会降低客户的信任度。” 刘俊彦表示。

环信SaaS客服有三门绝技:全媒体接入+智能机器人+商业智能平台

在产品架构上,环信移动客服分成四个部分。第一部分是基于环信PaaS平台构建的全媒体gateway(入口),这部分要对接呼叫中心、App、网页客服端、社交媒体等客服渠道,包含一个服务器集群,优点是能够实现可扩展,比如客户要求能接入推特、Facebook也能实现。第二部分是人工智能机器人,目前环信的机器人产品已能够独立运营,也可以为友商提供机器人客服功能。第三部分是具备数据统计功能的商业智能平台。第四部分是环信的SaaS客服核心业务系统。

从上述架构可以看出,前三部分产品拥有的技术优势造就了环信SaaS客服产品的整体优势。

在人工智能机器人领域,环信认为,人工智能第一个能落地的点就是客服领域。因为现在来看,用人工智能做客服,可以提升客服效率和降低成本,并可以大幅度地帮助客服产品提升沟通体验。其他与客服相关的热门技术,比如语音转换,在客服领域仍不能大规模应用,主要是因为目前语音转换技术仍然在准确率、专业性、体验度上很难满足客户要求,尤其是在各种复杂的生产环境中,基于语音转换的问答系统很难实现良好的客服沟通体验。

“环信把沟通分成两种模式,一种是同步沟通,一种是异步沟通。电话就是典型的同步沟通模式,但缺点是接打电话时客服人员很难再完成其他任务。即时通信客服就是典型的异步沟通模式,无论用户是从微信还是App进入客户渠道,客服人员都可以同步地去完成其他任务,这恰符合移动互联网环境下消费者的碎片化操作习惯,来自人工智能技术的支持让这种优势景上添花。” 刘俊彦介绍说。

为了保障智能机器人技术的“自主可控”,环信坚持自己搭建机器人技术研发团队,虽然这样做成本很高。“很多SaaS客服都是找第三方机器人公司合作的,但我们觉得还是要自己掌握机器人核心技术,积累自己的算法和模型,这样做确实成本很高,因为要请的需要是科学家。”环信CEO刘俊彦说。

另外,商业智能平台(BI)也被环信认为是未来SaaS客服实现差异化的核心点之一,很多传统BI工具能够为企业提供统计报表的能力,但却不能做到有效地挖掘潜在用户。环信提供的BI不但能够统计报表,还能协助客服系统实现对潜在用户的挖掘。比如,环信的BI能做到对“客户情感的量化”。当一位从微信渠道来的客户在情感上表达出不满意了,环信BI中客户情感的指数就会增加,当到达某一个标准时,就会自动报警,这个客户随后就将被申报给客服总监特别处理,这对挖掘潜在客户大有帮助。

环信提供的BI工具也可以帮助客户做反向营销。比如在一个母婴电商App中,客服通过与客户聊天了解情况后为客户打上标签,比如打上了“妈妈”、“想买儿童座椅”等标签,然后再向这些客户以客服的身份推送一条信息,告诉客户有一款儿童座椅正在打折,整个过程都由客服系统执行,给客户一种好友沟通的体验而非广告推送的体验,转化率也就会高很多。

客服会更智能:IOT充满想象空间

刘俊彦认为客服在未来有三个发展趋势。第一是客服请求更多会来自移动设备上。第二是智能机器人未来将承担70%~80%甚至更大比例的客服工作。第三是客服场景将越来越多地基于物联网和大数据技术来构建。

“举个列子,未来冰箱上会设置一个小按钮,当一台冰箱坏了,用户通过小按钮就能与冰箱厂商客服接通视频电话,电话接通的同时冰箱的数据会马上传到厂商,厂商客服就可以马上诊断出是否为缺氟引起的不制冷等故障原因。在这个场景里,实时音视频通话和IM通信功能是通过环信提供的PaaS平台来实现,客服用的工作台也可以由环信提供,故障分析的功能可以由环信的大数据BI来实现。” 刘俊彦说。 收起阅读 »

创业路上遇到的那些坑

你知道如何注册公司吗? 你知道如何控制企业成本吗? 你知道合伙人及团队该如何选择? 你知道市场该如何打开? 创业不容易,教你怎么避开那些坑? 这里没有大佬给你吹牛,只有众多一线实战专家为你解读在创业路上遇到的问题, 让你具备一个CEO的基本素质和能力! 活动...
继续阅读 »


你知道如何注册公司吗?
你知道如何控制企业成本吗?
你知道合伙人及团队该如何选择?
你知道市场该如何打开?
创业不容易,教你怎么避开那些坑?
这里没有大佬给你吹牛,只有众多一线实战专家为你解读在创业路上遇到的问题,
让你具备一个CEO的基本素质和能力!


活动时间:2016年3月06日 14:00—17:30

活动规模:100人

活动地址:车库咖啡    海淀区海淀西大街48号鑫鼎宾馆2层


活动流程:
13:30-14:00       签到
14:00-14:45       猿圈CEO       郑萌
14:45-15:30       51社保CEO     余清泉
15:30-16:15       环信技术经理   杜超
16:15-17:00       互动答疑
17:00-17:10       合影留念 


演讲嘉宾
 
猿圈 CEO&创始人 郑萌

分享主题:《初创企业如何打造技术团队》


30982253724817246.jpg


做为一个资深程序老猿,带了10几年的技术团队,凭借对技术人才和企业的理解,做了一个围绕程序猿招聘的相关项目。在这个巨缺猿类的时代,想让大家辨别真假猿,猿圈就是你的火眼金睛。自主研发Android和iOS云端编译引擎,结合基于大数据的人工智能分析,猿圈是目前是国内唯一一家做程序员代码挑战的平台。
 
51社保创始人&CEO 余清泉
分享主题:《初创企业的成本优化及风险防范》

30852253677662946.jpg


国内知名社保专家、劳动用工与成本优化专家。中关村创业大街创业导师、《社保管理师》职业培训首席讲师、《人力资源财税师》能力培训首席讲师、多家机构特聘专家顾问。已出版《社会保险法律政策与工具速查》《社会保险法实战策略》《企业人力资源法规速查大全》《企业人力资源管理师考点地图与真题精解》等专业书籍。《中国企业社保白皮书》系列报告主笔。2015年8月主导发布《中国企业社保白皮书2015》首次明确提出“互联网社保服务模式”。
 
 环信技术经理 杜超
分享主题:《如何让你的APP快速具有即时聊天功能》

30722253724337221.jpg


负责im即时通讯研发及架构设计工作,imgeek社区创始人,热衷开源精神。对于个人开发者或者中小企业来说,做IM用第三方的是一种趋势,自行研发移动IM,技术门槛高,开发周期长。如何让你的APP快速具有即时聊天功能。
 


活动报名请点击:我要报名 收起阅读 »

视频数据流

@interface ViewController () @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad];     // Do any a...
继续阅读 »
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame=CGRectMake(0, 0, 200, 50);
    [button setTitle:@"aa" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

-(void)click:(UIButton *)btn{
   
    UIImagePickerController *imagePicker=[[UIImagePickerController alloc] init];
    imagePicker.delegate=self;
//    imagePicker.view.frame=s
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
     imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera;
       
    }
   // imagePicker.allowsEditing=YES;
//    [self.view addSubview:imagePicker.view];
[self presentViewController:imagePicker animated:YES completion:^{
   
}];
}


- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo {
   
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    [self dismissViewControllerAnimated:YES completion:nil];
    NSLog(@"%@",info);
  UIImage *image=[info objectForKey:UIImagePickerControllerOriginalImage];

    self.image.image=image;
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    [self dismissViewControllerAnimated:YES completion:^{
       
    }];
} 收起阅读 »

Android 中bitmap的处理:获取缩略图,点击查看大图

最近在忙的demo里面,涉及到身份证照片上传的问题,一个页面三个图片的布局,同时还有其他按钮等,导致图片显示的地方很小,所以大图会放不下,无法正常显示。之前一直在纠结怎么压缩bitmap使得不管是大小还是质量压缩之后,app和后台都能看到清晰的图片。后来发现,...
继续阅读 »
最近在忙的demo里面,涉及到身份证照片上传的问题,一个页面三个图片的布局,同时还有其他按钮等,导致图片显示的地方很小,所以大图会放不下,无法正常显示。之前一直在纠结怎么压缩bitmap使得不管是大小还是质量压缩之后,app和后台都能看到清晰的图片。后来发现,其实可以直接app显示的时候,显示缩略图,但是上传到后台的时候,还是上传原来路径下的未压缩的图片信息。其实还可以加上,ImageView的点击事件查看详细的图片。具体看需求。

通过路径获取Bitmap的缩略图
public Bitmap getBitmapByWidth(String localImagePath, int width, int addedScaling) {
if (TextUtils.isEmpty(localImagePath)) {
return null;
}

Bitmap temBitmap = null;

try {
BitmapFactory.Options outOptions = new BitmapFactory.Options();

// 设置该属性为true,不加载图片到内存,只返回图片的宽高到options中。
outOptions.inJustDecodeBounds = true;

// 加载获取图片的宽高
BitmapFactory.decodeFile(localImagePath, outOptions);

int height = outOptions.outHeight;

if (outOptions.outWidth > width) {
// 根据宽设置缩放比例
outOptions.inSampleSize = outOptions.outWidth / width + 1 + addedScaling;
outOptions.outWidth = width;

// 计算缩放后的高度
height = outOptions.outHeight / outOptions.inSampleSize;
outOptions.outHeight = height;
}

// 重新设置该属性为false,加载图片返回
outOptions.inJustDecodeBounds = false;
temBitmap = BitmapFactory.decodeFile(localImagePath, outOptions);
} catch (Throwable t) {
t.printStackTrace();
}

return temBitmap;
}
同时,参数里面的路径也可以改为Bitmap,看自己需要吧。

点击缩略图显示完整的图片

设置ImageView的点击事件,看具体想怎么处理,如果点击换其他图片,则直接跳转,如果是点击查看详细图片,则弹出PopupWindow,里面放一张ImageView,通过传过去的参数filePath,直接显示原来没压缩的图片即可。这个简单就不贴代码了。

Bitmap的旋转

自己的demo里面,图片长宽不一,缩略图肯定是宽大于长的,而详细信息里面或者手机相册里面的图一般都是长大于宽,所以涉及到图片旋转的问题了。
  public Bitmap getRotateBitmap(int type, String bitmapPath) { // type 1
// 竖屏显示图片,2
// 横屏显示图片

Bitmap bitmap = BitmapFactory.decodeFile(bitmapPath);

Bitmap resultBitmap = bitmap;
int height = bitmap.getHeight();
int width = bitmap.getWidth();

System.out.println("获取的bitmap 宽和高:" + width + ":" + height);

switch (type) {
case 1: // 竖屏显示图片,需要偏高
if (height < width) {
// 如果长度小于宽度,则需要选择,否则不需要旋转,只要将option修改即可
Matrix mmMatrix = new Matrix();
mmMatrix.postRotate(90f);

resultBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), mmMatrix, true);
}

break;
case 2: // 横屏显示图片,需要偏长
if (height > width) {
// 如果宽度小于长度
Matrix mmMatrix = new Matrix();
mmMatrix.postRotate(90f);

resultBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), mmMatrix, true);
}

break;

default:
break;
}

return resultBitmap;

}

 
本篇文章由热心开发者提供,作者主页Mudo_Yan 收起阅读 »

浅谈刷票机

  自从混了IT这条不归路,身边不少同学亲戚朋友竟然找我破解QQ,盗微信,帮人刷票,另带IT知识普及教学班,当然除非关系特别铁的,不然一般情况下我是不会去做这种事情的。另外这些事情也不是我想去做就能做成的。
  自从混了IT这条不归路,身边不少同学亲戚朋友竟然找我破解QQ,盗微信,帮人刷票,另带IT知识普及教学班,当然除非关系特别铁的,不然一般情况下我是不会去做这种事情的。另外这些事情也不是我想去做就能做成的。