关于视频聊天的问题
我在集成了EaseUI3.0后,发现对于视频聊天的请求,如果用户选择了不给权限,那么虽然应用会提示我们去隐私-》相机然后后找到相应的应用打开权限,但我测试发现在列表中并没有列出来我们的app。经过查找,感觉问题在CallViewController.m的canVideo方法。这里对能否访问摄像头进行了判断,但没有尝试去获取权限。因此我将代码修改为如下内容。完美解决这个问题。
+ (BOOL)canVideo收起阅读 »
{
if([[[UIDevice currentDevice] systemVersion] compare:@"7.0"] != NSOrderedAscending){
// if(!([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo] == AVAuthorizationStatusAuthorized)){\
// UIAlertView * alt = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"setting.cameraNoAuthority", @"No camera permissions") message:NSLocalizedString(@"setting.cameraAuthority", @"Please open in \"Setting\"-\"Privacy\"-\"Camera\".") delegate:self cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"ok", @"OK"), nil];
// [alt show];
// return NO;
// }
NSString *mediaType = AVMediaTypeVideo;// Or AVMediaTypeAudio
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
NSLog(@"---cui--authStatus--------%d",authStatus);
// This status is normally not visible—the AVCaptureDevice class methods for discovering devices do not return devices the user is restricted from accessing.
if(authStatus ==AVAuthorizationStatusRestricted){
NSLog(@"Restricted");
}else if(authStatus == AVAuthorizationStatusDenied){
// The user has explicitly denied permission for media capture.
NSLog(@"Denied"); //应该是这个,如果不允许的话
UIAlertView * alt = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"setting.cameraNoAuthority", @"No camera permissions") message:NSLocalizedString(@"setting.cameraAuthority", @"Please open in \"Setting\"-\"Privacy\"-\"Camera\".") delegate:self cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"ok", @"OK"), nil];
[alt show];
return NO;
}
else if(authStatus == AVAuthorizationStatusAuthorized){//允许访问
// The user has explicitly granted permission for media capture, or explicit user permission is not necessary for the media type in question.
NSLog(@"Authorized");
}else if(authStatus == AVAuthorizationStatusNotDetermined){
// Explicit user permission is required for media capture, but the user has not yet granted or denied such permission.
[AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) {
if(granted){//点击允许访问时调用
//用户明确许可与否,媒体需要捕获,但用户尚未授予或拒绝许可。
NSLog(@"Granted access to %@", mediaType);
}
else {
NSLog(@"Not granted access to %@", mediaType);
}
}];
}else {
NSLog(@"Unknown authorization status");
}
}
return YES;
}
集成笔记:环信移动客服如何实现全媒体接入
本篇集成笔记参考于环信官网移动客服集成文档 ,写这篇笔记是为了让大家更直观的了解“移动客服是什么”“我能不能使用移动客服”“怎么集成移动客服”
官网移动客服集成文档地址:http://docs.easemob.com/cs/start
移动客服是由环信提供的一套完整的客服服务SaaS解决方案,既包括多渠道接入的客户端(APP,网页,微信,微博),也包括客服座席使用的服务端(Web和APP都有),只是在APP端使用了IM作为通讯方式。
访客端是由自己集成(集成步骤在下面文档会写出),目前支持:APP、微信公众号、微博公众号、网站
客服后台是由环信提供,现支持:移动端、web、pc端(插件方会在以后版本开放,具体可咨询环信在线技术支持)
集成环信移动客服前需注册环信客服账号,并登录。......
环信客服注册地址:http://kefu.easemob.com/mo/register
网页插件集成:
网页插件集成移动客服是比较简单,原理是在自己网站的标签之前加入一段由环信提供的js,即可完成环信在线客服的植入,实现访客在网页端与在线客服的沟通。
这段js获取步骤如下:
管理员模式下==》渠道设置==》网页插件
下面来讲下网页插件的功能介绍和自定义开发(V4.1版本)
功能介绍可参考imgeek社区新产品发布:http://community.easemob.com/article/825307446
一些常见的自定义开发
Q:网页插件 集成自定义按钮
A:首先,将插件JS串中的hide=false修改为hide=true;
其次,在你网页的目标元素上添加如下超链接,例如:你的目标元素,即可完成自定义客服按钮
Q:网页插件区分技能组
A:http://kefu.easemob.com/webim/im.html?tenantId=xxxx&emgroup=技能组名称
注意:技能组名称外面没有单引号
手机APP集成:
手机APP集成可分为以下两步
1:先在客服后台创建一个关联
管理员模式下==》渠道设置==》手机APP 右上角添加环信关联
关联名称由自己定义,AppKey,ClientId,ClientSecret可以再环信开发者后台拿到(注册环信开发者账号https://console.easemob.com/index_register.html 注册完成创建应用--查看应用概况即可得到)
这里详细介绍下im服务号,im服务号为自己应用下的一个im账号(不用为每个用户创建,根据自己业务逻辑指定一个或者多个)
2:客户端写个联系客服按钮,点击联系客服,调用发消息方法,接收对象为客服后台创建的关联的im服务号,消息就会到客服后台,根据分配策略分配给对应的客服(V4.1版本 客服坐席分配策略为:max(客服坐席可接待人数-客服坐席已接待人数), 也就是说,新来会话会分配给理论最闲的那个客服坐席)
一些常见的自定义开发:
指定客服、技能组、满意度调查、显示用户信息可参考(原理为联系客服时通过传入扩展属性键值对,由客服后台解析辨别。键为环信实现约定好的,值是自定义。)文档地址:http://docs.easemob.com/cs/300visitoraccess/10nativeapp
这里列举几个实现用户信息常遇到的问题
Q:已经按照文档传入用户信息,为什么客服后台还是没有看到用户信息
A:客服关闭会话,再次联系客服就行,已经建立的会话目前没有刷新访客昵称
Q:之前传入用户信息在客服后台显示了,后来传入新的用户信息为什么客服后台没有更新
A:已经在客服后台显示的用户信息不会随着扩展属性的更新而更新,目前的设计是访客第一次进入时展示信息给客服辨别,后续由客服手动备注
PS:如果自己APP 是基于h5开发的,或者不想集成环信im怎么使用环信的移动客服,可以参考之前的网页插件集成,将那段js中的tenantID填入以下网址中xxxx的位置:http://kefu.easemob.com/webim/im.html?tenantId=xxxx
在自己APP中点击联系客服跳转到这个H5会话窗口即可
微信公众号集成:
微信工作号集成需要注意的是个人的订阅号、测试公众号等,微信均没有开通客服接口的权限,所以粉丝收不到客服消息。
微信公众号集成分以下几类:
1:直接授权(通过在客服后台管理员模式==》渠道设置==》微信公众号 添加微信公众号即可)
需要注意的是授权以后自己之前对微信公众号所做的开发都不能使用,微信用户通过微信的输入框直接联系客服后台移动客服
2:通过定义菜单栏点击联系客服
可以在微信公众号定义菜单栏,点击跳转到环信指定的网址(这个地址可参考之前的网页插件集成,将那段js中的tenantID填入以下网址中xxxx的位置:http://kefu.easemob.com/webim/im.html?tenantId=xxxx )
3:回调集成(需要开发者,涉及到服务端程序的集成)
实现原理为环信发消息给微信,是通过环信的实时消息旁路接口。微信发消息给环信,是通过环信提供的REST发消息接口。
按照以下步骤:
1)在微信公众号开发者设置第三方服务器接收微信公众号的消息进行业务逻辑处理
2)调用环信rest接口将消息发给客服后台绑定的IM服务号(文档地址http://docs.easemob.com/doku.php?id=start:100serverintegration:50messages)
3)客服的回复消息是到环信服务器,通过回调接口把这消息转发到用户指定的服务器(需要符合环信格式,配置消息回调可联系环信在线技术支持)
4)服务器拿到消息之后在推给微信粉丝就行
PS:需要注意的是消息格式的变化(V4.1视频和位置暂不⽀持,会在下⼀版本提供⽀持)
微博公众号集成:
微博公众号集成目前支持私信、 @ ,评论暂不支持(V4.1版本)
集成方式:
管理员模式下==》渠道设置==》微博公众号
收起阅读 »
官网移动客服集成文档地址:http://docs.easemob.com/cs/start
移动客服是由环信提供的一套完整的客服服务SaaS解决方案,既包括多渠道接入的客户端(APP,网页,微信,微博),也包括客服座席使用的服务端(Web和APP都有),只是在APP端使用了IM作为通讯方式。
访客端是由自己集成(集成步骤在下面文档会写出),目前支持:APP、微信公众号、微博公众号、网站
客服后台是由环信提供,现支持:移动端、web、pc端(插件方会在以后版本开放,具体可咨询环信在线技术支持)
集成环信移动客服前需注册环信客服账号,并登录。......
环信客服注册地址:http://kefu.easemob.com/mo/register
网页插件集成:
网页插件集成移动客服是比较简单,原理是在自己网站的标签之前加入一段由环信提供的js,即可完成环信在线客服的植入,实现访客在网页端与在线客服的沟通。
这段js获取步骤如下:
管理员模式下==》渠道设置==》网页插件
下面来讲下网页插件的功能介绍和自定义开发(V4.1版本)
功能介绍可参考imgeek社区新产品发布:http://community.easemob.com/article/825307446
一些常见的自定义开发
Q:网页插件 集成自定义按钮
A:首先,将插件JS串中的hide=false修改为hide=true;
其次,在你网页的目标元素上添加如下超链接,例如:你的目标元素,即可完成自定义客服按钮
Q:网页插件区分技能组
A:http://kefu.easemob.com/webim/im.html?tenantId=xxxx&emgroup=技能组名称
注意:技能组名称外面没有单引号
手机APP集成:
手机APP集成可分为以下两步
1:先在客服后台创建一个关联
管理员模式下==》渠道设置==》手机APP 右上角添加环信关联
关联名称由自己定义,AppKey,ClientId,ClientSecret可以再环信开发者后台拿到(注册环信开发者账号https://console.easemob.com/index_register.html 注册完成创建应用--查看应用概况即可得到)
这里详细介绍下im服务号,im服务号为自己应用下的一个im账号(不用为每个用户创建,根据自己业务逻辑指定一个或者多个)
2:客户端写个联系客服按钮,点击联系客服,调用发消息方法,接收对象为客服后台创建的关联的im服务号,消息就会到客服后台,根据分配策略分配给对应的客服(V4.1版本 客服坐席分配策略为:max(客服坐席可接待人数-客服坐席已接待人数), 也就是说,新来会话会分配给理论最闲的那个客服坐席)
一些常见的自定义开发:
指定客服、技能组、满意度调查、显示用户信息可参考(原理为联系客服时通过传入扩展属性键值对,由客服后台解析辨别。键为环信实现约定好的,值是自定义。)文档地址:http://docs.easemob.com/cs/300visitoraccess/10nativeapp
这里列举几个实现用户信息常遇到的问题
Q:已经按照文档传入用户信息,为什么客服后台还是没有看到用户信息
A:客服关闭会话,再次联系客服就行,已经建立的会话目前没有刷新访客昵称
Q:之前传入用户信息在客服后台显示了,后来传入新的用户信息为什么客服后台没有更新
A:已经在客服后台显示的用户信息不会随着扩展属性的更新而更新,目前的设计是访客第一次进入时展示信息给客服辨别,后续由客服手动备注
PS:如果自己APP 是基于h5开发的,或者不想集成环信im怎么使用环信的移动客服,可以参考之前的网页插件集成,将那段js中的tenantID填入以下网址中xxxx的位置:http://kefu.easemob.com/webim/im.html?tenantId=xxxx
在自己APP中点击联系客服跳转到这个H5会话窗口即可
微信公众号集成:
微信工作号集成需要注意的是个人的订阅号、测试公众号等,微信均没有开通客服接口的权限,所以粉丝收不到客服消息。
微信公众号集成分以下几类:
1:直接授权(通过在客服后台管理员模式==》渠道设置==》微信公众号 添加微信公众号即可)
需要注意的是授权以后自己之前对微信公众号所做的开发都不能使用,微信用户通过微信的输入框直接联系客服后台移动客服
2:通过定义菜单栏点击联系客服
可以在微信公众号定义菜单栏,点击跳转到环信指定的网址(这个地址可参考之前的网页插件集成,将那段js中的tenantID填入以下网址中xxxx的位置:http://kefu.easemob.com/webim/im.html?tenantId=xxxx )
3:回调集成(需要开发者,涉及到服务端程序的集成)
实现原理为环信发消息给微信,是通过环信的实时消息旁路接口。微信发消息给环信,是通过环信提供的REST发消息接口。
按照以下步骤:
1)在微信公众号开发者设置第三方服务器接收微信公众号的消息进行业务逻辑处理
2)调用环信rest接口将消息发给客服后台绑定的IM服务号(文档地址http://docs.easemob.com/doku.php?id=start:100serverintegration:50messages)
3)客服的回复消息是到环信服务器,通过回调接口把这消息转发到用户指定的服务器(需要符合环信格式,配置消息回调可联系环信在线技术支持)
4)服务器拿到消息之后在推给微信粉丝就行
PS:需要注意的是消息格式的变化(V4.1视频和位置暂不⽀持,会在下⼀版本提供⽀持)
微博公众号集成:
微博公众号集成目前支持私信、 @ ,评论暂不支持(V4.1版本)
集成方式:
管理员模式下==》渠道设置==》微博公众号
收起阅读 »
”活动“模块上线,大家有地儿活动啦
有没有同学注意到, imgeek“活动”模块悄然上线啦, imgeek将定期组织线下技术活动,区别于众多的活动站,imgeek将遵循开源社区开放、自由、分享的精神,具有几个特点:
1.开放演讲申请,任何人都可以提交演讲
2.开放投票,你的投票将直接决定演讲顺序
3.开放赞助商申请,有钱出钱,没钱出礼品,同时imgeek给一些品牌露出的机会
4.开放志愿者申请,给虽然暂时不能登上讲坛,又热心参与活动的同学一些贡献的机会,每个志愿者都将得到一个精美纪念品
5.开放“向讲师提问”,你的提问同时将进入imgeek“问题”模块,不光讲师可以及时回复你的问题,更多的同学将会看到
6.如果你还没有imgeek社区账号,报名后将为你自动生成一个社区账号,省去频繁注册账号的麻烦
总之,活动是大家的,舞台是大家的,尽情参与吧!
最近的一期活动将在2016-01-09 13:30 举行, 大家记得报名哦
活动入口:点击顶部“活动”菜单 or http://www.imgeek.org/activity/
收起阅读 »
1.开放演讲申请,任何人都可以提交演讲
2.开放投票,你的投票将直接决定演讲顺序
3.开放赞助商申请,有钱出钱,没钱出礼品,同时imgeek给一些品牌露出的机会
4.开放志愿者申请,给虽然暂时不能登上讲坛,又热心参与活动的同学一些贡献的机会,每个志愿者都将得到一个精美纪念品
5.开放“向讲师提问”,你的提问同时将进入imgeek“问题”模块,不光讲师可以及时回复你的问题,更多的同学将会看到
6.如果你还没有imgeek社区账号,报名后将为你自动生成一个社区账号,省去频繁注册账号的麻烦
总之,活动是大家的,舞台是大家的,尽情参与吧!
最近的一期活动将在2016-01-09 13:30 举行, 大家记得报名哦
活动入口:点击顶部“活动”菜单 or http://www.imgeek.org/activity/
收起阅读 »
登录,大概3秒多,感觉有点慢,能优化下吗
登录,大概3秒多,感觉有点慢,能优化下吗
小众公众号的简单运营
我们从4月初开始运营一个新的公众号。目前一直在持续运营中,粉丝数量和粉丝关注度也保持稳步上升,每天分享的文章也有很多的好评,得到转发。同时也收到过很多的吐槽,但我们一直很关注粉丝的反馈和吐槽,毕竟这才能让我们做的更好。
但是公众号运营的痛点太多了。粉丝增长不够快,用户粘性不够大,文章阅读数量不够多,传播力度不够广。对于一个公众号来说,不论粉丝多还是少,热情还是不热情,都需要运营人员精心的照料。今天我不说怎么推广这个公众号,只从自己经营这个公众号以来得到的一点经验来分项怎么做一个公众号。
摘要写好了:
摘要没写好:
我们找准定位为正在找工作的大学生之后在做推广,效果就出现了非常显著的高峰。
收起阅读 »
但是公众号运营的痛点太多了。粉丝增长不够快,用户粘性不够大,文章阅读数量不够多,传播力度不够广。对于一个公众号来说,不论粉丝多还是少,热情还是不热情,都需要运营人员精心的照料。今天我不说怎么推广这个公众号,只从自己经营这个公众号以来得到的一点经验来分项怎么做一个公众号。
- 公众号建设
- 首先公众号要有一个自己的形态,现在分订阅号、服务号、企业号三种,最常见的,也是我正在做的就是订阅号,我的号也是提供了公众号最基础的服务,信息推送。
- 1.不可忽视的自动回复内容:
- 自动回复有下面几种情况:被添加的内容、自动回复内容、特定关键词回复内容
- 被添加的自动回复是一个用户对你的公众号的第一次接触,如果写的过长或者过短都会影响用户对公众号的认知。如果是“你好,欢迎关注***”,那么用户只会觉得,你没有用心在经营这个号,如果长篇大论得说你的产品特色,也容易让人厌倦。所以建议是,先打招呼,再简单一句话介绍公众号的功能。
- 自动回复,根据微信公众号的规则,在1小时内自动回复只会被出发一次,所以这块建议就是写上,已收到,会尽快回复之类的字眼就可以。
- 关键词自动回复,这块就比较灵活。我的公众号在做信息查询的时候会常用到这个。一般也不需要设置关键词回复。特别的可以提示的是,比方说有活动这类的内容,那么关键词可以设置一个“活动”,方便用户找到想要的信息。
- 2.让信息更有条理的菜单栏设置
- 很多小微公众号会忽视菜单栏的设置,但是其实菜单栏是必不可少的。公众号的特点是每天只能建立一条群发,这就容易导致,万一添加的用户是在你群发之后,或者今天用户不巧没有收到你的信息(这个情况还是很少见),那就会造成进入后,没有直接沟通交流的机会,很尴尬,所以如果你的公众号设置一个简单的菜单,让新用户,或者是想了解更多的用户有查看的平台。
- 每日推送内容
- 每日推送也是公众号最重要的内容。我们的公众号是做IT资讯推荐的,所以,我们每天有基本的模式。
- 如果文章分2、1,其中2为引流文章,让用户看了愿意分享的,1为增强用户知识体系,看了愿意不停关注来提升自己的能力。选文章的前提是精和新。
- 每天的基本模式:精选2+技术干货1+大数据1+互联网金融1+o2o1+电商1+产品经理1
- 其实在固定模式下推送新闻,不用多久就能发现用户比较关注的焦点。而且推送内容的走向也和时间有一定联系。由一周的统计可以看出秋季招聘期间面试经验、干货内容是比较受关注的,双十一期间电商和创业的关注度也比较高。
- 169 【面试经验】腾讯、百度、网易游戏、华为Offer及笔经面经
- 151 【技术干货】Google开源最新机器学习系统TensorFlow
- 146 【面试经验】产品经理面经:3个产品Offer是如何拿到的
- 153 【面试经验】零产品经验斩获校招产品Offer经历
- 146 【面试经验】给Android程序员的一些面试建议
- 190 【技术干货】分类算法总结
- 153 【创业】2015年的互联网创业趋势可能不是你想象的那么回事
- 147 【电商】双11这天,90%程序员都在干什么?
- 143 【产品】别老想着脱单,今年流行“性冷淡”产品
- 145 【创业】曾穷到被女友抛弃的他投奔马云后身价102亿
- 177 【创业】那家将融10亿美元的AR公司Magic Leap到底有多拽
- 162 【社会】人与人之间变得更冷漠,和手机一毛关系都没有
- 以上是根据一周的统计内容得到最关注的焦点
- 内容编辑
- 标题:无所谓标题党,但标题请简洁。太长的标题,在碎片化信息时代,容易令人厌倦。
- 摘要:你可能会觉得摘要没有用,编辑内容的时候我们总是会忽视摘要的部分,而在转发的时候摘要是必须会出现的,这时候如果摘要不编辑好,内容就会很乱,也影响转发的效果。转发的时候也别空转发,稍微写点内容,自己的看法,会更吸引其他用户的注意。
摘要写好了:
摘要没写好:
- 文字:分段,分段,分段!文字必须分段,不分段的手机效果就是挤在一起,令人不想看。字号的大小,新闻类的文章建议16px,这样看起来最舒服;文艺小清新类的文章建议14px,文艺范儿的小一点反而轻巧。
- 图片:文章最好能够图文并茂,图片居中看起来会舒服很多。
- 段落:用编辑器加一些看起来更简洁的小图标,对整篇文章的帮助是很大的。
- 找对人群
- 公众号相当于一个产品,所以找准定位对于找对一群适合的人群很重要。对的人群指的应该不是一次突然骤增的人数,而是长期用户的保留。
我们找准定位为正在找工作的大学生之后在做推广,效果就出现了非常显著的高峰。
- 最重要的小事
- 推送时间:
- 推送时间真的非常重要,甚至是一篇相同的文章,不同的时间推送,阅读量和转发量也会大不相同。之前一直在探索最佳的推送时间,得到一个基本觉得很靠谱的结论。
- 最忌:中午推送
- 一般:早晨
- 最佳:晚上8点-9点之间
收起阅读 »
环信登录提示 invalid user or password
接入环信的时候,遇到登录的问题。用环信demo注册的用户,在自己注册的appkey中是无法登录的。需要自己去注册的管理后台添加对应IM用户才能登录。在此记录一下,希望对遇到同样问题的朋友有帮助。
imGeek社区上线现金打赏功能,拥抱共享经济开启单点技术问题众包新模式
(下面是我们PR写的新闻稿,高大上吧)
一提到共享经济必定会提到Uber和Airbnb,这两只巨无霸独角兽的崛起让“共享经济”一词异常火热,作为共享经济最具代表性的两家企业,Uber和Airbnb分别为出租车业和酒店业带来了革命性的改变,也让人们看到了共享经济在未来的巨大潜力。共享经济这种新的经济模式并不只会在出租车业和酒店业发挥作用,利用人们业余时间和空间的特点,它几乎可以渗透到各个行业,当然移动开发市场也首当其冲。
偶们imGeek开发者社区(http://www.imgeek.org)已悄然上线现金打赏功能,在所有问题回复的下侧悄然出现了一个“赞赏”图标。这个是imGeek开发者社区在共享经济浪潮中的一次尝试,希望借助开发者的力量帮助开发者,人人为我,我为人人。
“赞赏”功能一经推出,受到了开发者的热烈追捧,同时不少论坛KOL们已经陆续收到不少“赞赏”,少则一元,多则上百元,虽然钱数总额不多,但能激发人类最原始的互助潜能,也是对知识的一种尊重。正如打赏时弹出的“知识价值的认可,源自您的赞赏”,正是开发者之间相互的认可,促进了社区中提出的问题可以得到及时的回复。据观察,imGeek开发者社区上面的提出的问题基本在10分钟以内即可得到回复,一个问题基本可以很快的得到解决。
在共享经济的浪潮中也催生了软件服务行业众包模式。其中,Coding,猿团因为众包分别得到了资本的青睐,开源中国更是凭借众包概念上了新三板。 但笔者认为,软件行业的众包并不是一个新生事物,软件项目的外包失败大多是因为项目发包方过于强势,需求变化频繁,众包并不能真正解决这些问题。
但如果将一个项目分解为一个个技术问题, 通过对单点技术问题进行众包,每次付费的金额少,笔者认为imGeek开发者社区这种运营做法是更易操作的方式。 现在imGeek开发者社区的“赞赏”功能还仅是依赖开发者志愿进行,并不强制,这样的操作既照顾到社区的自发性,也为那些乐于分享的勤恳开发者提供了高于社区荣誉的经济收益。
基于互联网的共享经济目前来看已经大大改变了不少行业的格局,相对传统行业,它们拥有更大的优势:1,更节约的时间。2,更优化的资源配置。3,更灵活的就业。也许不久的将来,imGeek开发者社区将在共享经济和众包的浪潮中趟出一条新路。
据悉,imGeek开发者社区是由环信赞助,截止2015年5月,环信服务了23763个App以及几万开发者,环信的创始团队均是世界著名开源项目的贡献者,运营总监是原开源力量社区的创始人,相信正是由于他们对移动开发者的深度了解,促使imGeek开发者社区将逐步发展成为移动开发者们的核心聚集地。 收起阅读 »
一提到共享经济必定会提到Uber和Airbnb,这两只巨无霸独角兽的崛起让“共享经济”一词异常火热,作为共享经济最具代表性的两家企业,Uber和Airbnb分别为出租车业和酒店业带来了革命性的改变,也让人们看到了共享经济在未来的巨大潜力。共享经济这种新的经济模式并不只会在出租车业和酒店业发挥作用,利用人们业余时间和空间的特点,它几乎可以渗透到各个行业,当然移动开发市场也首当其冲。
偶们imGeek开发者社区(http://www.imgeek.org)已悄然上线现金打赏功能,在所有问题回复的下侧悄然出现了一个“赞赏”图标。这个是imGeek开发者社区在共享经济浪潮中的一次尝试,希望借助开发者的力量帮助开发者,人人为我,我为人人。
“赞赏”功能一经推出,受到了开发者的热烈追捧,同时不少论坛KOL们已经陆续收到不少“赞赏”,少则一元,多则上百元,虽然钱数总额不多,但能激发人类最原始的互助潜能,也是对知识的一种尊重。正如打赏时弹出的“知识价值的认可,源自您的赞赏”,正是开发者之间相互的认可,促进了社区中提出的问题可以得到及时的回复。据观察,imGeek开发者社区上面的提出的问题基本在10分钟以内即可得到回复,一个问题基本可以很快的得到解决。
在共享经济的浪潮中也催生了软件服务行业众包模式。其中,Coding,猿团因为众包分别得到了资本的青睐,开源中国更是凭借众包概念上了新三板。 但笔者认为,软件行业的众包并不是一个新生事物,软件项目的外包失败大多是因为项目发包方过于强势,需求变化频繁,众包并不能真正解决这些问题。
但如果将一个项目分解为一个个技术问题, 通过对单点技术问题进行众包,每次付费的金额少,笔者认为imGeek开发者社区这种运营做法是更易操作的方式。 现在imGeek开发者社区的“赞赏”功能还仅是依赖开发者志愿进行,并不强制,这样的操作既照顾到社区的自发性,也为那些乐于分享的勤恳开发者提供了高于社区荣誉的经济收益。
基于互联网的共享经济目前来看已经大大改变了不少行业的格局,相对传统行业,它们拥有更大的优势:1,更节约的时间。2,更优化的资源配置。3,更灵活的就业。也许不久的将来,imGeek开发者社区将在共享经济和众包的浪潮中趟出一条新路。
据悉,imGeek开发者社区是由环信赞助,截止2015年5月,环信服务了23763个App以及几万开发者,环信的创始团队均是世界著名开源项目的贡献者,运营总监是原开源力量社区的创始人,相信正是由于他们对移动开发者的深度了解,促使imGeek开发者社区将逐步发展成为移动开发者们的核心聚集地。 收起阅读 »
推荐算法和机器学习入门
互联网是什么?
马云说:“很多人还没搞清楚什么是PC互联网的时候,移动互联网来了,我们还没搞清楚移动互联的时候,大数据时代又来了。”
大数据又是什么?
有人说,从庞杂的数据背后挖掘、分析用户的行为习惯和喜好,找出更符合用户“口味”的产品和服务,就是大数据。
且听浙江网新恒天大数据技术负责人李海峰为大家分享的课程。
课程视频:
推荐算法和机器学习入门介绍
<烟波浩渺,算法为王>
<他山之石,可以攻玉> 收起阅读 »
马云说:“很多人还没搞清楚什么是PC互联网的时候,移动互联网来了,我们还没搞清楚移动互联的时候,大数据时代又来了。”
大数据又是什么?
有人说,从庞杂的数据背后挖掘、分析用户的行为习惯和喜好,找出更符合用户“口味”的产品和服务,就是大数据。
且听浙江网新恒天大数据技术负责人李海峰为大家分享的课程。
课程视频:
推荐算法和机器学习入门介绍
<烟波浩渺,算法为王>
<他山之石,可以攻玉> 收起阅读 »
Java实现环信服务器端接口,需要的联系我qq1138789752
本人花了1周实现本测试了目前环信服务端所有的接口,需要的代码克联系我qq1138789752,接口列表如下:
import java.io.File;
import com.liaozi.imhere.entity.TalkMsg;
import com.liaozi.imhere.entity.TalkNode;
public interface TalkDataService {
/**
* 登录环信平台
* @param username 注册账户
* @param password 登录密码
* @param nickname 用户昵称
* */
public TalkNode login(String username, String password) throws Exception;
/**
* 退出环信平台
* @param username 注册账户
* */
public TalkNode logout(String username) throws Exception;
/**
* 添加用户信息(单个)
* @param username 注册账户
* @param password 登录密码
* @param nickname 用户昵称
* */
public TalkNode userSave(String username, String password, String nickname) throws Exception;
/**
* 添加用户信息(批量)
* @param username 注册账户
* @param password 登录密码
* @param nickname 用户昵称
* */
public TalkNode userSave(String[] username, String[] password, String[] nickname) throws Exception;
/**
* 删除用户信息(单个)
* @param username 注册账户
* */
public TalkNode userDrop(String username) throws Exception;
/**
* 删除用户信息(批量)
* @param size 当前页数
* */
public TalkNode userDrop(Long size) throws Exception;
/**
* 启用禁用账户
* @param username 注册账户
* */
public TalkNode userModifyAccess(String username, Boolean access) throws Exception;
/**
* 修改用户密码
* @param username 注册账户
* @param password 登录密码
* */
public TalkNode userModifyPassword(String username, String password) throws Exception;
/**
* 修改用户昵称
* @param username 注册账户
* @param nickname 用户昵称
* */
public TalkNode userModifyNickname(String username, String nickname) throws Exception;
/**
* 获取用户信息
* @param username 注册账户
* */
public TalkNode userGet(String username) throws Exception;
/**
* 获取用户信息
* @param size 当前页数
* @param cursor 当前游标
* @param start 开始毫秒
* */
public TalkNode userList(Long size, String cursor, Long start) throws Exception;
/**
* 判断用户状态
* @param username 注册账户
* */
public TalkNode userLine(String username) throws Exception;
/**
* 获取所属群组(好友群)
* @param username 注册账户
* */
public TalkNode userGroupList(String username) throws Exception;
/**
* 获取所属群组(聊天室)
* @param username 注册账户
* */
public TalkNode userRoomList(String username) throws Exception;
/**
* 获取消息数量(离线)
* @param username 注册账户
* */
public TalkNode userMessageCount(String username) throws Exception;
/**
* 获取消息状态(离线)
* @param username 注册账户
* @param id 消息编号
* */
public TalkNode userMessageLine(String username, String id) throws Exception;
/**
* 添加好友账户
* @param username 注册账户
* @param friend 好友账户
* */
public TalkNode friendSave(String username, String friend) throws Exception;
/**
* 删除好友账户
* @param username 注册账户
* @param friend 好友账户
* */
public TalkNode friendDrop(String username, String friend) throws Exception;
/**
* 获取好友列表
* @param username 注册账户
* */
public TalkNode friendList(String username) throws Exception;
/**
* 添加拦截账户
* @param username 注册账户
* @param friend 拦截账户
* */
public TalkNode blockSave(String username, String[] friend) throws Exception;
/**
* 删除拦截账户
* @param username 注册账户
* @param friend 拦截账户
* */
public TalkNode blockDrop(String username, String friend) throws Exception;
/**
* 获取拦截列表
* @param username 注册账户
* */
public TalkNode blockList(String username) throws Exception;
/**
* 添加群组信息
* @param owner 所属用户
* @param name 群组名称
* @param desc 群组描述
* @param limit 用户上限
* @param friend 好友账户
* */
public TalkNode groupSave(String owner, String name, String desc, Integer limit, String[] friend) throws Exception;
/**
* 删除群组信息
* @param id 群组编号
* */
public TalkNode groupDrop(String id) throws Exception;
/**
* 修改群组信息
* @param id 群组编号
* @param name 群组名称
* @param desc 群组描述
* @param limit 用户上限
* */
public TalkNode groupModify(String id, String name, String desc, Integer limit) throws Exception;
/**
* 修改群组群主
* @param id 群组编号
* @param owner 所属用户
* */
public TalkNode groupModifyOwner(String id, String owner) throws Exception;
/**
* 获取群组信息
* @param id 群组编号
* */
public TalkNode groupGet(String[] id) throws Exception;
/**
* 获取群组列表
* @param size 当前页数
* @param cursor 当前游标
* @param start 开始毫秒
* */
public TalkNode groupList(Long size, String cursor, Long start) throws Exception;
/**
* 添加群组好友(单个)
* @param id 群组编号
* @param friend 好友账户
* */
public TalkNode groupFriendSave(String id, String friend) throws Exception;
/**
* 添加群组好友(批量)
* @param id 群组编号
* @param friend 好友账户
* */
public TalkNode groupFriendSave(String id, String[] friend) throws Exception;
/**
* 删除群组好友(单个)
* @param id 群组编号
* @param friend 好友账户
* */
public TalkNode groupFriendDrop(String id, String friend) throws Exception;
/**
* 删除群组好友(批量)
* @param id 群组编号
* @param friend 好友账户
* */
public TalkNode groupFriendDrop(String id, String[] friend) throws Exception;
/**
* 获取群组好友
* @param id 群组编号
* */
public TalkNode groupFriendList(String id) throws Exception;
/**
* 添加群组拦截(单个)
* @param id 群组编号
* @param friend 拦截账户
* */
public TalkNode groupBlackSave(String id, String friend) throws Exception;
/**
* 添加群组拦截(批量)
* @param id 群组编号
* @param friend 拦截账户
* */
public TalkNode groupBlackSave(String id, String[] friend) throws Exception;
/**
* 删除群组拦截(单个)
* @param id 群组编号
* @param friend 拦截账户
* */
public TalkNode groupBlackDrop(String id, String friend) throws Exception;
/**
* 删除群组拦截(批量)
* @param id 群组编号
* @param friend 拦截账户
* */
public TalkNode groupBlackDrop(String id, String[] friend) throws Exception;
/**
* 获取群组拦截
* @param id 群组编号
* */
public TalkNode groupBlackList(String id) throws Exception;
/**
* 上传文件数据
* @param file 文件数据
* */
public TalkNode fileUpload(File file) throws Exception;
/**
* 下载文件数据
* @param id 文件编号
* @param share 分享编号
* @param thumb 是否缩放
* @param file 本地文件
* */
public void fileDown(String id, String share, Boolean thumb, File file) throws Exception;
/**
* 添加消息数据
* @param data 消息数据
* */
public TalkNode messageSave(TalkMsg data) throws Exception;
/**
* 获取消息列表
* @param size 当前页数
* @param cursor 当前游标
* @param start 开始毫秒
* */
public TalkNode messageList(Long size, String cursor, Long start) throws Exception;
/**
* 获取聊天列表
* @param size 当前页数
* @param cursor 当前游标
* @param start 开始毫秒
* */
public TalkNode chatList(Long size, String cursor, Long start) throws Exception;
/**
* 添加聊天群组
* @param owner 所属用户
* @param name 群组名称
* @param desc 群组描述
* @param limit 用户上限
* @param friend 聊天账户
* */
public TalkNode roomSave(String owner, String name, String desc, Integer limit, String[] friend) throws Exception;
/**
* 修改聊天群组
* @param id 群组编号
* @param name 群组名称
* @param desc 群组描述
* @param limit 用户上限
* */
public TalkNode roomModify(String id, String name, String desc, Integer limit) throws Exception;
/**
* 删除聊天群组
* @param id 群组编号
* */
public TalkNode roomDrop(String id) throws Exception;
/**
* 获取聊天群组
* @param id 群组编号
* */
public TalkNode roomGet(String id) throws Exception;
/**
* 获取聊天群组
* */
public TalkNode roomList() throws Exception;
/**
* 获取聊天好友(单个)
* @param id 群组编号
* @param friend 聊天账户
* */
public TalkNode roomFriendSave(String id, String friend) throws Exception;
/**
* 获取聊天好友(批量)
* @param id 群组编号
* @param friend 聊天账户
* */
public TalkNode roomFriendSave(String id, String[] friend) throws Exception;
/**
* 删除聊天好友(单个)
* @param id 群组编号
* @param friend 聊天账户
* */
public TalkNode roomFriendDrop(String id, String friend) throws Exception;
/**
* 删除聊天好友(批量)
* @param id 群组编号
* @param friend 聊天账户
* */
public TalkNode roomFriendDrop(String id, String[] friend) throws Exception;
} 收起阅读 »
import java.io.File;
import com.liaozi.imhere.entity.TalkMsg;
import com.liaozi.imhere.entity.TalkNode;
public interface TalkDataService {
/**
* 登录环信平台
* @param username 注册账户
* @param password 登录密码
* @param nickname 用户昵称
* */
public TalkNode login(String username, String password) throws Exception;
/**
* 退出环信平台
* @param username 注册账户
* */
public TalkNode logout(String username) throws Exception;
/**
* 添加用户信息(单个)
* @param username 注册账户
* @param password 登录密码
* @param nickname 用户昵称
* */
public TalkNode userSave(String username, String password, String nickname) throws Exception;
/**
* 添加用户信息(批量)
* @param username 注册账户
* @param password 登录密码
* @param nickname 用户昵称
* */
public TalkNode userSave(String[] username, String[] password, String[] nickname) throws Exception;
/**
* 删除用户信息(单个)
* @param username 注册账户
* */
public TalkNode userDrop(String username) throws Exception;
/**
* 删除用户信息(批量)
* @param size 当前页数
* */
public TalkNode userDrop(Long size) throws Exception;
/**
* 启用禁用账户
* @param username 注册账户
* */
public TalkNode userModifyAccess(String username, Boolean access) throws Exception;
/**
* 修改用户密码
* @param username 注册账户
* @param password 登录密码
* */
public TalkNode userModifyPassword(String username, String password) throws Exception;
/**
* 修改用户昵称
* @param username 注册账户
* @param nickname 用户昵称
* */
public TalkNode userModifyNickname(String username, String nickname) throws Exception;
/**
* 获取用户信息
* @param username 注册账户
* */
public TalkNode userGet(String username) throws Exception;
/**
* 获取用户信息
* @param size 当前页数
* @param cursor 当前游标
* @param start 开始毫秒
* */
public TalkNode userList(Long size, String cursor, Long start) throws Exception;
/**
* 判断用户状态
* @param username 注册账户
* */
public TalkNode userLine(String username) throws Exception;
/**
* 获取所属群组(好友群)
* @param username 注册账户
* */
public TalkNode userGroupList(String username) throws Exception;
/**
* 获取所属群组(聊天室)
* @param username 注册账户
* */
public TalkNode userRoomList(String username) throws Exception;
/**
* 获取消息数量(离线)
* @param username 注册账户
* */
public TalkNode userMessageCount(String username) throws Exception;
/**
* 获取消息状态(离线)
* @param username 注册账户
* @param id 消息编号
* */
public TalkNode userMessageLine(String username, String id) throws Exception;
/**
* 添加好友账户
* @param username 注册账户
* @param friend 好友账户
* */
public TalkNode friendSave(String username, String friend) throws Exception;
/**
* 删除好友账户
* @param username 注册账户
* @param friend 好友账户
* */
public TalkNode friendDrop(String username, String friend) throws Exception;
/**
* 获取好友列表
* @param username 注册账户
* */
public TalkNode friendList(String username) throws Exception;
/**
* 添加拦截账户
* @param username 注册账户
* @param friend 拦截账户
* */
public TalkNode blockSave(String username, String[] friend) throws Exception;
/**
* 删除拦截账户
* @param username 注册账户
* @param friend 拦截账户
* */
public TalkNode blockDrop(String username, String friend) throws Exception;
/**
* 获取拦截列表
* @param username 注册账户
* */
public TalkNode blockList(String username) throws Exception;
/**
* 添加群组信息
* @param owner 所属用户
* @param name 群组名称
* @param desc 群组描述
* @param limit 用户上限
* @param friend 好友账户
* */
public TalkNode groupSave(String owner, String name, String desc, Integer limit, String[] friend) throws Exception;
/**
* 删除群组信息
* @param id 群组编号
* */
public TalkNode groupDrop(String id) throws Exception;
/**
* 修改群组信息
* @param id 群组编号
* @param name 群组名称
* @param desc 群组描述
* @param limit 用户上限
* */
public TalkNode groupModify(String id, String name, String desc, Integer limit) throws Exception;
/**
* 修改群组群主
* @param id 群组编号
* @param owner 所属用户
* */
public TalkNode groupModifyOwner(String id, String owner) throws Exception;
/**
* 获取群组信息
* @param id 群组编号
* */
public TalkNode groupGet(String[] id) throws Exception;
/**
* 获取群组列表
* @param size 当前页数
* @param cursor 当前游标
* @param start 开始毫秒
* */
public TalkNode groupList(Long size, String cursor, Long start) throws Exception;
/**
* 添加群组好友(单个)
* @param id 群组编号
* @param friend 好友账户
* */
public TalkNode groupFriendSave(String id, String friend) throws Exception;
/**
* 添加群组好友(批量)
* @param id 群组编号
* @param friend 好友账户
* */
public TalkNode groupFriendSave(String id, String[] friend) throws Exception;
/**
* 删除群组好友(单个)
* @param id 群组编号
* @param friend 好友账户
* */
public TalkNode groupFriendDrop(String id, String friend) throws Exception;
/**
* 删除群组好友(批量)
* @param id 群组编号
* @param friend 好友账户
* */
public TalkNode groupFriendDrop(String id, String[] friend) throws Exception;
/**
* 获取群组好友
* @param id 群组编号
* */
public TalkNode groupFriendList(String id) throws Exception;
/**
* 添加群组拦截(单个)
* @param id 群组编号
* @param friend 拦截账户
* */
public TalkNode groupBlackSave(String id, String friend) throws Exception;
/**
* 添加群组拦截(批量)
* @param id 群组编号
* @param friend 拦截账户
* */
public TalkNode groupBlackSave(String id, String[] friend) throws Exception;
/**
* 删除群组拦截(单个)
* @param id 群组编号
* @param friend 拦截账户
* */
public TalkNode groupBlackDrop(String id, String friend) throws Exception;
/**
* 删除群组拦截(批量)
* @param id 群组编号
* @param friend 拦截账户
* */
public TalkNode groupBlackDrop(String id, String[] friend) throws Exception;
/**
* 获取群组拦截
* @param id 群组编号
* */
public TalkNode groupBlackList(String id) throws Exception;
/**
* 上传文件数据
* @param file 文件数据
* */
public TalkNode fileUpload(File file) throws Exception;
/**
* 下载文件数据
* @param id 文件编号
* @param share 分享编号
* @param thumb 是否缩放
* @param file 本地文件
* */
public void fileDown(String id, String share, Boolean thumb, File file) throws Exception;
/**
* 添加消息数据
* @param data 消息数据
* */
public TalkNode messageSave(TalkMsg data) throws Exception;
/**
* 获取消息列表
* @param size 当前页数
* @param cursor 当前游标
* @param start 开始毫秒
* */
public TalkNode messageList(Long size, String cursor, Long start) throws Exception;
/**
* 获取聊天列表
* @param size 当前页数
* @param cursor 当前游标
* @param start 开始毫秒
* */
public TalkNode chatList(Long size, String cursor, Long start) throws Exception;
/**
* 添加聊天群组
* @param owner 所属用户
* @param name 群组名称
* @param desc 群组描述
* @param limit 用户上限
* @param friend 聊天账户
* */
public TalkNode roomSave(String owner, String name, String desc, Integer limit, String[] friend) throws Exception;
/**
* 修改聊天群组
* @param id 群组编号
* @param name 群组名称
* @param desc 群组描述
* @param limit 用户上限
* */
public TalkNode roomModify(String id, String name, String desc, Integer limit) throws Exception;
/**
* 删除聊天群组
* @param id 群组编号
* */
public TalkNode roomDrop(String id) throws Exception;
/**
* 获取聊天群组
* @param id 群组编号
* */
public TalkNode roomGet(String id) throws Exception;
/**
* 获取聊天群组
* */
public TalkNode roomList() throws Exception;
/**
* 获取聊天好友(单个)
* @param id 群组编号
* @param friend 聊天账户
* */
public TalkNode roomFriendSave(String id, String friend) throws Exception;
/**
* 获取聊天好友(批量)
* @param id 群组编号
* @param friend 聊天账户
* */
public TalkNode roomFriendSave(String id, String[] friend) throws Exception;
/**
* 删除聊天好友(单个)
* @param id 群组编号
* @param friend 聊天账户
* */
public TalkNode roomFriendDrop(String id, String friend) throws Exception;
/**
* 删除聊天好友(批量)
* @param id 群组编号
* @param friend 聊天账户
* */
public TalkNode roomFriendDrop(String id, String[] friend) throws Exception;
} 收起阅读 »
imgeek社区上线“活动”板块,求玩环
社区上线“活动”板块,公测中,求玩环
http://www.imgeek.org/activity/
花了偶们一个月的时间,改版后的社区活动模块开始公测,相对于以前的和传统的活动报名网站,有了几个改进:
1. 开放演讲报名
2. 开放投票,你的投票将决定演讲顺序
3. 未注册用户也可以报名
4. 活动中的提问和社区相结合,在活动中的提问将进入社区问题流,更多的人将会看到你的问题
5. 开放合作伙伴和志愿者申请通道,并得到展示
收起阅读 »
http://www.imgeek.org/activity/
花了偶们一个月的时间,改版后的社区活动模块开始公测,相对于以前的和传统的活动报名网站,有了几个改进:
1. 开放演讲报名
2. 开放投票,你的投票将决定演讲顺序
3. 未注册用户也可以报名
4. 活动中的提问和社区相结合,在活动中的提问将进入社区问题流,更多的人将会看到你的问题
5. 开放合作伙伴和志愿者申请通道,并得到展示
收起阅读 »
php和nodejs服务端代码示例参考
https://github.com/easemob/emchat-server-examples 这个github上的php和nodejs已经是最新代码,找不到的小伙伴也可以从这里下载查看,有什么问题欢迎随时交流,我QQ:1003432453,邮箱:fengpei@easemob.com。 收起阅读 »
新版AndroidStudio以及新版sdk开发环境创建新项目可能会出现的一些错误问题
首先说下我这边开发的环境:
AndroidStudio version:1.4.1
jdk version:1.7.0
SDKTools version:24.4.x
Build-tools version:23.0.1
Compile SDK version:API 22 (5.1)
Minimum SDK version:API 15(4.0.3)
Gradle version:2.4
连接地址:
AndroidStudio等工具地址:
Android官网:http://developer.android.com/
国内收集: http://www.androiddevtools.cn/
gradle v2.4下载(as有时自动下载不成功,所以要自己下载):https://downloads.gradle.org/distributions/gradle-2.4-all.zip
关于gradle首次创建项目卡住的问题可以看下这篇文章AndroidStudio 新建及clone项目关于gradle出现的问题"
创建项目
这里使用AndroidStudio创建一个空的项目就OK了,
打开AndroidStudio 点击Start a new Android Studio project创建新项目
当创建成功后发现会出现了一些问题
这个是因为最新的创建项目会使用junit库来进行代码测试,在下载这个库的内容的时候发现他引用了hamcrest这个框架,不过国内下载这个框架的这个接啊日报hamcrest-core.jar不成功,所以会报这个错误,可以把build.gradle里引用的junit给删除或注释
这个是因为创建项目默认使用appcompat-v7包23.0.1版本,这个版本好像有问题,手动把这个版本号改下就ok了,改成22.+然后同步 就ok
同步发表到个人博客:http://blog.melove.net 收起阅读 »
AndroidStudio version:1.4.1
jdk version:1.7.0
SDKTools version:24.4.x
Build-tools version:23.0.1
Compile SDK version:API 22 (5.1)
Minimum SDK version:API 15(4.0.3)
Gradle version:2.4
连接地址:
AndroidStudio等工具地址:
Android官网:http://developer.android.com/
国内收集: http://www.androiddevtools.cn/
gradle v2.4下载(as有时自动下载不成功,所以要自己下载):https://downloads.gradle.org/distributions/gradle-2.4-all.zip
关于gradle首次创建项目卡住的问题可以看下这篇文章AndroidStudio 新建及clone项目关于gradle出现的问题"
创建项目
这里使用AndroidStudio创建一个空的项目就OK了,
打开AndroidStudio 点击Start a new Android Studio project创建新项目
当创建成功后发现会出现了一些问题
问题一
Error:A problem occurred configuring project ':app'.
> Could not download junit.jar (junit:junit:4.12)
> Could not get resource 'https://jcenter.bintray.com/junit/junit/4.12/junit-4.12.jar'.
> Could not GET 'https://jcenter.bintray.com/junit/junit/4.12/junit-4.12.jar'.
> peer not authenticated
Error:A problem occurred configuring project ':app'.
> Could not download hamcrest-core.jar (org.hamcrest:hamcrest-core:1.3): No cached version available for offline mode
这个是因为最新的创建项目会使用junit库来进行代码测试,在下载这个库的内容的时候发现他引用了hamcrest这个框架,不过国内下载这个框架的这个接啊日报hamcrest-core.jar不成功,所以会报这个错误,可以把build.gradle里引用的junit给删除或注释
问题二
D:\develop\android\workspace\studio\EaseUICustomer\app\build\intermediates\exploded-aar\com.android.support\appcompat-v7\23.1.0\res\values-v23\values-v23.xml
Error:(2) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.
Error:(2) Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.Button.Colored'.
Error:Execution failed for task ':app:processDebugResources'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:\develop\android\android_sdk\build-tools\build-tools-23.0.1\aapt.exe'' finished with non-zero exit value 1
这个是因为创建项目默认使用appcompat-v7包23.0.1版本,这个版本好像有问题,手动把这个版本号改下就ok了,改成22.+然后同步 就ok
同步发表到个人博客:http://blog.melove.net 收起阅读 »
AndroidStudio一个工程内查看多个项目的实现
现在已经有很多人开始使用AndroidStudio开始开发Android了,但是这货有一点儿不好,一个界面只能打开一个项目,当我们在开发自己的项目时,如果想像eclipse查看别的demo的代码或者功能,只能再另外打开一个Window新开项目,其实呢AndroidStudio可以在一个项目中导入多个Module,这里以导入环信最新版的几个demo来实现在AndroidStudi中查看多个项目;
首先导入3.0的项目,3.0的demo引入了EaseUI库,在导入AndroidStudio的时候会以Module的形式自动导入EaseUI,EaseUI库中放着simpledemo这个小demo,我们先把它剪切出来,和其他的demo放在一起,等下我们就在一个AndroidStudio项目中导入环信的这些全部demo
首先导入3.0Demo:
因为要导入所有的demo所以给导入的项目重新命名下
导入完成后就可以开始导入其他项目了,不过想在当前项目中导入其他项目要选择Import Module的方式,下边以导入环信老版本的demo为例
OK 导入成功,可以看到项目中有三个Module了 easeUI easeUIDemo oldDemo,其中oldDemo就是刚才导入的老版本的demo,只是改了个名字
然后看下Run/Debug configuration 可以发现这里有两个配置项,就说明当前工程内有两个可运行的Android项目
下边再导入那个简单的easeuidemo看下
导入之后看下Project Structure 可以看到当前项目有四个Module,一个EaseUI library库,其他三个是Android app项目easeUIDemo 和easeUISimpleDemo引用了EaseUI库,oldDemo是老版本直接集成的demo
可以根据这里的选择来运行不同的module,并且可以在一个工程内查看所有的代码
同步发表到个人博客:http://melove.net
文章地址:http://blog.melove.net/lzan13/develops/android-develop/androidstudio-project-module-941.html 收起阅读 »
首先导入3.0的项目,3.0的demo引入了EaseUI库,在导入AndroidStudio的时候会以Module的形式自动导入EaseUI,EaseUI库中放着simpledemo这个小demo,我们先把它剪切出来,和其他的demo放在一起,等下我们就在一个AndroidStudio项目中导入环信的这些全部demo
首先导入3.0Demo:
因为要导入所有的demo所以给导入的项目重新命名下
导入完成后就可以开始导入其他项目了,不过想在当前项目中导入其他项目要选择Import Module的方式,下边以导入环信老版本的demo为例
OK 导入成功,可以看到项目中有三个Module了 easeUI easeUIDemo oldDemo,其中oldDemo就是刚才导入的老版本的demo,只是改了个名字
然后看下Run/Debug configuration 可以发现这里有两个配置项,就说明当前工程内有两个可运行的Android项目
下边再导入那个简单的easeuidemo看下
导入之后看下Project Structure 可以看到当前项目有四个Module,一个EaseUI library库,其他三个是Android app项目easeUIDemo 和easeUISimpleDemo引用了EaseUI库,oldDemo是老版本直接集成的demo
可以根据这里的选择来运行不同的module,并且可以在一个工程内查看所有的代码
同步发表到个人博客:http://melove.net
文章地址:http://blog.melove.net/lzan13/develops/android-develop/androidstudio-project-module-941.html 收起阅读 »
环信移动客服云产品使用指南抢先看
问产品经理拿到新鲜出炉带着热气的产品使用指南。
这个不是最终版,正式版本以这里的为准: http://docs.easemob.com/
要提前学习的同学可以下载啦! 免费注册试用环信移动客服云-->
这个不是最终版,正式版本以这里的为准: http://docs.easemob.com/
要提前学习的同学可以下载啦! 免费注册试用环信移动客服云-->
关于环信新版EaseUI库导入AndroidStudio问题
环信大牛最新封装了一个供开发者直接使用的UI库 EaseUI,这个可以让大家快速的进行集成环信的sdk进行实现聊天,官方也说了老版本的demo不会进行维护,重点维护这个EaseUI,但是在自己导入的时候有时会有些问题,这里用1.4版本的AndroidStudio导入3.0的demo来说明下;
首先就是打开as导入项目
我喜欢给他改个名字EaseUIDemo
导入完成
我这边导入时没有问题的,有时导入demo或者我们自己创建的项目 然后导入easeui库,并加入到自己的项目中去的时候可能会出现下边这样的错误 ,出现问题的原因的大致因为EaseUI默认引入的v4包的版本20.0.0,但是大家的开发环境不同,sdk版本以及编译器和support库版本不同,会出现错误;
设置了之后,要记得同步gradle 1 or 2 方式都可以
如果是自己创建的项目想在as中引入EaseUI库,可以点击File->New->Import Module选项
同步发表到个人博客:http://melove.net 收起阅读 »
首先就是打开as导入项目
我喜欢给他改个名字EaseUIDemo
导入完成
我这边导入时没有问题的,有时导入demo或者我们自己创建的项目 然后导入easeui库,并加入到自己的项目中去的时候可能会出现下边这样的错误 ,出现问题的原因的大致因为EaseUI默认引入的v4包的版本20.0.0,但是大家的开发环境不同,sdk版本以及编译器和support库版本不同,会出现错误;
解决办法:这个时候就去点击项目设置,选中EaseUI把sdk版本设置成和build.gradle里一样的版本就行了,如果过低,建议更新sdk,还不行,就把自己的项目的sdk版本和EaseUI都设置成一样,v4库也设置成一样
设置了之后,要记得同步gradle 1 or 2 方式都可以
如果是自己创建的项目想在as中引入EaseUI库,可以点击File->New->Import Module选项
同步发表到个人博客:http://melove.net 收起阅读 »
关于新版AndroidStudio导入环信Demo的一些注意事项
这里是以AndroidStudio v1.4版本为例
新版AndroidStudio已经可以直接导入eclipse的项目了,具体步骤看下边(会的飘过)
有一点要注意:as导入eclipse的项目,如果项目有引入library项目,并且library项目路径正确,as在导入eclipse的项目的同时会自动导入library为module
启动as 进入起始页,有些设置的是启动直接打开项目了,可以在设置里先设置下:
设置了之后,在启动就是进入到启动界面了:
选择Import project(Eclipse ADT, Gradle, etc)选项开始选择导入eclipse创建的Android项目
然后选择项目路径,这里以最新版环信demo2.2.4为例
然后选择项目目的路径(相当于工作空间,带上项目目录名)
提示目录不存在,不存在就对了 ok
继续默认 Finish
然后就是等待,这个一般有时会卡住,因为有时需要下载gradle的包,会很慢很慢,解决办法就是自己去gradle官网去下载gradle包,至于怎么解决看下这篇:关于环信新版EaseUI库导入AndroidStudio问题
导入成功,打开项目就是这样了
下边多说一句,就是如果自己创建的项目想要引用EaseUI这个库(不只是这个库,其他任何的library库),可以直接在项目界面,点击菜单栏File->New->Import Module 然后选择easeui路径就ok
同步发表到个人博客:http://melove.net 收起阅读 »
新版AndroidStudio已经可以直接导入eclipse的项目了,具体步骤看下边(会的飘过)
有一点要注意:as导入eclipse的项目,如果项目有引入library项目,并且library项目路径正确,as在导入eclipse的项目的同时会自动导入library为module
启动as 进入起始页,有些设置的是启动直接打开项目了,可以在设置里先设置下:
设置了之后,在启动就是进入到启动界面了:
选择Import project(Eclipse ADT, Gradle, etc)选项开始选择导入eclipse创建的Android项目
然后选择项目路径,这里以最新版环信demo2.2.4为例
注意:环信的ChatDemoUI这个demo里边因为研发的同事为了照顾老版本的as使用者,已经用eclipse生成了build.gradle文件,所以如果要导入新版as 请把build.gradle删除
然后选择项目目的路径(相当于工作空间,带上项目目录名)
提示目录不存在,不存在就对了 ok
继续默认 Finish
然后就是等待,这个一般有时会卡住,因为有时需要下载gradle的包,会很慢很慢,解决办法就是自己去gradle官网去下载gradle包,至于怎么解决看下这篇:关于环信新版EaseUI库导入AndroidStudio问题
导入成功,打开项目就是这样了
下边多说一句,就是如果自己创建的项目想要引用EaseUI这个库(不只是这个库,其他任何的library库),可以直接在项目界面,点击菜单栏File->New->Import Module 然后选择easeui路径就ok
同步发表到个人博客:http://melove.net 收起阅读 »
新增“代码”区
收录了基于环信SDK开发的开源项目,大家写代码的时候就有更多参考了。
如果你们什么好的项目,特别是基于环信SDK开发的,并且愿意开源分享出来,请在http://www.imgeek.org/page/code后跟贴回复,我们将收录在的“代码”区,让你的成果与更多人分享。
收起阅读 »
如果你们什么好的项目,特别是基于环信SDK开发的,并且愿意开源分享出来,请在http://www.imgeek.org/page/code后跟贴回复,我们将收录在的“代码”区,让你的成果与更多人分享。
收起阅读 »
ASN 和 PB 的编码效率比较
作者:王纯业 ,转自http://blog.easemob.com/
### 第一个例子
http://martin.kleppmann.com/2012/12/05/schema-evolution-in-avro-protocol-buffers-thrift.html 是一个很好的比较例子。
我类似的做了一个 ASN1 的结构
```
Person DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
Person ::= SEQUENCE {
username PrintableString,
favouritenumber INTEGER,
interests SEQUENCE OF PrintableString
}
END
```
用下面的方法编译
```
erlc -I. -bper Person.asn
erl
> c("Person").
{ok,'Person'}
> {ok, B} = 'Person':encode('Person', #'Person'{username = "Martin", favouritenumber = 1337, interests = ["daydreaming", "hacking"]}).
{ok,<<6,77,97,114,116,105,110,2,5,57,2,11,100,97,121,100,
114,101,97,109,105,110,103,7,104,97,99,...>>}
> byte_size(B).
31
```
这个例子里面,ASN1 用了 31 bytes ,protobuf 用了 33 bytes, Avro 用了
32 bytes。 这不是一个公平的比较,对于大量使用小数据结构的时候,例如,
enum command type 之类的,ASN1 可以节省更多的 bytes 。
### 第二个例子
这是 protobuf 的定义。
```
package dummy;
message S {
optional int32 a =1;
optional bool b =2;
optional int32 c =3;
optional D d =4;
}
message D {
optional bool d1 = 1;
optional bool d2 = 2;
}
```
用 erlang 编译 参考 [https://github.com/tomas-abrahamsson/gpb]()
```
> deps/gpb/bin/protoc-erl -I. -o-erl src -o-hrl include s1.proto
> erl -sname a@localhost
(a@localhost)1> R = #'S'{a=1,b=true,c=2, d=#'D'{d1 = true, d2 = true} }.
#'S'{a =1,b = true,c = 2,d = #'D'{d1 = true,d2 = true}}
(sync@localhost)2> s1:encode_msg(R).
<<8,1,16,1,24,2,34,4,8,1,16,1>>
(a@localhost)14> byte_size(s1:encode_msg(R)).
12
```
可以看到 protobuf 用了 12 个字节。
ASN1 的例子,使用 PER 编码方式。
```
Dummy DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
Dummy ::= SEQUENCE {
a INTEGER (0..7),
b BOOLEAN,
c INTEGER (0..3),
d SEQUENCE {
d1 BOOLEAN,
d2 BOOLEAN }}
END
```
```
> erlc -I. -bper Dummy.asn
> erl
(a@localhost)1> 'Dummy':encode('Dummy', #'Dummy'{ a = 1, b = true, c = 2, d = #'Dummy_d'{d1= true, d2 = true }}).
{ok,<<";">>}
```
protobuf 用了 12 个字节, ASN1 用了 1 个字节。同样,这也不是一个公平的比较。
很难做出公平的比较。但是可以说在大多数情况下 ASNPER 的编码是更加节省带宽的。
### 为什么 ASN1 PER 的编码效率比 PB 的高
1. ASN1 PER 是面向 bit 的编码方式,PB 是面向字节的编码方式。
2. PB 中 message 都是可以扩展的,ASN1 中只有使用 `...` 关键字的类型,才是可以扩展的。
3. PB 中的整数很简单,都是可以扩展到 64 位,ASN1 中有更加灵活(复杂) 的整数扩展方式。
2. PB 中的 `required`, `optional`, `oneof`, 和 `extensions` 的特性,对编码没有影响。例如,就算是 `required` 的字段,编码的时候,也是需要 tag 。
3. ASN1 PER 对很多关键字都是敏感的。例如
1. `required` 的字段不会添加表明类型的 tag
2. `required` 的字段按顺序编码。
4. tag 在 PER 中不做编码。
5. by default, every message is extensible in PB. Instread, ASN1 extensibility should be explicitly specified.
4. PB 中支持的整数类型不支持 subtype, 而 ASN1 PER 中的整数支持 subtype , 可以实现高效编码。
### 使用 ASN1 的优点
1. 编码紧凑,节省带宽。这是为什么几乎所有的 2G/3G/4G/5G 的无线通信协议都使用 ASN1 的原因之一。
2. ASN1 久经考验,asn1c 的项目已经十多年了,依然活跃开发。 Erlang 因为是通信公司创造的,语言内嵌 ASN 的支持。 Erlang 没有默认支持 PB 需要使用第三方开发库。
3. ASN1 支持 XER (XML) ,可以方便的调试。
4. wireshark 本身对 ASN1 的支持很好。
### 使用 ASN1 PER 的风险
1. ASN1 本身很复杂。ASN1 的学习成本高
2. PER 编码很复杂。可以用700行 C 代码实现 PB 的编解码,但实现 PER 编码不行。
3. ASN1 对语言的支持不多,似乎只有 C/Erlang 有比较好的使用。由于历史原因,通信领域几乎没有其他语言可供选择。
收起阅读 »
【社区福利,Apache Con赠票,原价249元】 Apache年度大会
各位亲,凡imgeek社区注册会员,回复“我要赠票”,即可免费获得于本周六周日在北京中科院举办的Apache年度大会(价值249 RMB).
我们将通过后台私信给你免费参会码,你拿到这个码即可通过大会官网免费报名.
仅限前50位回复者!先到先得
大会官网:http://www.kaiyuanshe.cn/index.php?option=com_content&view=article&id=84
北京海淀区中关村东路80号,中科院大学管理学院教学楼
2015年10月24日 - 10月25日 ,本周六周日
优惠码使用方法:
购票链接:https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fwww.huodongxing.com%2fevent%2f9291887966700&data=01%7c01%7cemchen%40064d.mgd.microsoft.com%7c80feb925ffc5494b5f6b08d2d904a16c%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=3CRU6CWIo7rf5WIX7h7Xqk9e%2bn9pQfOkWW3HSN%2f5Dcg%3d
优惠码使用说明:
1 电脑操作(手机操作会有优惠码失效的情况)。请滚动鼠标,出现图示悬浮框后,点击“我要参加”;
页面会自动跳转到购票区域,点击票种 “第一天+第二天(不含大数据金牌训练营)”;
2. 页面会自动跳转到“请填写报名表单”。请把鼠标网上移动,页面会露出“请输入优惠码”的
使用框;
3. 输入优惠码点击“使用”,票面价格会显示“0”元;点击票种价格后的“我要参加”按钮,之后按照实际情况填写报名表单提交即可。
收起阅读 »
我们将通过后台私信给你免费参会码,你拿到这个码即可通过大会官网免费报名.
仅限前50位回复者!先到先得
大会官网:http://www.kaiyuanshe.cn/index.php?option=com_content&view=article&id=84
北京海淀区中关村东路80号,中科院大学管理学院教学楼
2015年10月24日 - 10月25日 ,本周六周日
优惠码使用方法:
购票链接:https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fwww.huodongxing.com%2fevent%2f9291887966700&data=01%7c01%7cemchen%40064d.mgd.microsoft.com%7c80feb925ffc5494b5f6b08d2d904a16c%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=3CRU6CWIo7rf5WIX7h7Xqk9e%2bn9pQfOkWW3HSN%2f5Dcg%3d
优惠码使用说明:
1 电脑操作(手机操作会有优惠码失效的情况)。请滚动鼠标,出现图示悬浮框后,点击“我要参加”;
页面会自动跳转到购票区域,点击票种 “第一天+第二天(不含大数据金牌训练营)”;
2. 页面会自动跳转到“请填写报名表单”。请把鼠标网上移动,页面会露出“请输入优惠码”的
使用框;
3. 输入优惠码点击“使用”,票面价格会显示“0”元;点击票种价格后的“我要参加”按钮,之后按照实际情况填写报名表单提交即可。
收起阅读 »
Android 开源项目源码解析(Volley、UIL、Dagger、EventBus、xUtils 等分析)
目前包括:
Android 开源项目第一篇——个性化控件(View)篇
包括ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar、TextView、ScrollView、TimeView、TipView、FlipView、ColorPickView、GraphView、UI Style、其他
Android 开源项目第二篇——工具库篇
包括依赖注入、图片缓存、网络请求、数据库 ORM 工具包、Android 公共库、高版本向低版本兼容库、多媒体、事件总线、传感器、安全、插件化、文件、其他
Android 开源项目第三篇——优秀项目篇
比较有意思的完整的 Android 项目
Android 开源项目第四篇——开发及测试工具篇
包括开发效率工具、开发自测相关、测试工具、开发及编译环境、其他
Android 开源项目第五篇——优秀个人和团体篇
乐于分享并且有一些很不错的开源项目的个人和组织,包括 JakeWharton、Chris Banes、Koushik Dutta 等大牛
详细原文在github上面可以找到: https://github.com/Trinea/android-open-project#%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7%E5%8F%8A%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7 收起阅读 »
Android 开源项目第一篇——个性化控件(View)篇
包括ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar、TextView、ScrollView、TimeView、TipView、FlipView、ColorPickView、GraphView、UI Style、其他
Android 开源项目第二篇——工具库篇
包括依赖注入、图片缓存、网络请求、数据库 ORM 工具包、Android 公共库、高版本向低版本兼容库、多媒体、事件总线、传感器、安全、插件化、文件、其他
Android 开源项目第三篇——优秀项目篇
比较有意思的完整的 Android 项目
Android 开源项目第四篇——开发及测试工具篇
包括开发效率工具、开发自测相关、测试工具、开发及编译环境、其他
Android 开源项目第五篇——优秀个人和团体篇
乐于分享并且有一些很不错的开源项目的个人和组织,包括 JakeWharton、Chris Banes、Koushik Dutta 等大牛
详细原文在github上面可以找到: https://github.com/Trinea/android-open-project#%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7%E5%8F%8A%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7 收起阅读 »
Android 开发工具之Codota——搜索最好的Android 代码
Find Great Code Examples Our crawler extracts coding patterns from a vast number of code projects. Search here for the best code examples from over 7 million sources
上面是Codota 官方介绍的最好的代码实例,我们的抓取工具从大量的代码项目中抓取了大量的代码模式, 你可以从这里搜索超过七百万精品代码实例;Codota 的特性
的确,正如codota 官方所说,的确是精品,他的搜索源,不仅只有Github,而且还有知名博客和开发者网站,让你搜索一个东西,不用在找上半天;
除了搜索功能,首页的下方还罗列比较流行的类库,还提供保存代码的CodeBox,同时还提供了Chrome 插件和Android Studio 插件,最后通过Google,Github,Facebook 任意一个授权登录即可使用;
而且当你点击搜索的结果(Java class)的时候,右侧会显示UML 视图,而且左边的代码如果点击会有高亮现实,而且还会显示Doc,并提供了API Doc 的链接。
收起阅读 »
新增“帮助中心”
我们整理了一些已经解决的问题,做成了“帮助中心”,http://www.imgeek.org/help/
方便大家查询,及时获得答案
方便大家查询,及时获得答案
【视频】普及下环信即时通讯云
播放地址:http://yuntv.letv.com/bcloud.swf?uu=b133c59dd0&vu=1a538fb53a&pu=adfb3ced5e&auto_play=1&gpcflag=1&lang=zh_CN
ios推送字符长度有没有限制?
跟普通消息一样,30kb以内。另外,自定义的字段可以全部显示。
Web端怎么发送消息的?
老版本web端是靠http轮循发送消息的,也就说在一定时间向服务器发送http请求,服务器也在一定时间内发送消息到浏览器。这个时间是可以设置的。在新版本里面加了websocket 长连接,是支持 https 的。
环信的表情可以换成自己的吗?
可以更换,环信SDK提供的是一个聊天通道,demo提供的只是一个模板,ui方面的东西完全可以按照自己的要求来处理
demo是使用映射,具体可以参考下demo的 SmileUtils 类
demo是使用映射,具体可以参考下demo的 SmileUtils 类
logininfo有时候为空,是怎么回事?
没有登陆或者登录不成功。
显示时间能不能设置成间隔10分钟显示一次 ?
可以的,这个完全是在UI上来显示,可以按照自己设定时间来显示
环信sdk用到的那个位置定位有偏差吧?
sdk只是传递上层的经纬坐标,定位精度是相应的地图软件决定的。
聊天的内容储存在哪,用户是否能够保存和备份?
聊天的内容存储在环信的服务器上,同时用户本地也会保存一份,是SDK自动存储的。
一个客服系统,是否可以建立多个关联,是否可以关联不同的AppKey的关联?
一个客服系统下可以建立多个关联,也可以关联不同的appkey的IM用户。 详细查看 app接入 关联相关 文档 http://docs.easemob.com/doku.php?id=cs:300visitoraccess:10nativeapp
客服的接入人数有什么用?
接待人数是指系统给客户自动分配会话的最大人数,超过此人数以后,系统不再给客服分配会话。
用户后台关联的时候总是未启动,用户名和密码是没问题的,该如何处理?
检查下clientid,appkey,clientsecret这三个参数前后是否有空格,检查下用户名密码和appkey,clientId,secret是否有错误,先测试下这两种情况,再有其他原因就需要看后台日志了。
web端的那个表情文件在哪里?[(;] 后面 有一个value 那个value 代表的是 二进制流还是 图片路径 ?
使用的是base64编码,在http://webim.easemob.com/jquery-1.11.1.js var emotionPicData 。
管理后台当前登录账号禁止操作是什么情况?
只有一个管理员,不能移除,org下如果不止一个管理员,当前登陆的管理员可以移除另外一个管理员,但是不能移除自己。
环信的实时消息旁路接口是什么?
消息实时回调。环信server会把消息主动回调给用户的服务器。
发送消息的时候,没有网络,环信会不会像QQ那样有个自己去持续请求的时间呢?
环信有提供持续请求时间,如果过了设定的时间,才会返回发送失败的回调
到了收费临界点会不会通知?
会的。
[[EaseMob sharedInstance].chatManager setIsAutoLoginEnabled:YES]; 这个应该写到哪里呢?
只有您登录成功后设置这个才会生效,否则都不会有效,所以建议您在登录成功后设置。
为什么用户名密码在demo上登录成功的,但是在自己app上登录就说用户名和密码错误呢?
检查是否 是在自己appkey下注册的账号,不同的appkey下注册的账号是分离开的,不互通
环信的表情可以换成app的吗?
可以,目前SDK中使用的表情都是字符串匹配得来的。在消息传递过程中,发的就是字符串,当客户端需要展示的时候,转换成对应的图片即可。