iOS 消息扩展
好友列表中通过自定义扩展消息来传好友的头像和昵称。
发送之前把头像和昵称通过EMMessage传递给对方(发送消息不光发给对方消息,并且把头像和昵称发给对方),接收的时候解析出来
EaseSDKHelper.m这个类里有一个发送方法 发送消息的时候通过消息扩展传给对方
#pragma mark - send message
+ (EMMessage *)sendTextMessage:(NSString *)text
to:(NSString *)toUser
messageType:(EMMessageType)messageType
requireEncryption:(BOOL)requireEncryption
messageExt:(NSDictionary *)messageExt{
....
message.ext = @{@"logo":@"头像",@"name":@"名字"};
....
}
消息页面的头像和昵称
EaseConversationCell.h
- (void)setModel:(id<IConversationModel>)model{
头像换成message.ext[@"logo"]
昵称换成message.ext[@"name"]
if (self.model.isSender) {
[self.avatarView sd_setImageWithURL:[NSURL URLWithString:@"http://img5.imgtn.bdimg.com/it/u=159694920,2166605543&fm=21&gp=0.jpg"] placeholderImage:model.avatarImage];
_nameLabel.text = @"自己的昵称";
}
else{
[self.avatarView sd_setImageWithURL:[NSURL URLWithString:@"对方头像地址"] placeholderImage:model.avatarImage];
_nameLabel.text = @"对方的昵称";
}
}
消息详情的头像和昵称(同理)
EaseMessageCell.h
- (void)setModel:(id<IMessageModel>)model{
头像换成message.ext[@"logo"]
昵称换成message.ext[@"name"]
}
做的时候花了好多时间研究 ,希望对后人有所帮助。 收起阅读 »
环信:全媒体智能客服时代的最佳实践
随着企业信息化需求的复杂多变,客户服务和体验理念的人性化和智能化,企业通信以及呼叫中心一直是ICT市场上不容忽视的领域。4月14日-15日,由CTI论坛主办的“2016中国呼叫中心及企业通信大会”在北京盛大召开,本次会议以“联络中心的数字化DNA”为主题,围绕企业通信、呼叫中心、下一代通信架构等内容为话题,继续推动ICT产业发展。包括环信等40余家领先的行业供应商展出了其最新产品和服务。同时,环信CEO刘俊彦受邀发表主题演讲,用环信的真实用户案例来诠释什么才是全媒体智能客服时代的最佳实践!
环信移动客服特装展台人头攒动,现场签约成功数单
环信CEO主题演讲,全程无尿点
随着云计算、大数据、移动互联网以及社交媒体的兴起,传统通信模式、企业和客户的交互方式和沟通形态,以及服务理念正面临着前所未有的问题和挑战,新的行业格局也正在形成。2015年作为中国企业级服务元年,同时也是SaaS服务元年,尤其在客服领域诞生了一大批以产品体验和技术创新驱动的SaaS公司,而以全媒体、智能化、移动化为主打的环信移动客服更是其中的翘楚,不到一年时间内服务了1万多家企业,并且在融资额和市场份额上也遥遥领先。
什么是全媒体客服?
环信CEO总结到:“来自不同媒体的服务请求均可以统一接入,一键回复,打造跨网、跨界、跨平台的极致客户服务体验。”链家自如客使用环信实现了全媒体客服,环信帮助链家自如客打通了来自App端的客服入口+网页端客服入口+微信端客服入口,不仅可以统一接入回复且后台数据打通共享。帮助链家自如客优化了客服团队,极大的提升了效率,节省了成本。
链家自如客使用环信实现全媒体客服
同时,环信还提供“一体化”客服工作台,支持从APP、微信公众号、微博、网页、呼叫中心等渠道接入,且每个不同渠道均有不同标识进行识别。
从传统呼叫中心到全媒体客服,一场“效率”革命
随着人口红利消失,呼叫中心的升级转型将越来越普遍,2015年中国劳动力规模由2012年的9.37亿降至9.11亿人。中国劳动力人口连续4年绝对值下降企业客服面临的“用工荒”将持续扩大,运营成本将越来越高,越来越多的企业将复制环信客户“学而思”的客服转型之路,从语音呼叫中心为主转而采用全媒体客服,拥抱移动互联网。
学而思以前部署有4套客服产品包括:1,呼叫中心。2,网页客服。3,新媒体客服。4,APP客服。同时对应4个客服团队支持,相互数据不打通,尤其自开通微信客服后,咨询量增长明显,由用户数据不打通带来的用户投诉增多。而且每年10—11月是教育行业的交费季,以前主要靠呼叫中心外呼,工作量巨大,效果不满意。学而思在2015年集成环信移动客服以后,服务模式改为APP内缴费,并在APP内提供客服支持。整个2015年缴费季,APP客服部门数十人完美解决了往年数百个语音客服的工作。环信CEO刘俊彦认为:“APP客服相比电话客服大幅度提供服务效率,全渠道客服也已经成为企业刚需。”
IVR进入触摸时代,自助服务的未来,智能机器人将大显神通
传统IVR,用户需要听完所有菜单再做选择。而现在主流的ITR导航,用户只需在手机上直接选择关注的问题,简单方便。其中神州租车就采购环信移动客服,其中的智能ITR大大缓解了人工客服压力。Gartner预测到2020年,ITR将完全取代IVR全面进入触摸时代。
神州租车使用环信智能ITR缓解人工客服压力
近期李世石1:4不敌AlphaGo的事件又将人工智能推上了风口浪尖。而环信是客服行业少数自主开发智能应答机器人产品的公司,环信知识库+智能聊天机器人可以帮助人工坐席挡住80%的常见问题。同时具有以下特性:1,灵活可定制的智能会话、自定义菜单导航功能。2,预置的行业知识库,行业相关的常见问答可以一键拥有。3,与现有知识库系统对接,机器学习,智能优化知识库。4,人机无缝配合,更少的成本,更好的客户体验 。
环信首推的人机混合服务极大提高客服应答效率
环信CEO表示“人机混合服务”将是现阶段最适合也是最具效率的客户服务方式。
服务式营销,从成本中心转向利润中心
随着客服中心不断的被新时代赋予新的含义,传统的客服中心也正逐渐从成本中心向营销中心和利润中心转化。其中移动电商标杆企业楚楚街就使用环信APP IM长连接技术实现了精准商品推荐。楚楚街精准营销四步走:1,通过“客户标签”功能+“大数据分析”找到目标群体。2,通过环信移动客服的精准营销推送接口,将富媒体商品信息定向推送给目标客户。3,只要APP没被卸载,哪怕APP在后台,用户手机都能收到消息推送。4,客户选择咨询或直接购买。
移动互联网的电话外呼——金融界为电话销售配置环信APP主动营销平台
近期,环信还上线了业界首个“客户声音”产品,可以通过热点话题分析发现新畅销商品,通过情感度分析发现服务问题,来帮助企业更好的来倾听客户的声音。
最后,环信CEO预测:“随着国内SaaS客服产品的逐渐成熟完善,中小企业将全面拥抱SaaS客服,建设全媒体客户关系中心。而传统大型企业也将增量部署全媒体客服,保护已有投资,拥抱移动互联网。”SaaS客服也将逐渐成长为一个千亿级市场。同时,环信CEO认为未来远程办公,移动办公和众包客服将解决客服行业人力资源不足的问题,而环信移动客服的手机端工作后台将提供很大的助力。
环信移动客服简介
环信移动客服是全球首创的全媒体智能云客服平台。支持全媒体接入,包括网页在线客服、社交媒体客服(微博、微信)、移动端客服和呼叫中心等多种渠道。环信移动客服基于环信业界领先的IM长连接技术保证消息必达,并通过强大的智能机器人技术极大降低人工客服工作量。
环信移动客服于2014年12月上线,截至2015年底,环信移动客服共服务了12000家企业用户,现已覆盖包括电商、O2O、互联网金融、在线教育、在线旅游、移动医疗、智能硬件、游戏等20大领域的Top10客户,典型用户包括国美在线、58到家、楚楚街、随手记、海尔、51talk,链家自如客等众多互联网和传统企业。根据易观国际发布的《中国SaaS客服市场专题研究报告2015》显示:截至2015年第三季度,环信移动客服在SaaS移动端客服用户覆盖占比为77.4%,以绝对优势稳居行业第一。
收起阅读 »
客户世界专访环信CEO:选择长赛道、主打全媒体、拥抱黑科技
SaaS(Software as a Service)技术在国内呼叫中心领域已兴起多年,但直到近两年才形成风暴式的发展。当前,不仅新型互联网企业愿意采用这种布署灵活、低成本、高效率的云端技术,大量传统企业也在服务升级的推动下向SaaS模式的客服系统过渡。据行业估测国内客服软件市场需求在200亿人民币左右,未来几年中国SaaS市场将保持30%以上的年复合增长率。2015年以来,随着2B市场被资本引爆,客服行业涌现出一批专注于多渠道、智能化一体的SaaS型企业,在激烈角逐的同时也为行业带来更多创新活力。
环信创立于2013年,经过不到三年的发展,其产品已从最初的即时通迅云平台,发展到智能移动客服系统、全渠道智能客服平台。2015年,环信的移动客服产品荣获工信部颁发“最具成长性APP应用奖”;同年10月,荣获第十一届“金耳唛杯”中国最佳客户中心技术产品奖。2015年底,在易观发布的《2015中国SaaS客服市场专题研究报告》中,环信移动客服在SaaS客服移动端用户覆盖占比77.4%,居国内市场第一。目前环信已经获得四轮,总计2200万美元的融资,成为即时通迅云和SaaS客服领域融资最快、资金最充裕的平台。
近期,《客户世界》杂志对环信即时通信云CEO刘俊彦进行了专访,刘俊彦先生畅谈了环信过去3年的成长历程及对未来市场的展望。
一、创造风口与把握机遇
2013年,现在已更名为中关村创业大街的海淀图书城里有一家远近闻名的“车库咖啡”,是当时IT创业者的聚集地,环信即起步于此。
2013年陌陌上市前后,社交软件的需求一时间变得非常之火,刘俊彦是这个领域的专家,当时找他咨询如何为APP开发聊天功能的人特别多,而单独开发一套APP聊天功能非常费时费力,于是他想到将即时通讯功能做成云服务的形式让用户自主集成,这样可以高效地帮助创业者发展。
“即时通迅云”作为即时通迅领域的创新概念由环信首次提出,产品推出后,随即获得了创业者和众多企业的认可和追捧,很短的时间内平台上就发展出上万家企业用户。“风口”的效应其实是无意间被创造出来的。
据刘俊彦介绍,环信的四位联合创始人都是技术出身,他本人曾就职于RedHat(红帽)公司,有着多年开源社区项目的开发经验。创业团队平均年龄在四十岁左右,算是中年创业,因为之前都在外企工作收入比较高,所以在创业之初没有太多经济压力,也非常清楚自己的优势。选择好了产品方向,大家就本着务实的原则向前努力,最初的办公地点就在“车库咖啡”,“七八个人占两张桌子,每天早晨来上班还要占座。”
2014年5月,车库咖啡对面开了一家叫“36氪”的孵化器。开业的前一天刘俊彦和伙伴儿们过去转了转,就碰到氪空间负责人,一番交流后对方马上邀请他们入驻“氪空间”。他们周一搬家刚入驻,下午就来了两拔VC,其中就有经纬的投资人,聊了两个小时后,第二天就签署了协议。
“第一次融资可以说是一个非常偶然、随意的过程,”刘俊彦说,“我们在创业的时候并没有融资的想法,也没想到以后要怎么挣钱,会有什么样的商业模式。唯一可以想象的是,如果有几万个APP在用我们的产品,每天有几亿人连接到我们的服务器上,用我们的聊天功能谈论社会热点,交友,购物,到那个时间点价值一定会显现出来。”
在资本的支持下,公司很快走上正轨。2014年10月起,环信投入大量资源开发移动客服产品,也即从原有的PasS(PlatformasaService)平台向上延伸,做SaaS产品。 “从即时通迅云上线的第一天起,就不断有用户来找我们,希望把聊天功能做成像淘宝旺旺那样的可以嵌入到APP里的客服工具。因此,移动端的客服产品可以说是在用户真实需求的趋动下自然而然地开发出来的。开始的时候你其实不知道商业模式,当你每天接触几百个用户,有几千个公司、几万个人在用你的产品的时候,商业模式自然而然就形成了。”
2015年4月环信移动客服上线,在当时的时间点上,APP中有内置客服的产品只有“淘宝旺旺”和京东的“叮咚”。通过把PaaS平台的老用户成功转化为SaaS平台的新客户,环信在自己创造的风口上再次成为了移动端客服软件的领跑者。2015年5月环信获得B轮1250万美金融资,签约付费客服席位4万个,典型用户包括国美在线、58到家、楚楚街9块9等上百家互联网知名企业。
2016年伊始,环信基于当前客服市场对统一解决方案的需求再次推出全渠道智能客服产品。
二.以机器人、大数据确立竞争优势
据2015年“双十一”天猫的销售统计数据,接近70%的订单来自移动客户端,这意味着客户服务未来会越来越多地向移动端倾斜。同时,社交媒体的发展不仅连接了人与人、人与商业,未来还将连接一切,因此这种连接的价值一定要在未来的客服软件中体现出来,而客户不仅仅是通过微博、微信等社交工具向企业寻求帮助,还会有更多的用户之间的互动与互助需求需要被满足。刘俊彦认为移动化、社交化、智能化与个性化是未来客服软件产品应该具备的特性。未来客服工具不仅要具备全渠道接入、质检、统计、知识库查询等基础功能,还需要智能化和大数据的能力来帮助客户更好地提升服务效率并进行精准的二次营销,帮助企业客服中心成为真正的利润中心和价值中心。此外,SaaS客服软件具有的定制化优势可以很好地满足客户个性化需求,企业用户可根据自己的特点和需求自定义设置系统模块。
针对未来客服产品的发展趋势,环信产品目前除了拥有完善的基础功能外,还在机器人研发及大数据分析方面做了大量的投入和部署。据刘俊彦介绍,目前人机混合的智能机器人问答、客户画像等先进技术已进入生产内测环节。未来环信产品的差异化优势除了原有IM长连接技术外,将更多体现在商业化智能分析、智能机器人问答、大数据分析与挖掘等方面。黑科技领域的技术优势将在下半年的竞争中逐渐显现出来。
“我们现在做人机混和,当机器人回答不了客户问题时,会转人工座席,人工座席回答的同时,我们会把会话同时‘喂’给机器人,机器人不断的自动学习人工坐席的回答,并根据知识库和以前的知识积累,自动提示座席回答内容,座席看到提示靠谱,只要点击一下就可以发送给客户,这对工作效率是极大的提高。”
刘俊彦说:“资本投入上的差异是非常关键的,研发上的投入一定能从产品上体现出来。我们花了大力气和大价钱找到最优秀的人才加入我们。像人工智能、机器学习领域的顶尖人才,说服他们加入,光靠好的待遇是不够的,更重要的是用愿景来打动他们。”环信目前拥有180名员工,其中90是研发人员,是一支技术导向型的团队。
统计资料显示,中国目前企业总数5000万家,而IT普及率不及5%。对标美国市场,美国的企业总数不及中国企业数量多,但IT普及率达到50%。在企业服务领域,美国有四五家几千亿美金市值的巨头公司,如微软、SAP、ORACLE等,但在中国SaaS领域还没有大型公司出现。当前中国大量的企业在做“互联网+” ,谁来满足这批用户的需求,就有可能成为中国企业级服务市场的巨头。“这是一个非常大的增量市场,我们能吃下十个亿就是一个很好的公司了。”刘俊彦对市场未来充满信心。
有人把未来世界的产业格局划分为三个维度,一维:传统产业;二维:互联网产业;三维:智能科技产业。而将二维产业升级为三维产业的关键力量是大数据的崛起。未来一切竞争归结到最后都是数据的竞争。当前,智能客服机器人和大数据技术是带动整个服务产业升极的核心技术。
从用户需求出发,选择长赛道、拥抱尖端技术,做市场的引领者是环信始终的选择。
三.访谈实录
Q:目前的很多大型传统型企业已经有了成型的传统呼叫中心平台,您如何看待他们对全渠道平台的引入?
A:这些企业之前自建投入非常大,我们的策略是让他们在继续保留这些投资的同时,帮助他们拥抱移动互联网。我们提供一套在线客服系统,让他们可以连接微博微信网页和APP,不仅有KPI考核、统计等常用功能,还有先进的机器人客服,可以和原有呼叫中心无缝打通,比如一个人以前通过电话找过你,再通过微信,网页等渠道进来,你依然可以识别他,并且知道之前的交互记录,数据是完全互通的。而且还能做统一排队,比如一个服务交互在微信上没有解决问题,客服人员提示客户电话接入,这时电话再次接入到的一定是刚才服务过你的那个座席。因此客户可以在投入不大的情况下就可完成“互联网+”的升级。
Q:您提到统一排队的概念,我想深入问一下,这也是我在很多客户那里遇到的问题 。因为在线渠道是即时的,语音渠道是实时的,比如一个提供三种服务的座席,也叫全技能座席,正在接听一通电话,这时有一个实时的微信推送过来。正常来讲排队系统应该能识别到座席的状态不能接入这个业务,对于这个问题,您是怎么解决的?
A:这是很多做客服软件的厂家遇到的一个特别大的困扰。我们针对大型用户的解决方案一般会把语音座席和即时座席分开,因为实时和即时不可能做到统一排队,这是两个互斥的行为。我们提供一种最佳解决方法,软件是一个全技能的座席软件,座席也是一个全技能的座席,但是状态可以切换,比如企业准备在晚上6点多做一个促销活动,预测6点半从微信、APP渠道会接入大量客户请求,那么这个企业6点25分把十个座席从语音状态全部切换到在线座席的状态,同一组人、同一台PC、同一个软件实现渠道间的切换。我们认为做到这点就很好了。
Q:您的 SaaS平台,如何保障客户的数据安全?
A:我们从以下几个层面保护:首先我们和每个用户都有签署严格的法律协议,公有云上客户的数据全部是客户自己的,我们不会碰,客户有完全的处理权。第二从技术架构上进行运维监控,我们内部的运维人员分层,公司里目前只有两个人,不包括我在内能进入到数据库,其他运维人员只有服务的运维权限没有数据权限。而他们也和公司签定了严格的法律协定,任何一举一动都会被系统监控。出了未经授权的问题会承担法律责任。第三,我们是一个多租户系统,租户间的数据都是完全隔离的。第四我们长期聘请第三方安全公司对公有云平台做扫描,进行服务升级,确保不出现任何安全上的漏洞。
Q:关于“客户画像”,你们在具体服务中是帮助客户做一些分析还只是把数据给到客户让他自己去分析?
A:用户画像是主动营销的核心技术,举个例子,我们有个规模很大的电商用户,在后台做了一个大数据挖掘,找到2万名妈妈,打上标签,然后再从中找到所有2-4岁小孩的妈妈2千名打上标签,通过我们客服软件的群发接口给目标用户推送儿童汽车坐椅的消息。客户点击后并不是进入一个广告页面,而是进入一个和真人对话的一对一的聊天页面。这种营销方式比企业之前毫无差异地群发广告提高了20多倍的客户转化率。这项技术有两个核心点,一是基于大数据的用户精准画像和标签;二是APP主动营销,这是对过去外呼时代呼叫中心主流营销模式一个质的改变。可以理解为它是一种APP的外呼技术,代替了以往的电话通道,但对用户干扰非常小。
Q:我们的产品可否满足运营人员对于管理工具的定制化需求?在使用中客制化是否方便、速度如何?
A:我理解这个问题的核心是报表和统计,再往上说是数据和挖掘。以前的软件产品会提供很多报表,但这个时代过去了,因为对于太多的报表客户经常会不知道怎么用,而且用户永远都有层出不穷的新报表需求,那种写死的报表无法与时俱进。我们现在所有的数据分析和报表都是基于发现式的BI和大数据挖掘。以前的报表改不了,而发现式BI则是根据大数据引擎不断挖掘出各种结果。用户可以自行灵活配制界面,你需要什么指标,什么图都可以自行配制。新时代的大数据公司全是做这种发现式的报表,这是一项非常核心的技术。
Q:我们能满足企业自建平台的需求吗?
A:会满足,因为中国现状是这样,尤其是投资、金融、印刷等行业有严格规定,数据就是不能出公司。我们也是可以做私有云。私有云客单价高。
Q:我看到环信经常发布一些交流活动信息,比如组织iGEEK GAMP沙龙、APP运营沙龙?这些活动举办的初衷是什么?影响如何?
A:我们的PaaS产品(即时通迅云)为我们的SaaS产品贡献了很多优质客户流量,我们需要用这种社区的方式来维护和构建深度的开发者关系。我们认为,未来客户管理产品将是一个生态体系中的产品,SaaS产品只是一个基础软件,上边会长出很多小的分支,比如一些定制化需求,由其它的第三方团队来做,我们给他们提供API接口,进行定制化开发。我们通过环信的这些社区活动聚集了一批开发者团队,这也是为我们未来生态圈的布局做积累,做蓄水池,这是其他行业竞品所不具备的。 从产品角度来说,做客服软件最大的痛点就是刚才提到的高级和大型用户的复杂定制化需求,如何解决,就是通过环信的PaaS平台,把基础功能开放出来,不仅做自己的产品也让合作伙伴在这个平台上做二次开发,比如开发者可以在我们平台上做一个专门的报表模块。这应该是所有的SaaS厂商的必由之路,但这需要底层的平台有很好的扩展性和开放性,这在技术上的门槛非常高。
这实际就是生态圈的玩法。生态圈相当于一个核武器,超越产品是有可能的,但想超越生态圈难度太大了。
收起阅读 »
关于昵称头像用户信息存储讨论
---------割---------
写在前面的话:
集成环信即时通讯的时候,相信大家都有问过这个问题,“昵称头像怎么实现?”
如果你的你的昵称头像已经实现,请直接跳到文章末尾进入讨论!
在回答这个问题前先简单介绍下环信对于昵称头像的设计:
环信只是即时通讯的消息引擎。环信本身不提供用户体系,环信既不保存任何APP业务数据,也不保存任何APP的用户信息。比如说, 你的APP是一个婚恋交友APP,那么你的APP用户的头像,昵称,身高,体重,注册电话号码,注册邮箱等信息是保存在你自己的APP业务服务器上,我们服务器端不保存任何用户具体信息。
环信这样设计的目的有2个:
1. 尽量少的侵入开发者自己APP的业务数据和用户体系。用户体系是一个APP的最最核心的数据,在当前中国的环境下,部分开发者会比较难信赖一个第三方厂商,把自己最关键的用户体系信息托管到一个第三方平台上。
2. 大多数APP都有自己的服务器后台,有自己的用户体系。所以环信要尽力做好的环节是尽可能方便开发者把环信和自己的用户体系集成,而不是为开发者提供他们可能并不会用的用户体系。
不知道大家看明白了没有,如果有疑问接着往下看
集成环信即时通讯在实现昵称头像方面推荐两种做法
方法一 从APP服务器获取昵称和头像
方法二 从消息扩展中获取昵称和头像
关于两种方案的实现思路与对比优缺点在连接后面也有阐述。
思路给出来,大家就按照着做吧,在做的过程中也收到了一些小伙伴们的吐槽,能不能有现成的参考呀?于是环信在后来的demo中就实现的昵称和用户信息,小伙伴们又可以愉快的敲代码了!
关于demo 的昵称头像需要给大家说明的,这里非常重要,请接着往下看:
demo使用的的存储使用了parse的服务,有一些开发者可能会直接copy了demo中的代码也使用了parse来存储昵称和用户信息,parse的服务快要到期了,还有两个月就会迁走,我们想统计下有哪些用户用了parse的服务?
今天要讨论的事情就这么多,大家如果使用了parse请告诉我们,作为环信的用户肯定是要对大家负责的,会给出一个解决方案,或者直接提供一套这样的服务。
收起阅读 »
没有表情呢
环信直播课堂第七期--3.xSDK实时音视频的集成
持续时间:半小时
描述:教你如何从零开始,用环信ios sdk实现即时视频和聊天
本期环信直播课堂将由环信IOS工程师fudh给大家详细讲解集成3.0 SDK实时音视频
直播观看地址: http://www.imgeek.org/video/15
视频回放地址:http://www.imgeek.org/video/24 收起阅读 »
环信CEO:从传统呼叫中心到全媒体客服,一场“效率”革命
2016年4月8日,由江苏智恒发起的《企业通信与呼叫中心技术发展论坛》在江苏南京圆满落幕。环信做为全媒体智能云客服倡领者受邀参加了本次行业盛会,环信CEO刘俊彦在大会与现场的数百位行业精英一起分享了题为《全媒体智能客服时代的最佳实践》的主题演讲。
本次论坛活动旨在促进新兴通信技术在企业通信呼叫中心领域的推广、提高企业的通信能力、提高企业部署通信和客户服务平台时的策划水平。包括开源软交换技术,基于浏览器模式的实时通信技术,视频直播技术,呼叫中心领域中的智能化和多渠道客户体验技术。
2015年作为中国企业级服务元年,同时也是SaaS服务元年,尤其在客服领域诞生了一大批以产品技术驱动的SaaS公司,而以全媒体、智能化、移动化为主打的环信移动客服更是其中的翘楚,不到一年时间内服务了1万多家企业,并且在融资额和市场份额上也遥遥领先。
从传统呼叫中心到全媒体客服,一场“效率”革命
随着人口红利消失,呼叫中心的升级转型将越来越普遍,2015年中国劳动力规模由2012年的9.37亿降至9.11亿人。中国劳动力人口连续4年绝对值下降企业客服面临的“用工荒”将持续扩大,运营成本将越来越高,越来越多的企业将复制环信客户“学而思”的客服转型之路,从语音呼叫中心为主转而采用全媒体客服,拥抱移动互联网。
学而思以前部署有4套客服产品包括:1,呼叫中心。2,网页客服。3,新媒体客服。4,APP客服。同时对应4个客服团队支持,相互数据不打通,尤其自开通微信客服后,咨询量增长明显,由用户数据不打通带来的用户投诉增多。而且每年10—11月是教育行业的交费季,以前主要靠呼叫中心外呼,工作量巨大,效果不满意。学而思在2015年集成环信移动客服以后,服务模式改为APP内缴费,并在APP内提供客服支持。整个2015年缴费季,APP客服部门数十人完美解决了往年数百个语音客服的工作。环信CEO刘俊彦认为:“APP客服相比电话客服大幅度提供服务效率,全渠道客服也已经成为企业刚需。”
IVR进入触摸时代,自助服务的未来,智能机器人将大显神通
传统IVR,用户需要听完所有菜单再做选择。而现在主流的ITR导航,用户只需在手机上直接选择关注的问题,简单方便。其中神州租车就采购环信移动客服,其中的智能ITR大大缓解了人工客服压力。Gartner预测到2020年,ITR将完全取代IVR全面进入触摸时代。
近期李世石1:4不敌AlphaGo的事件又将人工智能推上了风口浪尖。而环信是客服行业少数自主开发智能应答机器人产品的公司,环信知识库+智能聊天机器人可以帮助人工坐席挡住80%的常见问题。同时具有以下特性:1,灵活可定制的智能会话、自定义菜单导航功能。2,预置的行业知识库,行业相关的常见问答可以一键拥有。3,与现有知识库系统对接,机器学习,智能优化知识库。4,人机无缝配合,更少的成本,更好的客户体验 。
最后,环信CEO预测:“随着国内SaaS客服产品的逐渐成熟完善,中小企业将全面拥抱SaaS客服,建设全媒体客户关系中心。而传统大型企业也将增量部署全媒体客服,保护已有投资,拥抱移动互联网。”SaaS客服也将逐渐成长为一个千亿级市场。
环信移动客服简介
环信移动客服是全球首创的全媒体智能云客服平台。支持全媒体接入,包括网页在线客服、社交媒体客服(微博、微信)、移动端客服和呼叫中心等多种渠道。环信移动客服基于环信业界领先的IM长连接技术保证消息必达,并通过强大的智能机器人技术极大降低人工客服工作量。
环信移动客服于2014年12月上线,截至2015年底,环信移动客服共服务了12000家企业用户,现已覆盖包括电商、O2O、互联网金融、在线教育、在线旅游、移动医疗、智能硬件、游戏等20大领域的Top10客户,典型用户包括国美在线、58到家、楚楚街、随手记、海尔、51talk,链家自如客等众多互联网和传统企业。根据易观国际发布的《中国SaaS客服市场专题研究报告2015》显示:截至2015年第三季度,环信移动客服在SaaS移动端客服用户覆盖占比为77.4%,以绝对优势稳居行业第一。 收起阅读 »
你的公众号为什么总是留不住粉丝?
当然,每天少数几个粉丝取关确实是正常的,特别是在文章推送或者微信活动之后,会出现较平常多的掉粉现象。正常的粉丝取关可以起到甄别非目标受众,为微信公众号沉淀优质粉丝的良好作用。
然而,对于很多刚刚起步的公众号来说,当看到自己的粉丝好不容易涨了三十个,却掉了十五个,相当痛心的一件事不是吗?你仍然紧盯着如何如何快速涨粉,关注着又新增了多少多少个,唯独忽视了取关的那部分;或者看到了,然后惋惜一下,就再没有然后了。第二次、第三次,以致每一次,掉的粉丝快赶上增的粉丝了,还能无动于衷吗?
草莓君认为,公众号无论大小,粉丝无论多少,当每天持续不断有较多粉丝流失时,该停下来,认真找找原因:为什么粉丝会取关?怎样减少粉丝的再取关?
>>>>从粉丝关注解读粉丝取关的深层原因
为什么会关注一个公众号?无非是因为它对于关注者来说,有价值。这种价值有多种表现形式,可能是对受众有某种知识方面的教导(如:运营干货、化妆技巧);可能为受众提供了即时资讯(如:早间新闻、一天热点);也可能给受众带来精神层面的满足(如:笑话、情感读物);当然这只是内容方面的价值。
还有一些公众号,通过二次开发,作为为受众提供实实在在服务的工具而存在,比如订票类公众号。往往,这种带有实质性服务的公众号,粉丝粘性会更高,因为关注的用户确实并且持续需要这样的服务。
由此就可以推断出:取消关注一个公众号,往往是因为它所提供的价值不能满足需要,对于关注者而言,没有了存在的意义。我为什么要留着一个对我毫无用处的东西呢?果断取关就在一瞬间。
好比,“活动盒子”公众号的定位是为广大运营人员提供运营干货、营销技巧,粉丝关注之后却想要知道如何做具体的抽奖活动,两个目的出现了分歧,公众号无法提供这样的服务来满足粉丝的要求,粉丝得不到她想要的,最终也就取消了关注。
>>>>从公众号的内容了解粉丝取关的基本原因
1、推送的内容和微信公众号的定位有过大的出入,主题混乱,不按常理出牌。一个美食公众号整天教你怎样化妆,做运营干货的老发心灵鸡汤,这得多突兀啊。完全就是怎么任性怎么来,粉丝本来就是冲着能提供如定位所说的价值而关注的,内容一旦脱离了定位,价值也就不复存在了。对广大粉丝来说,现在不取关更待何时呢?因此,不要轻易改变公众号的定位,推送不相关的内容。
2、推送的内容质量低、伪原创乃至同质化严重。据统计,2016年微信公众号的数量已超千万,每天推送的消息多达70万条,再加上公众号之外的网络平台,受众每天接收的信息不计其数,有太多的途径可以选择。
当所关注的公众号长期推送一些东拼西凑的伪原创文章,或者直接转载一些被转烂了的文章,又或者老写一些流水账式的文章,毫无亮点可言。最终会让粉丝觉得,这就是一个随随便便的公众号,没有实质的内容引起自己的兴趣和共鸣,自然选择了取关,再选个更符合自己要求的同类型公众号进行关注。
图片来源:企鹅智酷
3、微信公众号长时间不推送,成为名副其实的“僵尸号”。公众号又分为服务号和订阅号,订阅号每天都可以推送一次,而服务号只能每个月推送四次。但不管是什么号,如果粉丝长时间等不到内容更新,每次点开都只有N久前的消息,活跃度低的可怜,也就被当成一个“弃号”取关。
因此,对于推送的一些建议,盒子君认为:服务号应该每个星期推送一次,每个月四个星期,正好用完四次推送。订阅号的话,要按照每个号的性质和定位来决定推送的周期,像某些新闻、资讯、每日定点更新类的必须一天推送一次;而其它的如果不是每天推送,最好也要定好隔几天推送一次或者一个星期推送几次。目的就是在粉丝面前刷存在感,增加活跃度。
4、内容排版混乱,阅读体验太差。想象一下,读一篇文章,图片忽大忽小,忽左忽右;文字不分段,全堆在一起;这里明明用的是宋体,那里又变成了黑体;该表明小标题的地方又没有标出来;错别字还一揪一大堆。几千字的文章用手机阅读本来就够呛,又各种排版混乱,还能好好读下去吗?
如果说是赶时间推送,几次的失误就算了,次次都是这样,再好的文章,印象分也被磨灭了。忍无可忍之时就是取关之日。所以,请多花点时间,认真做好排版,让受众看的舒服。
5、推送的内容带有明显的广告营销性质。如果你没有达到相当的水准,请不要轻易给自己的文章插入广告。不要把粉丝当傻瓜,也不要妄想着你的粉丝会为你的广告买单,目的和利益性太过明显只会让粉丝觉得烦,久而久之也就取关了。当然,如果你能达到“王左中右”公众号中,文章广告插入的炉火纯青程度就完全没有问题了。
图片来源:公众号“王左中右”
>>>>从细节方面分析粉丝取关的可能原因
粉丝留言处理不当,引起不满甚至反感。有些公众号显得过于高冷,极少回复粉丝留言,或者回复的官方敷衍,这都不利于增强粉丝粘性。
通常粉丝留言说明对文章表现出了强烈的兴趣,不管好坏,都是一种反馈。作为公众号的运营人员,应该及时处理好粉丝留言,特别是提出了某些疑问等待回答的,要在第一时间发现并答复,让粉丝感觉得到了该有的重视。另外,如果粉丝表达了自己的反对观点,应该表示理解,不能用过激的语言进行争辩,作为一个公众号,必须展现出大度。
另外,粉丝互动不够、文章推送时间没选好也会影响到粉丝取消关注的情况。
总而言之,如果微信公众号粉丝出现较为异常的取关情况,可以从以上几大方面入手分析挖掘原因,然后对症下药,防止粉丝再流失。但并不是所有的粉丝取关都是不好的,我们需要正确看待这件事。
文/活动盒子
收起阅读 »
【产品快递】WebIm V1.1.0发布,网页端新增聊天室功能
版本:V1.1.0 2016-4-6:
功能改进:
1. 将表情包移除sdk,变为可自定义导入配置。
2. 增加XMPP连接多resource支持的参数。
3. 对于不支持wss,如qqX5内核浏览器,自动降级为https long polling。
4. 增加聊天室功能,在线聊天室列表,加入聊天室,退出聊天室等接口
5. 与之前版本sdk部分api已不兼容,添加shim.js,做降级支持
6. 新增消息发送的成功失败回调
7. 重整目录结构,优化代码,bug fix
easemob webim sdk已支持如下功能:
1.sdk本身已支持IE8+、FireFox、Chrome、Safari之间文本、表情、图片、音频消息相互发送
2.sdk支持web端之间,web端与app端相互添加、删除好友功能
3.sdk支持与ios、android sdk见相互发送文本、图片、音频消息
4.sdk提供部分公共方法,具体参见quickstart.md
5.sdk对于消息的处理方式如下:
1)文本消息,直接发送,接收方接收到为文本消息
2)表情消息,sdk得到表情对应的编码后,发送的文本消息,接收方接收到后处理根据编码还原表情
3)图片消息,sdk上传图片到聊天服务器,然后发送图片基本信息消息,消息中带有发送方上传的图片url等,接收方根据图片url、secret和自身的登录信息,以流的形式从服务器上下载图片到本地显示
4)音频消息,sdk上传音频到聊天服务器,然后发送音频基本消息消息,消息中含有发送方上传的音频url等,接收房根据音频url、secret和自身的登录信息,以流的形式从服务器上下载音频到本地播放
6.跟随sdk会有简单的demo,方便大家参考,已实现简单的聊天添加删除好友功能。
7.对于amr格式音频FF、Chrome、IE、Safari已实现接收方对收到后音频下载,调用本地播放器实现播放。
8.支持群组线聊天功能,显示群组成员列表
9.支持陌生人聊天功能
测试环信WebIM请访问 https://webim.easemob.com
登录可以使用环信UIDemo的账号和密码(见http://www.easemob.com/demo)
环信WebIM快速入门文档请见:https://github.com/easemob/web-im/blob/master/static/sdk/quickstart.md
更多关于环信的开发文档请见:https://docs.easemob.com
WebIm V1.1.0 下载
↓↓↓
收起阅读 »
环信视频直播在线技术支持下周正式上线
详情如下
在咨询问题的过程中,描述不清楚问题怎么办?
解决问题的过程中,工程师给出的解决方案自己看不懂怎么办?
环信视频直播答疑已开启,面对面交流,工程师还通过分享桌面的形式演示,以后再也不用担心交流困难,看不懂解决方案了。
不知道小伙伴们去体验了没有?反正用过了都说好用哈!
这里要做一个公告:“视频直播技术支持暂停一周,下周正式上线!”
这周我们在做界面还有内容优化,保证下次上线时给各位开发者童鞋更好的体验!
当然如果小伙伴们上班过程中因为环境限制不能观看直播,也可以去原有的渠道联系环信技术支持哈。
最后就是欢迎大家吐槽啦,对视频直播技术支持有任何问题建议欢迎评论留言,老规矩,直接现金打赏! 收起阅读 »
环信荣获2015开发工具及服务年度最佳品牌影响力奖
即将于2016年1月15日举办的【2015开发工具及服务年度大奖评选颁奖典礼】上,除各个获奖厂商前来领奖外,主办方还为所有获奖厂商制作珍藏版纪念奖杯,表彰其过去一年来的卓越成绩,以期鼓励开发工具及服务从业者在2016年继续耕耘,为行业贡献更全面细致的服务、更夯实稳健的工具。
随着开发工具及服务不断涌现,从云服务、即时通讯、安全到统计监测、人工智能、物联网平台等,越来越多的从业者提供了优质的服务,也有越来越多的开发者从中受益,综合提高了开发效率。2015开发工具及服务年度大奖评选是CSDN创立的针对开发工具及服务的评选大奖,目的在于推动开发服务及工具质量的提升,提高行业的专业性,表彰行业内的优秀的工具/服务提供商,从而激励整个行业的从业者,促进行业的发展。
最佳品牌影响力奖
【环信】
入选理由:
2015年,环信进击移动客服领域,由PaaS到SaaS。旗下拥有两个产品,IM云和移动客服,一个是PaaS一个是SaaS,两个产品的技术跨度比较大,但基于自身PaaS的SaaS产品的优势也不言而喻,环信未来会将移动客服推向两个方向:一是更智能,二是建立生态圈和平台。收起阅读 »
环信首席架构师:一个单元化架构的例子
为什么要有架构实践?
很多人喜欢的是细节,因为有句名言叫魔鬼在细节里,于是都去细节里寻找魔鬼。但是打败了魔鬼就能看到天使么?未必。细节其实是最容易掌握的部分,细节之外还有很多。就像有了水泥和沙子,你能够做出混凝土,但是离建成高楼大厦还有很长的路要走一样,你要学着去设计架构。
但是事情并没有完,就像没有唯一的真理一样,架构也并不是只有一种。你不可能一朝学会,从此天下无敌。如果要赈灾,你需要的是帐篷,如果要重建,你需要的是瓦房。不同的住所需要的是不同的架构。
不同的服务也需要不同的架构设计,这也就是我们需要架构实践的重要原因。在这之后的原因,是我们做任何服务,都要考虑服务的性能和成本。
但优化有很多方式,为什么是架构呢?诚然,从硬件到操作系统,从共享库到应用软件,从算法到架构,每一层都可以优化,但每一层所做的工作量和收益也都是不同的。架构可能是需要投入最多精力的,但在很多时候却也是很少的可以提供超过数量级的提升方式。
所以,思维方式的转变才是你最应该在意的部分,单元化只是一个例子,而粉丝服务平台只是这个例子的例子,而已。
言归正传,接下来本文将从三个问题来介绍这次实践,单元化是什么,为什么要用以及我们如何做到的。
1. 单元化是什么
单元化架构是从并行计算领域发展而来。在分布式服务设计领域,一个单元(Cell)就是满足某个分区所有业务操作的自包含的安装。而一个分区(Shard),则是整体数据集的一个子集,如果你用尾号来划分用户,那同样尾号的那部分用户就可以认为是一个分区。单元化就是将一个服务设计改造让其符合单元特征的过程。
图 1 :洋葱细胞的显微镜截图,单元化要达到的目的就是让每个单元像细胞一样独立工作
在传统的服务化架构下(如下图),服务是分层的,每一层使用不同的分区算法,每一层都有不同数量的节点,上层节点随机选择下层节点。当然这个随机是比较而言的。
图 2 :传统的服务化架构,为伸缩性设计,上层节点随机选择下层节点
与其不同的是,在单元化架构下,服务虽然分层划分,但每个单元自成一体。按照层次来讲的话,所有层使用相同的分区算法,每一层都有相同数量的节点,上层节点也会访问指定的下层节点。因为他们已经在一起。
图 3 :单元化架构,为性能和隔离性而设计,上层节点访问指定下层节点
2. 为什么要用单元化
在性能追求和成本限制的情况下,我们需要找到一种合适的方法来满足服务需求。在传统的分布式服务设计,我们考虑的更多是每个服务的可伸缩性,当各个服务独立设计时你就要在每一层进行伸缩性的考虑。这是服务化设计(SOA)流行的原因,我们需要每个服务能够单独水平扩展。
但是在摩尔定律下,随着硬件的不断升级,计算机硬件能力已经越来越强,CPU越来越快,内存越来越大,网络越来越宽。这让我们看到了在单台机器上垂直扩展的机会。尤其是当你遇到一个性能要求和容量增长可以预期的业务,单元化给我们提供另外的机会,让我们可以有效降低资源的使用,提供更高性能的服务。
总体而言,更高性能更低成本是我们的主要目标,而经过单元化改造,我们得以用更少(约二分之一)的机器,获得了比原来更高(接近百倍)的性能。性能的提升很大部分原因在于服务的本地化,而服务的集成部署又进一步降低了资源的使用。
当然除了性能收益,如果你做到了,你会发现还有很多收益,比如更好的隔离性,包括请求隔离和资源隔离,比如更友好的升级,产品可以灰度发布等。单元化改造后对高峰的应对以及扩容方式等问题,各位可以参考#微博春节技术保障系列#中的单元化架构文章,也不在此一一赘述。
3. 我们如何做到
此次单元化改造基于微博现有的业务,因此这里也先行介绍一下。粉丝服务平台是微博的内容推送系统(代号Castalia),可为V用户提供向其粉丝推送高质量内容的高速通道(单元化之后已到达百万条每秒)。整个服务涉及用户筛选、发送计费、屏蔽检查、限流控制和消息群发等多个子服务。由于改造思想相通,这里以用户筛选和消息群发两个服务为例,下面两图分别为商业群发在服务化思想和单元化思想下不同的架构。
图 4: 服务化思想下的商业群发架构设计(旧版)
图 5 :商业群发在单元化思想下的架构设计(新版)
对于筛选服务,在服务化架构里,需要去粉丝服务获取粉丝关系,然后去特征服务进行用户特征筛选,最后将筛选结果传输到群发服务器上;而在单元化架构里,粉丝关系直接就在本地文件中,用户特征服务也在本地,最后的筛选结果再不需要传输。服务本地化(粉丝关系和用户特征存储)减去了网络开销,降低了服务延时,还同时提高了访问速度和稳定性,而筛选结果本地存储又进一步节省了带宽并降低了延迟。以百万粉丝为例,每次网络操作的减少节省带宽8M左右,延时也从400ms降为0。
群发服务同样如此。由于在服务化架构里,我们使用MySQL和Memcache的方案,由于关系数据库的写入性能问题,中间还有队列以及相应的队列处理机,所有四个模块都有单独的机器提供服务,而在单元化架构里,四合一之后,只需要一套机器。当然机器的配置可能会有所提升,但真正计算之后你就会发现其实影响微乎其微。原因除了前面介绍的硬件增长空间外,上架机器的基本配置变高也是一个原因。而且,在单元化方案里,当我们把缓存部署在本地之后,其性能还有了额外的20%提升。
一些业务特有问题
不过群发这个场景,我们也遇到了一些特定的问题,一是分区问题,一是作业管理。这里也与各位分享下我们的解决方法。
分区问题分区问题其实是每个服务都会遇到的,但单元化后的挑战在于让所有服务都适配同一分区算法,在我们的场景下,我们按照接收者进行了分区,即从底层往上,每一层都来适配此分区算法。这里有特例的是用户特征和屏蔽服务,由于总体容量都很小,我们就没有对数据进行分区,所有单元内都是同一套全量数据,都是一个外部全量库的从库。不过由于本单元内的上层服务的关系,只有属于本分区的用户数据被访问到。所以,适配同一分区算法在某种程度上讲,可以兼容即可。
作业管理按照前面的分区方式,将群发服务的整体架构变成了一个类似Scatter-Gather+CQRS的方案,因为Gather不是一个请求处理的必须要素。也就是说,一个群发请求会被扩散到所有单元中,每个单元都要针对自己分区内的用户处理这个群发请求。广播方式的引入,使得我们首先需要在前端机进行分单元作业的处理监控,我们在此增加了持久化队列来解决。同时,由于单元内每个服务也都是单独维护的,作业可能在任何时间中断,因此每个作业在单元内的状态也都是有记录的,以此来达到作业的可重入和幂等性,也就可以保证每个作业都可以在任何时间重做,但不会重复执行。
除此之外,我们还对服务器进行了更为精细的控制,使用CPU绑定提高多服务集成部署时的整体效率,使用多硬盘设计保证每个服务的IO性能,通过主从单元的读写分离来提高整体服务等等。
后记
我平时不善文章,现在要成文发表,还是有一点紧张的。不过想到或许可以抛砖引玉,有机会向各位大牛学习,或者跟各位同学一起交流,内心又有些许期待。关于微博或者其他任何网站的设计,欢迎大家一起探讨,随时在微博恭候。
收起阅读 »
Android Studio 2.0 导入环信Demo3.10 问题
在这里主要介绍后面四个文件夹内容:
doc文件夹:SDK相关API文档第二步我们要导入的是examples文件夹里的内容
examples文件夹:ChatDemoUI(为开发者能够更深入理解SDK而提供的一个demo)
libs文件夹:拥有实时语音,实时视频功能的SDK(大小在1.34M左右)包和.so文件
libs.without.audio文件夹:无实时语音,实时视频功能的SDK包(大小在900多K)
tools官网没给解释(未知)
接下来删除两个文件夹下的build.gradle
第三步导入项目 我是在打开项目的基础上又重新打开一个界面,导入方式就不多说了
导入后项目的运行可能是灰色的 我们通过进入Project Structure来先删除mod,在次导入mod 导入时选择easeUIDemo
第四步导入jar和io文件
在自行开发的应用中,集成环信聊天需要把libs文件夹下的easemobchat_2.1.6.jar和armeabi目录导入到你的项目的libs文件夹底下,如果不需要语音和视频通话功能,导入libs.without.audio下的jar文件即可。(这是环信文档)由于我是集成即时通讯,真实文件是下面这两个,复制粘贴到libs文件夹下
报错:
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 =
}
然后就可以了,自己遇到的问题,希望能帮到面临这些问题的人
本篇Android studio集成由环信热心开发者提供,博客请点击Crazy丶code 收起阅读 »
环信直播课堂第六期--2.x和3.x的单聊的集成
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年,如何突围缺钱、缺人、缺流量关卡,加速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姜孟君
企业级和互联网解决方案双料专家,多年大数据资深从业者,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张溪梦
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西南区技术总监李小川
八年互联网产品测试及质量管理经验,曾任北京邮电大学信息安全中心研究员、华为测试经理、北京云蜘蛛科技副总,曾担任过6个运营商级项目的测试经理,对于产品质量控制和自动化测试有丰富的经验。
分享主题:《APP全生命周期质量》
互联网的根本是用户,APP产品如何留住用户?红利、互联网推广还是好的用户体验?根据Testin数据分析,随着移动互联网人口红利的逐步消失,新用户的比例在逐步减少,相反,老用户的比例攀升。这一变化预示着用户对于应用的选择将越来越苛刻,部分用户体验较差、运营不佳的应用将被迅速淘汰。因此,如何做好APP质量,提升用户体验是重点。
如何做好APP产品质量,Testin分享APP质量之APP全生命周期测试:功能、兼容、性能、体验、压力、安全。
4、分享嘉宾:环信高级产品市场经理谢韩
IT行业跨领域市场研究者,先后从事网络、安全、互联网领域的市场研究与分析工作,对商业技术趋势有较深理解。
分享主题:《资本寒冬,APP如何提升造血能力》
随着外部资金渠道的趋紧,依靠APP自身实现内源性增长成为必然的选择,这就需要App能够自我造血,具备吸引用户和转化用户的能力。在这个过程中,连接人与人的IM技术,连接人与商业的移动客服,是帮助App建立社区,实现商业变现过程中的有力助手。在此基础上,基于连接属性所进行的人群和内容大数据分析,也能够推动App实现精准化营销和精细化运营。
5、分享嘉宾:猿团科技创始人&CEO谢恩明
80后青年创业者,十年连锁企业负责人。08年加入互联网行业,曾任职于金山、腾讯,具备丰富的客户服务、企业培训、企业管理等经验。之后创立猿团科技,担任CEO,猿团科技在他的带领下,半年时间从估值两千万到两个亿,随后创立猿团投资公司,猿团传媒公司,目前已经帮助40+个项目进行创业。
分享主题:《App+》
报名请点击阅读原文
收起阅读 »
【活动报名】HTML5 app轻架构高性能开发交流会,4月9日北京
如果认为这是危言耸听,那么你危险了。在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层即到)
【主办方】
【合作伙伴】
阅读原文 收起阅读 »
Android 3.1.1, iOS3.1.1 release
新功能:
音视频增加弱网/断网检测功能;
音视频增加音频、视频流暂停、恢复功能;
音视频增加录制功能;
发送图片默认压缩图片,节约流量;
bug fix:
Fix iOS demo退到后台后某些情况下crash的bug。
点击下载:http://www.easemob.com/download
收起阅读 »
Uber弃用email客服改用应用内客服,App内置客服将成趋势?
Uber的用户求助服务一直是通过Email沟通,而近日Uber将该服务切换到了应用内部。这么做理由何在呢? 因为在Uber一直希望获取大量市场份额的部分国家,例如中国和印度,用户并不像西方人那样习惯使用Email。
我们从上世纪90年代中叶开始就习惯了往来的电子邮件传达信息,而中国的大部分用户甚至连Email地址都没有。因为互联网不那么让人觉得靠得住,在中国和印度,人们更喜欢使用微信这样的聊天软件进行交流。在2015年,微信已拥有超过10亿用户。
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、拨号上网
我记得在我上一次使用拨号上网的时候是希望从某网站上下载一份学习报告,但在忍受了长时间的蚂蚁网速后,我终于下定决心同拨号上网说拜拜。然而,根据皮尤公布的《互联网与美国人生活习惯研究项目》(Pew Internet & American Life Project)数据显示,大约有4% 的美国人仍然在使用拨号上网。这也就是说,有超过 1000 万人在以不超过 56.6k/s的速度访问互联网!
需要指出的是,这4% 的拨号上网用户中可能有一部分是由于地处偏远地区而没有宽带互联网连接(这部分人群大约占据全美总人口的6%),剩下的一部分人则可能是基于费用或者其他原因而没有安装宽带。
2、传呼机
在上世纪 90 年代,人们彰显自己身份的标志之一便是传呼机。在那个年代,如果你拥有一部传呼机的话,人们通常会把你认作是企业 CEO,或者是一名外科医生,因此续续时刻同外界保持联系。但在几年的时间内,可以同时让人们收发信息手机的出现已经逐渐使传呼机退出了历史舞台。
尽管目前手机已经拥有着绝对统治地位,但传呼机仍然拥有着一定的市场份额。根据美国消费电子协会的报告指出,2012 年美国人总共采购了总金额为 700 万美元的传呼机,数量约为 1 万部左右。如果说你希望在能够保持同外界接触的情况下保留一定个人隐私的话,传呼机似乎的确是一个不错的选择。
说到这里,你可能会想象到一个个其貌不扬的毒品贩子在街头通过传呼机联络的画面。但事实上,现在有许多医院仍然倾向于为医生配备一部传呼机,因为他们认为传呼机网络相比手机网络更加可靠,尤其是在紧急情况发生的情况时。
3、点阵打印机
尽管在很多场合内,点阵打印机的地位早已被喷墨打印机所取代,但根据知名市场研究公司 NPD 公布的数据显示,美国人在 2012 全年还是购买了大约 2 万部全新点阵打印机。而且,在亚马逊购物网站上,我们仍然发现点阵打印机拥有一个完全独立的板块,其售价也往往比普通的喷墨打印机贵上了一倍左右(最低售价为 205 美元)。
那么,现在还有哪些企业或者工作人员需要使用到这个出生于 1983 年的老旧技术呢?事实上,许多仓库、销售点或者其他一些业务系统都仍然十分依赖于这一设备,因为他们往往需要开具一式五联的单据,而开具这样单据的最好方法便是通过点阵打印机来实现。
4、PDA(个人数字助理)
在很久以前,我曾经拥有过一部 Palm Pilot 个人助理设备,这是有史以来用户第一次可以从通讯录里直拨电话的设备。随后,我又用上了拥有彩色显示屏幕的 Cassiopeia。但是,我和个人数字助理设备之间的情缘也就到此为止了,因为智能手机的出现几乎使 PDA 变得一无是处。
然而,根据美国消费电子协会给出的数据显示,去年美国地区依然卖出了大约 35 万部全新 PDA 设备。该协会行业分析主管史蒂夫-科尼格透露,“人们购买 PDA 并不是因为他们因循守旧,而是因为许多垂直市场依旧需要使用随身 PDA 来收集数据,尤其是在仓库和医院这样的特殊办公场所”
5、公共电话
根据美国公共交流委员会(American Public Communications Council)在 2012 年第三季度给出的数据显示,全美境内目前仍然拥有多达 30500 个公共电话,对于知名乐队 Maroon 5 的粉丝来说,这或许是个不错的消息(该乐队的最近一张专辑的主打歌曲就是“Pay Phone”)。
事实上,这些公共电话直到现在也仍然在发挥着自己的巨大作用。美国公共交流委员会透露,2012 年人们总计使用这些公共电话拨打了超过 5000 万次电话。那么,到底有哪些人会直到现在仍然在使用公共电话呢?
分析人士认为,那些无力购买一部手机的低收入群体、希望保持自己匿名身份的人、手机在路上突然没电的用户以及那些突然无法接收运营商信号的人都有可能使用到公共电话服务。
6、录像带和磁带
在互联网高速发展的时代,人们已经可以在线下载许许多多的音乐和其他数字内容。亦或者,用户也可以选择继续沉浸在 1985 年的生活中,也就是利用磁带录下广播中的歌曲、利用录像带录下电视中正在播放的节目。
7、固定电话
在 2012 年中期,全美大约 34% 成年人家中没有安装固定电话。但与此同时,仍有 66% 的成年人不仅在家里安装了固定电话,而且还会为这套系统购买新硬件。根据美国消费电子协会给出的数据显示,美国人 2012 年总共购买了 500 万部固定电话和 2150 万部无绳电话。
8、CRT 电视
虽然目前仍然有相当数量的美国家庭在使用老旧的 CRT 电视,但大多数消费者电子产品公司已经基于种种理由而停止了这类产品的生产、开发工作。因为这些 CRT 电视不仅丑陋、过时,其内部笨重零部件的生产和海外运输成本也十分高昂。但是,根据知名市场研究机构 NPD 给出的数据显示,美国人在去年总计购买了 1 万台全新 CRT 电视,其中大多数 CRT 电视的主要观看群体是儿童。
9、胶卷
现在,绝大多数用户手中的智能手机都已经配置了高清摄像头,但传统一些的卡片式照相机以及数码单反相机也依旧十分流行,现在用户甚至只需要花费不到 100 美元的价格便可以购买一部成像效果相当不错的数码相机。因此,考虑到用户利用数码相机所拍摄图片的持久性、可分享性以及高品质,我们实在很难想象现在依旧有人在使用老式胶卷相机。
然而根据 NPD 给出的数据显示,美国人似乎依旧对于这种老式的生活记录方式情有独钟,因为美国地区在去年依旧卖出了高达 3500 万卷相机胶卷。其中,部分人们是 Lomo 拍摄方式的狂热爱好者,另有一部分人则仅仅是不愿意同自己的宝丽来相机说分手而已。
10、Windows 98 和 Windows 98 操作系统
虽然绝大多的人们都喜欢驾驶配置了诸如先进燃油喷射、安全气囊和操控体验的新款汽车,但世界上总有那么一部分人更喜欢驾驶老式的本田 Civic 车型,而这一点在人们所使用的一些复古操作系统中也可见一斑。
据市场调研究公司网络应用(Net Applications)公布的数据显示,目前仍然有 0.05% 的美国人在使用 Windows 98 和 Windows 2000 操作系统。与此同时,The Computer Industry Almanac 则表示,考虑到目前美国总计拥有 3.11 亿部电脑的事实,我们可以发现仍有超过 15 万人在使用来自上个世纪的操作系统。
11、传真机
早在上世纪 70 年代,传真机就成为了一款必不可少的办公室设备。但在过去了整整 40 年后,随着电子邮件、即时通讯应用等服务的兴起,传真机似乎已经失去了自己继续存在下去的理由。然而,事情的发展却没有同人们的想象保持一致,由于许多商业合同的签订仍然需要企业高层的亲笔签名,因此传真机在现代企业中仍然十分普遍。
根据 NPD 的数据显示,美国人总计在 2012 年内购买了 35 万部新传真机,但相比 2011 年同比下降了 14%。
12、黑胶唱片机
当猫王正处于流行舞台最中央的时候,黑胶唱片机也成为了当时许多年轻人听歌的第一选择。但是,在当今数字音乐下载和流媒体服务大红大紫的年代,看似“过时”的黑胶唱片却显示出了卷土重来之势。
尽管这一技术已经面世了很长时间,但现在有越来越多的新唱片开始以黑胶唱片的形式发行,其中就包括来自蠢朋克乐队(Daft.Punk)和僵尸周末乐队(Vampire Weekend)的最新作品。根据美国知名数据分析机构 Nielsen SoundScan 日前公布的数据显示,美国人在 2012 年总计购买了 460 万张黑胶唱片,同比上升了 17.7%。尽管这一数字相比 2012 年 1.18 亿数字专辑的销量还相去甚远,但这一“古老”产业的复兴似乎已经成为了一件不争的事实。
总结:
虽说科技在近年来迎来了前所未来的巨大飞跃,在对于许多普通人来说,我们的日常生活中还是能够时时刻刻看到许多“古老”技术的存在。比如,对于诸如拨号上网、磁带播放器、录像机等这些物品相信大家都不会陌生。就此,美国消费电子协会(CEA)行业分析主管史蒂夫-科尼格(Steve Koenig)就表示:“真正淘汰一项技术所需要的时间恐怕会超出你的想象。”
与此同时,美国消费电子协会日前公布的一份研究报告也指出,“大约仅有13-15%的人们是新兴技术的早期试用者,另有超过60%的人则通常会在一段时间以后才选择升级自己的老设备、或者采纳新技术。
在传统的客服中心领域也正在发生这种技术变革,传统的呼叫中心正在被以全媒体、智能机器人、移动端等特性的SaaS客服所颠覆和取代。新时代的SaaS客服集成简便快速,按需付费,弹性扩容,结合新一代的智能机器人技术极大的提高效率帮助企业降低成本,最后最重要的一点就是“价格特别低,价格特别低,价格特别低。”重要的事情说三遍。环信移动客服——全媒体智能云客服倡领者,1500元/坐席 一年的价格是不是童叟无欺。PS:两个坐席以内还完全免费哦。
环信移动客服是全球首创的全媒体智能云客服平台。支持全媒体接入,包括网页在线客服、社交媒体客服(微博、微信)、移动端客服和呼叫中心等多种渠道。环信移动客服基于环信业界领先的IM长连接技术保证消息必达,并通过强大的智能机器人技术极大降低人工客服工作量。收起阅读 »
环信直播课堂第五期--消息输入状态与群组@人
持续时间:半小时
描述:想知道对方是否正在回复你的消息?群组里想把消息说给指定的人,群消息太多对方没关注怎么办?
本期环信直播课堂将由环信Android工程师zhuhy给大家带来“如何实现消息输入状态与群组@功能!”
PS:有些妹子真是太倔强了,明明可以靠脸吃饭,偏要靠才华...
直播观看地址: http://www.imgeek.org/video/15
直播视频回放:http://community.easemob.com/video/22
消息输入状态与群组@人demo下载↓↓↓
收起阅读 »
环信“连接”沙龙第五期技术干货全分享:一切不以变现为目的的APP运营都是对投资人耍流氓
在“对,就是这个胖子”的小声议论中, 环信市场VP程开源上台致欢迎词...
在活动现场,演讲嘉宾围绕App变现,从不同维度,不同角度与参会者分享了自己的观点。演讲嘉宾包括环信大数据产品总监马冀、云账户联合创始人兼CTO邹永强、魔窗CTO张申竣、北京妙创意科技联合创始人苏然分别从大数据分析、App金融SDK、Deep Link技术、场景化造物等不同维度与到场的市场运营和开发者们进行了深入交流,气氛十分热烈。
一,深藏的金矿——社交大数据分析和挖掘
环信颜值担当大数据产品总监,九头身欧巴马冀走着台步就上来了...
针对当前众多App所困扰的变现问题,环信大数据产品总监马冀分析了App变现面临的难题以及从大数据的角度,如何破解。首先App需要明确的几个问题,“要卖什么?”“卖给谁”、“真实用户有多少?”只有在了解了当前APP的真实状况后,才能进行精准化的营销。
基于大数据的社交分析能够帮助运营者了解当前App的真实用户粘性。目前,环信大数据平台已经为App提供了数十个指标,包括DAU,日存留用户、具有IM行为的用户数、每日消息数等等。有了这些实际数字,App运营者就可以清晰的知道当前真实的用户群状况,从而采取相应策略的提升用户粘性。
其次,基于大数据的社交分析能够帮助App进行精准化的营销。一是对用户内容进行分析。例如,当前App中有哪些主题和关键字最受用户关注,哪些用户对这些主题最热衷,哪些用户对这些关键最反感等等。基于内容的分析能够帮助App运营者找到用户的关注点。其次,大数据还能够对用户进行分析,例如,找到用户之间的关系圈,哪些用户之间联系较为紧密,具有相同的兴趣爱好,这些用户最爱购买哪些商品。某款产品,哪些用户群的需求量最大。通过对社交的大数据分析,App可以清晰的对用户进行画像,从中挖掘出潜在的需求,进行精准化营销,从而实现商业变现。
PPT下载:http://www.imgeek.org/article/825307747
二,云账户,金融SDK助App流量变现
有着一张明星脸的云账户联合创始人兼CTO邹永强上来很爽快的在活动群发了个大红包,场下有人嘀咕:“岳云鹏就是大方...”
邹永强博士认为广告离钱很近,但并不是唯一的变现方法。广告的产品形式不够丰富,与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——移动应用的变革
极客范十足的魔窗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
四,场景时代下的造物变现逻辑
苏然有多潮,现阶段电商就有多火...
北京妙创意科技联合创始人苏然和与会听众分享了关于场景造物和场景器官的APP变现思路。在当前,已经不是物以类聚的时代,而是人以群分的时代。传统的电商做物以类聚的事情,找出性价比,让消费者更容易看到它,以一个看起来奢侈品的包装卖出超级低的价格形成转化,这是传统电商的模式。而现在的时代是一个新场景的时代,移动电商下的人群并不是在卖货,而是卖一个人群下的同样发生下的场景。每一个APP也好,每一个流量也好,需要匹配变现的价值是场景延伸的价值。让一个场景产生延伸的能力,我们赐予它场景延伸的能力,这个东西叫场景器官。通过大量实际例子,苏然和大家分享了场景变现的思路和实践。
PPT下载:http://www.imgeek.org/article/825307749
我不会告诉你右侧环信市场部两位年轻人至今单身,除了加班无不良嗜好,性取向正常,请留言索要联系方式...
感谢以上小伙伴对本次活动的大力支持,未来还要一起玩耍一起飞...
通过“连接”沙龙,环信旨在推动并打造一个互联网技术创新的平台,以期能够将有价值的技术资源整合推出,让更多的技术人开始分享技术,获得价值。
环信“连接”沙龙第七期(上海站)开始报名
APP变现之路 ——环信“连接”沙龙第七期(上海站)开始报名。可以点击“环信“连接”沙龙第七期(上海站)”查看详情以及报名,敬请期待!ps:上海站演讲人有中华小姐出境哦,有些人真是太倔强了,明明可以靠脸吃饭,偏要靠才华...
环信“连接”沙龙第七期(上海站) 收起阅读 »
Deep Link——移动应用的变革
魔窗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下载↓↓↓
收起阅读 »
测拉菜单的demo,加上个点开菜单后对应不同类型的商品信息
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];
}
}
收起阅读 »
iOS如何基于3.0SDK集成单聊界面
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.以上步骤基本集成单聊的聊天页面,如果遇到了其他问题,可以到环信官网联系技术支持。 收起阅读 »
环信直播课堂第四期--消息撤回 和 阅后即焚
持续时间:半小时
描述:聊天的时候不小心说错了话,还是发错了人,真的有后悔药吗?
环信最新版本sdk 新增阅后即焚,消息撤回功能,让聊天更加有趣,打造社交新玩法!
本期将由环信Android工程师--一鸣 ,他将给大家讲解消息撤回与阅后即焚的原理,并现场手把手教你如何实现消息撤回与阅后即焚!
直播观看地址:http://www.imgeek.org/video/
稍后直播完会把视频和demo更新在本篇文章后面!
视频回放:http://www.imgeek.org/video/20
收起阅读 »
环信联合创始人:App主流反垃圾服务难点和技术实现全解析
环信联合创始人马晓宇
App开发者想方设法在App里集成IM功能,鼓励用户沟通、互动、分享。但在享受用户量迅速上涨的同时,却也面临着不小的麻烦——垃圾信息。用户数量上来后,各种广告、钓鱼、色情等垃圾信息也不请自来。影响用户体验不说,一旦涉及到政治类信息,甚至会给App带来下架的风险,这实际上已经有过前车之鉴。即使是过百万用户量,由于没有即时采取措施遏制垃圾信息泛滥,最终导致被用户抛弃的App也已是不乏其数了。有人对此总结了一句话:“始于约炮,发展于炫耀,终结于代购”。
App植入IM功能是大势所需,关键在于,如何有效过滤各种垃圾消息,让App满足用户真正的社交需求。
一,垃圾消息分类与伪装术
“知己知彼,百战不殆”,我们先了解一下当前IM软件上垃圾信息的特点。
从内容上来看,垃圾信息通常分成这么几类:
广告类:用于推销商品、网站、店铺等,例如减肥药、化妆品、四六级答案等;
钓鱼类:通过发布一些虚假信息,诱使人们点击或是回复,从而一步步陷入骗局;
色情类:用于色情交易或事色情网站宣传等;
SEO类:通过让用户点击提高小网站的搜索排名;
政治类:例如境外势力支持下的对重大事件的负面舆论。这类信息风险极大,一旦广为扩散极有可能造成App被下架。
对于简单的垃圾信息,管理员只要设置好关键字过滤即可。但发送者为了逃避拦截,通常都会对垃圾信息进行伪装,几种典型的伪装术:
不相关内容+垃圾内容。例如在四、六级或考研季来临时,常常会收到这种垃圾消息:“白日依山尽,黄河入海流。考研答案,联系QQ******”。前半句“白日依山尽,黄河入海流”即为干扰项。
添加随机噪声,包括文字变换,随机字母,不同字体等。例如,“QQ群”改写成“藤训裙”、“叩叩裙”等,或者同时使用符号、文字变换:
使用多媒体技术,例如使用图片或者音视频来封装广告。
二、垃圾信息检测技术
从垃圾消息的伪装技术来看,仅依靠传统关键字过滤显然是无效的,必须另辟蹊径。目前在学术界和业界的几个研究方向:
1. antispam_based_user_keyword,基于敏感词的模糊匹配技术。
这项技术的核心是实用双数组字典树算法进行关键词的查询。首先服务会对输入的内容先进行简繁体、全半角、火星文、同义词、特殊字符过滤等一系列预处理。然后进行高效的关键词查询,主要功能点:
基于基本词库进行过滤(如政治、色情、暴力等),同时支持用户自定义词库;
大小写模糊匹配;
将需要屏蔽的关键词替换为通配符(如星号*);
2. antispam_based_user_behavior,基于用户行为检测
基于用户行为的反垃圾算法的核心是使用聚类算法对用户行为进行识别,识别维度包括行为要素(如发送者、发送时间、内容类型等等)和行为关系。所谓行为关系,是指用户的社交属性,例如消息发送频率,时间间隔,消息响应率等等。通过高效的聚类算法可实现:
单用户行为识别:如单一用户发送大量的垃圾信息;
多用户行为识别:大量马甲发送大量的垃圾信息;
识别图片、语音、视频等多媒体类型的垃圾信息。
3. antispam_based_user_content,基于用户内容的识别
基于内容的反垃圾服务的核心是构建分类器模型,采用自然语言处理技术(NLP),对内容进行语义分析,利用持续的机器学习与分类器训练,使机器能够理解语句的真实含义。该技术可实现:
经过内容伪装的垃圾信息。例如加入了随机干扰内容的垃圾信息;
局部热点聚类并拦截。通过聚类算法可识别一些特定范围内大量传播的垃圾信息,通过生产规则遏止这些信息进一步扩散。
国内市场上为APP提供即时通讯能力的厂商中,目前市场占有率第一的环信率先将上述技术集成至其IM产品中,为APP提供反垃圾信息服务。可以在APP中实现几种垃圾信息的拦截:
单一用户行为,如发送大量重复的“你好”、“hi”、可爱表情等打招呼行为,或冒充官网人员发送恶意链接、营销广告、色情信息等,这种类型的垃圾信息可基于用户行为检测技术+内容检测技术,同时借助NLP及训练模型对内容进行识别和拦截,紧急情况下可使用敏感词进行拦截。
多用户行为。例如垃圾信息发送者拥有马甲库,切换不同马甲来进行垃圾信息发送,甚至展开小型DDoS攻击,此类可基于全局用户行为检测技术,以及全局消息内容聚合进行识别和拦截;
高级形式的垃圾信息。如“目的内容+随机干扰”,这种形式的垃圾信息可通过局部聚类检测技术对热词进行识别,同时结合语义分析技术进行识别拦截;
对于内容完全随机的垃圾信息,可以采用发送频率限制技术增加发送者的成本,让他们趋于正常用户的行为,削减影响。
环信反垃圾技术流程图
从在APP中实际部署的效果来看是非常明显的,过滤率基本在99%左右。下图是在环信产品后台看到的实际拦截效果,分别是基于行为的拦截和基于内容的拦截。
基于行为的垃圾信息拦截
基于用户内容的垃圾信息拦截
反垃圾信息服务是一项“长期斗争”,除了技术手段外,还可以采取一些管理手段。例如,注册时要求绑定手机号,而非邮箱号。设置举报机制和拉黑功能等等,从而提升垃圾消息发送者的成本。通过技术手段,再辅以管理手段,必将遏止App中的垃圾消息,打造一个健康的网络社交环境。
作者简介:
马晓宇,环信联合创始人,拥有17年研发经验,先后任职于Symbian、Nokia,带领团队主持开发了数款Nokia手机的操作系统及内核软件,手机操作系统,手机应用软件专家。
收起阅读 »
【转帖】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包里,下载后可见。
快速体验带红包功能的demo
one more thing,
同期发布的SDK中一并增加了 阅后即焚,消息撤回的功能,有待你的发现哦。
收起阅读 »
本周末,中国开发者技术生态联盟邀你一同谈“技术”
云计算、VR、H5、即时通讯……本周末(3月27日),中国开发者技术生态联盟系列沙龙将走进杭州东部软件园。
如果你是一名不折不扣的“技术帝”并且想要扩大社群圈提升自我、充实技术和行业经验;如果你是一名与电商、零售、金融、互联网行业相关的创业者,想要了解大数据、云计算在实际行业中的实际应用,寻找创业技术合伙人;如果你是项目需求方、投资方、解决方案服务商,了解和认识新技术、新思想、发现和挖掘新的潜在独角兽,现场沟通与交流丰富自己的信息渠道。那一定不要错过这场技术界的“盛宴”。
据本次活动主办方崔牛会和中国开发者技术生态联盟介绍,本次活动将邀请到WeX5开发工具首席技术运营官王洁、环信技术经理杜超、UCloud高级架构师林超、极企科技联合创始人孙冰等行业大咖为与会的“技术宅”们带来“H5应用如何做到极速秒开”、“让APP快速实现即时通讯”、“资本如何看待开发者项目”等精彩分享。
如果你对此次活动感兴趣,如果你想提升自我,那就赶紧点击进入报名通道了解详情吧。咨询热线:15168266111 收起阅读 »
Ease3.0SDK 与EaseUI3.0 集成汇总 (卡壳的朋友们可以看看,已顺利集成成功)
首先 ,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日。刚来的小伙伴现在报名还来得及^_^^_^^_^
今天刚公布就已收到数十份项目,写的都很不错(这可怎么评呀o(╯□╰)o),这里就不一一表扬了!
这里给大家分享一个数据
大赛开赛前一周,每天近一百的报名量
幸福与烦恼共存着
编程大赛已公布奖品
大奖有限的几个,怎么能辜负了其他小伙伴们呢?
收集群里小伙伴建议
看来大家对技术书籍比较在意,感谢“华章图书”赞助了若干技术书籍
部分技术书籍(书籍还在整理,图片有些模糊,请点击原图查看)
不知道各位小伙伴们对大赛奖品还有什么中意的呢?
请在下方直接留言评论,我们将邀请您来到颁奖现场!(颁奖典礼除了已经公布的大奖,只要报名参赛的小伙伴到场均有神秘礼品赠送哦^_^^_^^_^) 收起阅读 »
我为什么给文章付费
图文无关
1.我有一种习惯。
阅读完一篇文章,如果从中得到了某种启发,或是单纯地很喜欢这篇文章,我会为其付费。(很多平台称这为打赏,但我并不喜欢这个透露着狂傲自大名词。任何一种创造都应该值得被尊重。)
讲真,我以为支付宝等在线支付的便捷手段出现,会使为创造付费会成为一种习惯。但是,我错了。
2.这个想法的出现,有两个原因。
一是前两天我读了梁欢的随笔集《我说的不一定对》,提到一个故事。他和的创业团队做了一个游戏,在国外的付费软件下载榜获得不错的成绩,口碑也很好。但是,当这个游戏传到国内的时候,一个网站就传出了它的破解版安装包,造成他们的巨大经济损失无法挽回,更令人惋惜的是使一个创业团队就此解散。
作为一个致力于游戏开发的成长版程序员,这个经历对我的触动非常大。
另一个原因是,前天,我给简书的一篇文章付费后,收到作者的一条短短的简信“太感谢了!!”。我觉得奇怪。难道是付费的人太少了,以至于收到一个读者的阅读费用会如此激动?
当然,亦可能是作者单纯地觉得这是读者对自己的一个鼓励,内心的激动难免,与钱无关。
总之,这使我开始思考一个问题。为什么我们都不习惯为无形的知识和创造付费?
3.举一个例子。
在十几年前,我们想要在家看电影,会先攒着一笔钱咬着牙买一台碟机和各种DVD,对着屏幕心满意足。但是,如今各种视频门户网站的影视众多,人们却开始变得吝啬。
“woc就看这么个破电影还要付费?!”
“看个剧还要充会员,你咋不上天?!”
资源极大的丰富,使人们越来越习惯于双眼一闭、两手一伸地索取,付费像是一种愚蠢的行为——你傻啊,这东西在某某网站可以免费下载,还去花那冤枉钱!
这种现象折射的一种心理便是,无形知识与创造不是一种宝贵的东西。我可以免费获得,为什么还要为此付费?
梁欢在《我说的不一定对》一书中,用他这个创业的经历做了一个有趣的比较。
有一个团队做出了一款付费游戏,但是不就一个网站就将它破解了,免费供人下载,瞬间下载量飙升。团队做出的游戏甚至没有获得开发的费用,解散了。
你会为此而愤怒吗?
先别急着回答。
又有一个水果商店,里面放着许多西瓜。但是某天有人将商店的锁撬开了,一时间人潮汹涌,西瓜就这样被抢光了。水果商店因此破产。
你感到愤怒吗?
如果答案是肯定的,那么不防再想一下。
你对谁而愤怒?撬锁的人,还是抢西瓜的人?
自始至终,人们没有将无形的知识和创造视为一种值得被购买的商品。
4这使我想起了在知乎上挺热门的问题
“设计师觉得最悲哀的事或者最悲哀的时刻是什么?”,热门回答多是某亲戚或某朋友请自己做一个logo或是设计某个东西,拿到成品之后没有支付酬劳或是表露感激,更有甚者觉得“不就是随便画几笔吗居然还要收钱怎么这么矫情”。
事实上,你理所当然索取着的免费产品,是别人花着你无法想象的时间与精力去学习的结果。
这些你都一无所知。又或许你根本不想知道。
因为,这和自己又有什么关系呢?
“没有关系”是一种很可怕的东西。当你拒绝接受对另一个领域的知识时,偏见就会由此产生了。
“你文章写得那么好,帮我写个广告宣传词吧,不用很长的……什么?还要收钱?(不就几个破字值那么多钱!)”
“你是画画的是吧,帮我设计个logo吧……就是画几笔的东西你收什么钱啊真是!又不是外人。(就是外人要收钱才来找你的嘛。)”
呵呵哒。
我会说,要不你自己来试一下?
这时他们又会说:“要是我会就不用找你啦!”
呵呵呵呵哒。
所以亲爱的,有时间的话,不如多去了解下不同领域的知识吧。
另,
看到喜欢的文章就选择为其“付费”吧´_>`
作者:Leoipaang 收起阅读 »
【美团外卖首页效果】三行代码轻松集成
原理介绍:
要想把一个view设计成透明的我们一下子就会想到两种方案,设置view的alpha值为0,或者设置view的backgroundColor为clearColor.但是UINavigationBar是一个比较特殊的视图,它是没有alpha属性的,那我们可以设置opaque(不透明度)为NO,上代码试一试.
//方案一:不透明度为NO结果,然并卵,完全没用。这时候该怎么办呢?这时候我们就得来看看UINavigationBar这个视图的结构了,如下图。
navigationBar.opaque = NO;
//方案二:背景颜色为clearColor
navigationBar.backgroudcolor = [UIColor clearColor];
现在笔者教大家一个小技巧。请看下面代码:
- (void)clearNavBar{这时候再打开项目层次图,你会有惊人的发现
//设置一张空的图片
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault];
//清除边框,设置一张空的图片
[self.navigationController.navigationBar setShadowImage:[[UIImage alloc]init]];
}
对比一下,你会发现只剩两层了。不要问为什么,这都是系统帮你做的。。。当你设置了背景图片的时候,就会出现这样的结果。
知道了上述的原理,这就好办了,现在只要监听,控制器内部的scrollView 的滚动,就可以实现导航条渐渐透明的效果了。
业务逻辑,功能实现其实都不是很难。但是也需要花费一些时间,笔者在这给大家分享一下自己写的一个分类。导入这个分类,你只需要调用两三个接口就可以实现这个功能了。
首先看一下分类提供的接口
分类介绍
我写的这个分类不仅可以在系统的UITableViewController 和UICollectionViewController中使用,(系统的只需调用分类中两个方法即可)。而且当你的UIViewController中有1个或多个可以垂直滚动的scrollView都可以使用。(需要告诉控制器需要监听哪个scrollView的滚动,即设置keyScrollView).
重要的是,这个分类的代码侵入性非常低,使用简单方便。当不需要这些功能的时候,你只需要注释掉两三行代码即可。
下面这个效果图是系统的UITableViewController,以下是效果图和代码
代码:
分类接口
#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];
}
控制器代码如下
#import "TestCollectionController.h"使用注意点,一定要在添加好collectionView,再设置keyScrollView,至于为什么,这个就不需要笔者解释了吧
#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;
}
滚动监听代码
#warning 监听滚动,调用框架接口项目源码分享,希望大家喜欢,下载的时候顺便star一下,好人多福。https://github.com/newyeliang/HYNavBarHidden.git
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
[self scrollControlRate:0.7 colorWithRed:1.0 green:0.0 blue:0.0 isNavBarItemAlpha:YES];
}
收起阅读 »
贪吃精灵小游戏demo
下了班,闲着没事,写了两个小demo分享给大家练练手.一个通过简单动画完成的,另一个是绘图.你能1个小时写完俩个吗,在不参考源码的情况下,那说明你的动画和绘图掌握的很不错了.要是没能写出来,也不需要气馁,多敲敲你就掌握了.
下面这个是贪吃精灵小游戏demo的效果图,这只是一共才200行代码的一个小demo哦.怎么样,看效果还挺不错吧!
源码链接https://github.com/newyeliang/EatDoudou欢迎star
·核心代码
//判断方向,往不同的方向移动
- (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了
·核心代码
源码链接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();
}
收起阅读 »
今天妹子直播的视频已上传
观看地址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 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
收起阅读 »
【转载】组合式测试:移动测试服务的发展趋势
由于国内移动设备和系统版本的碎片化,移动测试对于应用的质量保证变得至关重要,同时也催生了一批提供第三方测试服务的创业公司,BAT也都发布了自己的测试服务。但是,单一的测试服务往往不能完全满足开发者需求,测试服务的提供商也都在探索满足开发者需求的新方式。
自动化测试不能满足开发者需求
因为碎片化原因,开发者不可能手动测试所有的移动设备和系统版本,因此自动化测试对于移动测试来说是必须的。传统的第三方测试服务就是从这一点入手,以庞大 的云端真机测试为卖点,受到了开发者的认可。在社区里,自动化测试也最受关注,自动化测试的框架层出不穷,如何搭建自动化测试系统、编写测试脚本的内容最 受欢迎。一时间,自动化测试有一种彻底取代人工测试的势头。
但是,自动化测试实际上存在着一些问题,导致它并不实用,至少不能完全满足开发者的需求。据顾昕彪介绍,自动化测试的主要问题有:
新的功能很难做自动化测试。自动化测试大多数的作用是回归以前已经稳定下来的功能,对于一个新的功能,开发完以后要编写相应的测试用例,再进行自动化测试,这个时间比人工测试更长,因为人工测试可以直接开始测试,自动化测试有一个编写过程。
自动化测试需要有一些测试用例的积累,在版本大的迭代之后,很多测试用例可能就失效了,需要重新编写。因为移动应用发版很快,测试用例维护成本相对比较高。
自动化测试质量取决于编写测试用例的人的能力。有些时候测试用例能通过,但实际功能并不能用,要避免这点需要有丰富的测试经验和对移动开发的透彻的理解,而这对测试人员的要求太高了。
因此,自动化测试只能帮助开发者解决一部分兼容性问题,通常为了保证质量,开发者仍然需要采取其它测试手段。
施佳樑认为,人工测试之所以没有被市场所重视,是因为第三方人工测试服务的成本太高,如果能把人工测试的成本降下来,那么开发者还是会选择更有效的方式来满足测试需求,众测解决了这个问题。
众测成为测试工程师的业余职业
众包测试是在国外兴起的一种测试模式,通过将测试分配到多人手里,从而解决碎片化问题,并且避免自动化测试的一些弊端。
施佳樑介绍道,他们的众测平台拥有1500万用户,在这些用户中经过培训筛选,筛选出1000多个测试专家。这些测试专家已经能够像专业的测试人员一样,提供标准的测试报告来帮助开发者定位问题。
值得一提的是,这些测试专家里有些本来就是专业的测试人员,比如百度众测里会有百度的测试工程师利用业余时间来帮助别人做测试。事实上测试是一个需要经验和知识积累的职业,一般的众测人员只能模拟普通用户,效率较低,只有专业的测试人员才能高效的找出问题并提出报告。
通过众测这种模式,开发者能够以较低的成本请到多个较专业的测试人员进行测试,而测试工程师也能够在业余时间用职业技能赚些外快,这是一个双赢的事情。笔者认为这很可能成为众测模式的发展方向。
移动应用测试的未来:一体化服务
自动化测试和人工测试结合,能够得到一个较好的测试结果。但是,有一些情况没有包含在其中,比如应用crash,不借助辅助工具,要定位问题仍然比较困难,而crash上报服务正是为解决这个问题而生。
另外,对于应用性能,特别是不同网络条件下的应用表现的监测,使用应用性能管理服务(APM)更加有针对性。
要使用第三方服务来完全测试一个应用里可能出现的问题,开发者需要注册不同的服务,登录不同网站的管理后台来进行,这显然是很不方便的。而提供所有这些服务,同时将它们整合起来,将是移动测试服务未来一段时间的发展方向。
届时,开发者将只需登录一个网站,提交一次应用就可以得到一个多维度的、完整的测试报告,只有发展到这个阶段,移动测试服务才真正满足开发者的需求。
基于全球首创的对象识别技术,TestBird可以为客户提供深入到移动APP&游戏内部所有功能的深度解析能力。通过自助功能测试、远程真机调试、真机兼容性测试、真人体验测试、 真人压力测试和崩溃分析等产品,TestBird建立了云手机、云测试和云分析三大测试平台,为移动应用提供从研发到上线再到运营的一站式质量管理服务,帮助移动应用企业建立完善的质量管理体系和能力,全面提高移动应用的DAU、留存率以及付费情况。 收起阅读 »
环信推出红包功能,打造全民社交新玩法
让所有的App都能有属于自己的红包,国内最大的即时通讯云平台环信正式推出了红包功能,同时环信即时通讯云也是行业首家支持红包功能的产品。接入环信红包功能零费用,全方位适配移动端,仅需一天即可快速集成。将为兴趣社交、婚恋招聘、生活服务、移动电商、教育医疗、游戏等各大行业App量身打造最接地气的场景化社交服务。
环信此次通过红包功能这一全民所追崇的社交交互形式,致力于帮助中小型App解决留存率低、日活低、运营难等问题。在红包主题、节日互动的带动下,增强用户体验,提高用户粘性,将App产品体验发挥到极致。
单身狗追女生无从下手,《撩妹大全》没教你怎么办?求职者想向猎头/企业HR请教问题,如何能成功引起他们注意?同圈层、同爱好兴趣的人们聚到一块儿,怎么促进一下深度交流?网游装备太贵,买了就得吃土,怎么让卖家给我友情价?——发个红包,一切SO EASY!打开社交坚冰,升职加薪走上人生巅峰,都可以从发一个红包开始。
目前,已有十余家App企业内测了环信红包,据某招聘行业龙头App CTO反馈数据显示,在集成了环信红包功能以后,用户粘性和活跃度获得了明显提升,日活数据更是获得了15-20%的提升。据悉,环信红包功能仅仅是其改变社交玩法的第一步,环信即将联合“云账户”上线包括品牌特定主题红包及商家卡券等更多增值服务和新玩法,将为移动互联时代的App社交和变现提供更多的想象空间。
最后,亲们抢完红包请一定大力喊出“谢谢老板”哦!体验环信红包,请猛戳:http://www.easemob.com/downloads 收起阅读 »
感谢热心开发者@北京大鼓书意见反馈--Android语音文字切换输入的优化
在3.0的uidemo
还有一些3.0的ui 聊天小用户体验细节问题
第194行代码,官方demo是toggleFaceImage ,这样点击表情笑脸不会自动切换软件键盘。改成我这样,可以在表情面板和键盘相互切换
还一个是setModeKeyboard方法,官方的这个里面的代码 editText.requestFocus();根本不起作用。
在最后一行改成我这样才可以在 “按住说话” 和 键盘之间切换
各位小伙伴们在集成过程中有任何意见建议欢迎随时提出,我们会及时作出处理,并赠送神秘大奖的哈!
收起阅读 »
环信首席架构师:做业务系统如何成长为架构师?
之前说到在『在行』开了个聊天话题『如何成长为一个合格的架构师』。前段时间有个朋友找到我,问了个非常典型的问题。
图片来源:Live Business Art Board
他说:『我现在在做偏业务开发方向的工作,在平时需要如何积累基础服务和系统架构方面的经验和知识。 』
很显然他意识到了两种系统的区别,而且正在试图转型。然而我知道,他也走进了一个让人难以反驳的认识误区,这就是,因为业务系统技术要求不高,所以开发人员在走向架构师的路上成长缓慢。
业务系统技术要求有多高
如果说从门槛来看,业务逻辑确实是最容易写的代码。产出好量化,功能又好测试。就算真的坏了,系统一般不会因此垮掉。只是,门槛低并不意味着容易做好。
有一种工作是API设计与实现,行话叫『包接口』,也是很多同学刚毕业的第一份工作。这事说起来简单,只要调用方跟被调用方协商一致即可,但是真正做的时候你会发现很多问题。
调用方首当其冲。如果命名混乱,找到想要的接口和参数就会变得很难。而如果你错误码定义得不够清晰,调通一个接口将会变成一个令人崩溃的事情。
被调用方也没有轻松到哪里去。如果没有遵循正交原则,那么你每个接口都可能涉及后端的很多资源调用和库的引用,导致服务不可避免得变大。一个资源的变化,都将有可能会影响到很多接口,这对回归测试和问题排查都将是一个灾难。
如果你在做一个平台,情况会变得更加严重。抽象不足的话,用户的每一个需求都会变成新的接口。而一旦发布出去,你就要保持其兼容性,也就是说,这辈子都是你的接口了。如果开始的时候没考虑到版本,那么恭喜你,从此要转行技术支持了。
这方面微信的开放平台接口,基本算是一个反例。返回数据JSON和XML混排,超出限制后无响应!?可惜的是,由于平台变大,作为调用方的开发者只能被欺(qiang)负(jian)。
现在所有的服务都在云化,其中的基础就是API化,这个事情也变得越来越重要。推荐在做这方面工作的看看 Principles of good RESTful API Design。http://codeplanet.io/principles-good-restful-api-design/
做业务系统会遇到很多这样的工作,做出来简单,但做好却难。是什么让我们却止步于做出来,并因此想做些有挑战的事呢?
图片来源:Surreal & Conceptual Photography by Diggie Vitt
被逼的工作,被逼的学习
因为大多数人都需要工作,很多人在做着自己不那么喜欢的工作。或因为感情,或因为压力,必须做完现在的事情。不喜欢意味着不会朝思暮想,不会为伊消得人憔悴。再好的职业素养,也不会改变做完即可的态度。
如果你是被逼学习型,找一份自己更喜欢的工作,事不宜迟。这里有一点个人的建议是,如果要走技术路线,不要做外包。
我们不排除有些工作因为容易掌握,大多数人都只是做完即可,但更多的情况是,不是工作要求低,而是做的人放低了对自己的要求。就像本文前面的业务系统,虽说离架构设计很远,但是基本功都是一样的。
值得注意的是,在一个分工明确的团队里,并不是所有人要做所有事,但是好的团队里所有人会了解所有事。一个开发者如果不了解上层服务的需求,不了解下层服务的设计,很难做好服务的。
只有对其他组件建立足够的了解,才能设计出一致的服务,减少过度优化和不当依赖。知道什么时候该容忍错误,什么时候该放弃请求,才能在出问题的时候快速定位,才能一起做好服务。
这种了解,就来自于对架构设计的理解。
不要被你的思想局限
如果你喜欢自己现在的事情,那么要恭喜你,你很幸运。而你需要注意的是,不要被自己的思想局限。虽然没人会要求你像卖油翁一样,在能倒油的时候练习从铜钱内穿过,但你至少要知道,还是有很多可以做的。
就拿本文开头的例子,你以为只是设计一个API,但其实API到底层数据到映射和转换,已经涉及了架构设计的基础。你以为只是设计成RESTful,但其实还可以做成自动测试的框架,像Swagger,或者RAML,或者API Blueprint。你以为你只是在包接口,其实是放弃了对自己的要求而已。
人永远不知道自己不知道的东西,这也是我们需要持续学习的原因。
包接口也能变成包老师。
图片来源:苍老师书法
阅读其他文章,请关注知乎专栏『 一乐来了 』
收起阅读 »
关于EaseSDKHelper官方做法,otherConfig参数无法关闭log问题
[[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开始作为软件之间重要媒介而作为一种独立应用而存在,“一切皆软件,一切皆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_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同步上线!
SDK新版本的功能优化点如下:
1. Android-优化了表情包批量下载(下载表情包更快,更省内存);
2. Android-开放表情商店内标题栏背景颜色和高度设定;
3. iOS-解决了部分gif表情播放有残影的问题;
4. iOS-优化了SDK表情包下载和键盘的性能;
5. iOS-对环信2.0 Demo做了一些性能优化。
开发者们可以直接在表情mm官网下载最新版SDK 体验~
表情mm官网(http://www.biaoqingmm.com/)
同时表情mm整合环信3.0 IM SDK的Demo也发布啦!欢迎下载体验噢~
目前,接入表情mm|表情云™的开发者涵盖兴趣社交、二次元社区、母婴电商、企业OA等多种类型的产品。未来,表情mm|表情云™在不断更新内容的过程中,还会逐步开放更多灵活定制接口,满足更多开发者的不同定制需求,让更多开发者轻松拥有专属自己产品的表情商店。 收起阅读 »
Android开发自定义ImageView控件实现圆角边框等功能
下边边就是我们经常会需要的一个实现了图片的圆角,以及添加边框等功能的自定义控件;文章最后有项目源码地址
这个自定义ImageView控件实现了图片的圆角、圆形、边框等功能,同时具有按下改变颜色的效果,通过属性设置可以自定义按下的颜色,
以及颜色的透明度;还尅定义边框的颜色
Demo截图:
控件属性定义
<?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项目,找到项目目录gradle\wrapper\gradle-wrapper.properties这个文件内容如下
#Wed Jul 08 23:06:25 CST 2015最重要的就是最下面一句,android studio会联网下载符合当前版本的gradle插件,而这个网址虽然可以访问但速度实在太慢,所以每次下载需要花很长时间或直接超时
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
解决办法就是自己去手动下载当前项目定义的版本,可以直接复制这个路径去下载,也可以去gradle官网自己选择版本下载
然后把下载下来的压缩包拷贝到C:\Users\lzan13\.gradle\wrapper\dists\gradle-2.5-all\d3xh0kipe7wr2bvnx5sk0hao8目录下后边这个长串的目录不一定相同,以自己的为准
重启AndroidStudio或选择工具栏Tools->Android->Sync Project Gradle Files
等待更新完成,就ok了 收起阅读 »