【环信IM集成指南】iOS端常见问题整理
建议用浏览器搜索定位问题~
本文持续更新,欢迎大家留言点菜~
1、集成IM如何自定义添加表情组
https://www.imgeek.org/article/825357506
2、旧版音视频与EaseCallKit兼容升级方案
https://www.imgeek.org/article/825357507
3、如何集成环信EaseIMKit和EaseCallKit源码
https://www.imgeek.org/article/825357493
4、解决集成EaseIMKit源码后没有图片的问题
https://www.imgeek.org/article/825357495
5、EaseIMKit如何设置昵称、头像
https://www.imgeek.org/article/825354241
6、Swift是否可以集成环信IM SDK?
https://www.imgeek.org/article/825357511
7、环信IM会话列表和聊天界面修改头像和昵称
https://www.imgeek.org/article/825357608
8、手把手教集成EaseIMKit源码
https://www.imgeek.org/article/825357673
9、环信聊天室如何每次进来可以看到之前的已读消息
https://imgeek.org/article/825357723
10、这几个iOS拓展字段,是只对iOS生效吗?对安卓没有影响吧?
em_push_content 自定义推送显示
em_push_category 向 APNs Payload 中添加 category 字段
em_push_sound 自定义推送提示音
em_push_mutable_content 开启 APNs 通知扩展
em_ignore_notification 发送静默消息
em_force_notification 设置强制推送型 APNs
答:下面这三个对安卓不生效,其他的是两端都会起作用。
em_push_category、em_push_sound、em_push_mutable_content
11、无网时发送消息,然后迅速切到有网状态。这时显示发送成功,然后回退到上一个页面再进入到IM页,刚刚那条消息被重复发送了。
可以开通服务端消息去重功能。
12、如果设置了离线不踢出聊天室,那聊天室的消息会有离线推送吗?
聊天室没有离线处理,所以没有离线推送。
13、cmd不进行漫游功能配置成功之前的历史消息,在配置好之后还是能拉下来的。
14、iOS和安卓端发视频消息,对视频格式有要求吗?
答:没有
15.图片发送设置了缩略图,收到的消息里面没有缩略图,只有源文件数据
接收方会直接将缩略图下载到本地,SDK会自动把缩略图缓存到本地,您直接通过body.thumbnailLocalPath就可以获取到了, 我们的UI SDK已经对这些做了封装,不需要您再单独进行处理,如果您这边就是想拿到这张缩略图来使用的话,就需要在messagesDidReceive方法里面自己再判断一下,如果是图片消息的话,就去打印缩略图的路径,然后通过这个路径可以获取到缩略图的原图
case EMMessageBodyTypeImage:
{
// 得到一个图片消息body
EMImageMessageBody *body = ((EMImageMessageBody *)msgBody);
NSLog(@"大图remote路径 -- %@" ,body.remotePath);
NSLog(@"大图local路径 -- %@" ,body.localPath); // // 需要使用sdk提供的下载方法后才会存在
NSLog(@"大图的secret -- %@" ,body.secretKey);
NSLog(@"大图的W -- %f ,大图的H -- %f",body.size.width,body.size.height);
NSLog(@"大图的下载状态 -- %lu",body.downloadStatus);
// 缩略图sdk会自动下载
NSLog(@"小图remote路径 -- %@" ,body.thumbnailRemotePath);
NSLog(@"小图local路径 -- %@" ,body.thumbnailLocalPath);
NSLog(@"小图的secret -- %@" ,body.thumbnailSecretKey);
NSLog(@"小图的W -- %f ,大图的H -- %f",body.thumbnailSize.width,body.thumbnailSize.height);
NSLog(@"小图的下载状态 -- %lu”,body.thumbnailDownloadStatus);
16.后端该如何操作用户上麦
后端无法直接控制让谁上麦,所以只能通过发送CMD消息的方式来和移动端进行交互,移动端根据逻辑指令去操作
17.使用[[EMClient sharedClient].chatManager ackConversationRead:_conversation.conversationId completion:nil];将消息置为已读,但是还是有未读数
[[EMClient sharedClient].chatManager ackConversationRead:_conversation.conversationId completion:nil]; —- 这个方法是发送会话已读消息,将通知服务器将此会话未读数置为0,而将消息置为已读是本地操作,可以使用方法:
1).[[EaseIMKitManager shared] markAllMessagesAsReadWithConversation:_conversation];
2). [conversation markMessageAsReadWithId:message.messageId error:nil];
3).[conversation markMessageAsReadWithId:message.messageId error:nil];
注意:方法1是EaseIMKitManager调用的,方法2、3是EMConversation调用的
18.聊天页面头像设置圆角失败
如果要设置聊天页面头像的圆角值,需要先设置avatarType为圆形才会生效,如果想要设置为圆形,则直接给图片宽度的一半即可
19.调用getGroupSpecificationFromServerWithId获取群组详情失败,失败的原因 --- you have no permission to do this, group member permission is required
出现此问题的原因是当前用户不在群组内,获取群组详情必须是群组成员才有权限,如果因为场景特殊的话,可以使用rest接口获取。
20、如何将附件保存在自己的服务器上
1.项目中搜索:isAutoTransferMessageAttachments,将属性值改为no
2.用户上传文件完成后,不建议用户直接使用remotePath,而是使用ext扩展来存放文件链接.
21、请问后台和sdk对群组名称和群组描述,有字数或其他限制吗?分别是多少?
后台:名称 16字符 超出部分截去,描述64字符 超出部分截去
Sdk:无限制
22、全局广播相关:
(1)支持发送自定义类型消息和扩展消息吗?
支持。
(2)会有离线推送延迟的问题吗?
会,慢速堆积,就会延迟。延迟15分钟很正常的。
(3)全局广播的延迟是根据用户量来的,按每秒下发1000个来推,如果有用户1万个,预计需要10秒。
23、同一个环信id在多设备登录,可以同时加入同一个聊天室。但设备数量有限制,根据多端多设备功能配置的数量来。
24、p8证书在开发和生产环境下都可以工作(不需要在证书之间切换),最重要的是,它不会过期!
25、console后台添加推送证书有数量限制吗?
无限制。但不要短时间内快速上传大量证书。
26、获取token的接口,是根据ip做限制的。例如一个ip,每秒最多10次。
27、iOS端对于离线推送扩展字段:em_push_title、em_push_content的显示逻辑。
如果title和content都有,就显示title的,没有title就取content的值,两个是有优先级的。
如果想要标题和内容都有的样式,可以只用em_push_content,然后将内容进行换行
28、群消息可以单独指定给某人吗?
我们没有这个功能,您可以自己实现。
消息带上扩展,可以是指定人的环信id,群成员们收到消息(messagesDidReceive)后判断扩展内容是不是自己的环信id,是的话就展示,不是就不展示。
29、如果同时设置了发送前和发送后回调,会先执行发送前,再执行发送后。
30、回调会保证顺序发送吗?
回调不保证发送顺序 消息里面都是带时间的。
31、自定义的聊天cell,在哪里设置cell 的高度?
自定义cell的高度是自动计算的,自适应的,正常不用单独设置。
如果有问题,看下自定义的cell的布局是不是不对。
32、从服务器端获取会话列表功能相关规则:
(1)、时效是7天(社区、企业等版本都是统一的)。
如果购买了消息漫游,会话列表保存时长延长至购买的漫游时长。
也可以单独延长保存时长,收费相关需要和商务沟通。
(2)、只获取到会话的最新一条消息,要获取这个会话的其他历史消息可以再调用漫游
(3)、调用后会自动同步到本地数据库(app端)
(4)、默认可以获取10个会话,最大可以上调到100个。需要联系商务调整
(5)、cmd消息不计入会话列表
(6)、开通后需要发送新的消息测试,开通前的数据获取不到
33、群组全员禁言、将某成员解禁,此成员还是无法发消息
这个现象是正常的。
34、图片消息的大图、缩略图的服务器端路径为什么是一样的?
这是正常的,对于服务器端来说,下载缩略图就是多个参数,sdk下载时会有区分。
35、发消息超时重试机制
(1)、断网的情况下发消息,30秒后直接返回error消息
(2)、弱网的情况下,发送附件类型消息需要先进行上传,调用 rest接口,60秒 + 60秒重试,2min后返回error消息
(3)、弱网的情况下,发送非附件类型消息直接走mysnc,1min后返回error消息
36. 大小写敏感的问题
Q:获取不到会话~
A: 大小写敏感
message里面 conversation:WePlay_eTl36Lbp***LQRbX6CzL-
conversation数据库里面conversation: weplay_etl36lbp***lqrbx6czl-
37. Q: 请问一下,SDK发送文件、图片、视频的时候,默认是存储在你们的服务器上的吗?存储地址是否可以自定义?
A: 是可以的
1. 关闭环信的自动下载或者上传附件isAutoTransferMessageAttachments
2. 发送正常消息的时候,在ext里面加上传到自己服务器的资源地址、和文件类型
38. sdk 报300
是客户端连不上msync服务,这个分两种情况 1.客户端自身网络问题,比如设置了代理服务、网络异常 2.环信服务异常 客户端连接的msync服务异常 提示300
39. 发送方网络不好时发了一条消息,接收方收到两条。
原因:就是网络不好,消息发出去后,sdk没有收到服务器端的ack,sdk认为消息没有发送成功,然后又发了一条。
Q:如果客户的场景就是短时间内重复发相同内容的消息,那配置了这个去重,是不是就会把重复的消息也过滤掉?
A:不会。正常情况下,发相同的消息,每条消息的metaid不同,异常情况下metaid是相同的。meta id就是sdk本地临时生成的消息id,就是网络不好,消息发出去后,sdk没有收到服务器端的ack,sdk认为消息没有发送成功,然后又发了一条
就是这种情况,涉及到sdk重发消息,所以两条消息的metaid是相同的
此情况可以配置“服务端消息去重 unique_client_msgid”,或者联系运维配置。
40. EaseCallKit 问题
Q: 声网的音视频发送消息类型全部是EMMessageTypeCmd 吗?
A: 音视频通话过程中的第一条呼叫邀请是文本消息,其他都是cmd消息
41. EaseCallKit 问题
EMMessageTypePictMixText是用来标记图片类型的,在现在的项目里面是没有用到的
42. 场景:
Q: 现在有个这样的场景,客户端申请创建群服务审核后由服务端创建了一个群,还有就是客户端也可以申请加入群,加入成功和创建成功后都会收到这个回调,我有办法区分出来是服务端创建的群还是我自己主动加入的群么?
A: 服务端在创建群组的时候,有一个custom字段,您可以做业务相关的标记~ custom字段对应客户端的字段是:EMGroup -> ext字段
43. iOS应用的强杀,在聊天室里的人需要立马能感受到他的离线。或者离开。推荐怎么做好
A: 正常情况是离线2min,服务器会将此成员踢出聊天室,2min的时间在我们这儿是可以设置的
44、 加个 em_push_name 有没有用?
A: iOS 目前不支持em_push_name,解决方案是通过\n,来模拟类似标题的效果
45.、用户如果杀进程,你们日志里面会添加记录吗
A: 杀死就是直接log突然没记录了
46、我们的SDK,自动登录,是有token校验的机制的?
我在A设备登录完,又在B设备登录了
这个时候,我又从A设备自登录了,A这边能感知到token变化?(或者说已经在别的设备登录过了)
A: 这个需求研发已经在排期做,完成后的预期时A离线再上线时也可以感知到有其他设备登陆过
47、群组的代理在EaseIMKitManager里面可以走,在help类里面是不走的,需要进一步核实~
48、为啥不用UUID用作环信ID?
A:环信最初设计是来源注册规则,其中username是现在客户注册的环信ID,环信系统收到这个username后会自动生成一个内部的UUID,所以不允许用户使用UUID作为环信ID,避免冲突。username是64位的,UUID是36位的,客户可以在UUID的前边加个前缀作为username。
49、 the resource could not be loaded because the App Transport Security policy requires the use of a secure connection.
A: 在app的info.plist 文件中,设置Allow Arbitrary Loads = yes
或者是在EMOptions 调用usingHttpsOnly = YES 仅支持https
flutter问题
50、语音播放
使用RecordAmr,播放remotePath,安卓可以、iOS不可以
目前给的解决方案:把remotePath修改成localPath
51、添加回调规则添加失败。
A:检查下回调规则名称是不是用的汉字,回调规则只能是数字、字母,不能用汉字。
52、对方离线了之后,发送的消息,上线后如何获取?
A:对方离线,消息会进入离线队列,如果没有集成第三方厂商离线推送,用户上线后,服务器下发给客户端。
53、调用SDK 方法报错: Cannot read property 'lookup' of undefined?
A:因为未登陆成功就调用了SDK 的api,需要在onOpened 链接成功回调执行后再去调用SDK 的api。
54、聊天室如何获取历史消息?
A:两种方式:1、环信服务器端主动推,需要联系商务开通服务,默认10条,数量可以调整。2、通过消息漫游接口自己去拉取历史消息,各端都有提供拉取漫游消息接口。
55、拉取消息漫游,conversationId是怎么获取的?
A:单聊的话,conversationId 就是对方用户的环信id。
群聊或聊天室的话,conversationId 就是groupid 或者chatroomid。
56、如何实现只有好友才可以发消息?
A:可以使用环信的发送前回调服务,消息先回调给配置的回调服务器,然后去判断收发双方是否是好友关系,如果是好友关系,那么下发消息,如果是非好友关系,则不下发消息,客户端ui可以根据不下发返回的code做提示。
57、调rest接口报401是什么原因?
A:调环信rest接口,需要管理员权限的token,确认下请求是否有token,且是在有效期,token的有效期以请求时服务器返回的时间为准。
58、调修改群信息报错如下
System.Net.WebException:“远程服务器返回错误: (400) 错误的请求。
A:检查下请求体,看下参数格式是否正确,比如"membersonly",,"allowinvites" 这两个参数的值为布尔值。
59、注册用户username是纯数字可以吗。
调restapi是可以的,serversdk的话,为了让用户使用更规范的名字,命名规则更严格一些,要求首位是字母。
60、 SDK相关
第1个 SDK 3.8.4 会有长链接特殊情况下无故断开情况,升级至3.8.5即可
第2个 SDK3.8.5.1 会有重复收到推送的情况,升级到3.8.5.2即可
第3个 SDK 3.8.2 以下启动闪退,报network问题,升级至 3.8.3.1即可
61、 3.8.0以上版本与3.8.0以下版本有什么区别?
目前官方demo最新版SDK版本号是3.8.6.2,SDK名称叫HyphenateChat
3.8.0以下(不包含3.8.0)名称为Hyphenate
如果您需要easeIMkit源码,建议您直接使用最新版.
Hyphenate和HyphenateChat的关系:
1.Hyphenate和HyphenateChat都是环信SDK,只需要引用一份即可.
2.Hyphenate和HyphenateChat名字不同,版本也不同:
Hyphenate是3.7.4及以下的SDK命名
HyphenateChat是3.8.0及以上的SDK命名
3.升级前后最大的区别:
Hyphenate包含环信音视频功能
配套的EaseIMKit(3.7.4/3.7.3两个版本)内部也有音视频的UI界面
HyphenateChat已去除环信音视频,单有IM功能
需要集成声网SDK
配套EaseIMKit本身也没有音视频界面.
EaseIMKit介绍文档:http://docs-im.easemob.com/im/ios/other/easeimkit#easeimkit_使用指南
对应声网的音视频SDK,我们专门做了对应的UI界面:EaseCallKit.对EaseIMKit没有音视频界面的一个补充.
注意:
1 EaseCallKit就像EaseIMKit一样,也需要集成,而不被EaseIMKit包含.
2 集成EaseCallKit前,还需要集成声网SDK,您可以阅读开发文档来理解其中关系:http://docs-im.easemob.com/im/ios/other/easecallkit#简介
62、 如何集成easeIMkit源码?
建议客户升级到最新版本即可集成easeIMkit源码.
但需要注意:如果集成easeIMkit源码,虽然可以看到源码实现,但不能修改,如果需要修改调整,则需要使用本地集成的方式.
本地集成方式可借鉴官方demo集成方式(这里由于步骤比较繁琐,如果客户还是不会,会考虑远程操作)
63、本地集成easeIMkit,并修改调整,那么后续是不是无法再升级了?
是这样的,虽然后续无法升级,但未来您是需要做出自己的ui界面的,甚至未来可能会移除easeIMkit,所以请大胆修改调整吧.
我们更希望能够看到三个阶段:
第一阶段:您可以简单快捷地集成环信聊天,并实现聊天功能.同时可以在EaseIMKit.framework开放的接口或属性范围内,可做出适合项目需求的调整.
第二阶段:您在使用EaseIMKit.framework时遇到了限制,有诸多需要调整的部分在动态库内部,您无法去做调整.这时,您可以集成EaseIMKit源码来达到您的目的,集成EaseIMKit源码后,您可以修改源码内部的代码,以满足您项目需求.
第三阶段:在您项目发展到一定程度后,往往EaseIMKit无法再陪伴您继续向更高层次发展.在这时,您对于EaseIMKit源码的熟悉度也非常高了.其中有很多实现方式已经为您之前遇到的困惑做了更好的解答,再加上您早已按耐不住的灵感,重建出属于您项目专属的界面吧!如此更加契合您的产品需求,也更加容易维护.
64、 rest相关
环信服务器的聊天记录能清除吗 删除了用户。重新注册的用户id对上了 又把聊天记录拉下来了
你删了环信id,聊天记录是不会删除的,这么设计的逻辑是因为每个客户的业务场景不同,如果客户误删了环信id,需要重新注册回来,并且需要看到历史聊天记录。如果你这边的业务,是不希望这种场景,你可以去定义注册环信IM的id规则,你用户注册你自己应用的username时,按你定义的规则去注册IM的id,也就是说你这边的username和环信的id不是同一个,环信这边是根据环信id保存历史记录的
65、关于rest接口注册用户,批量注册
单次批量注册上限为100,不受接口限流频率影响.
66、解决方案
消息部分
1.当前场景:SDK本身已经创建数据库,并有简单的增删改查,但由于SDK本身对于数据库的操作较为简单,所以舍弃当前SDK内数据库,创建新的数据库.
举例:当前会搜索到携带关键字的所有类型的消息.期望只搜索我想搜索的消息类型
思路:期望从根源上解决此类问题,让客户可以根据自己的业务场景来实现各类增删改查,突破SDK接口功能比较通用,却又无法主动实现复杂业务逻辑的痛点.
67、当前场景:SDK文件存储限制.
思路:对接第三方文件存储。当前已可以提供上传下载思路与demo,需要的话官方支持群里@杨剑
68、在聊天过程中,返回界面,未读消息数不归0问题
一般未读消息数无法归零,最有可能的一个原因是easeIMkitmanager没有初始化,从而导致代理为nil,也就没有进行下一步的逻辑.可先检查下easeIMkitmanager是否进行初始化了.
如果您这边没用到easeIMkit,可使用下面截图部分api进行操作:
69、使用xcframework动态库时,如何去除动态库内的x86架构?
xcframework不需要去除x86架构,直接打包即可.
70、 3.8.4版本的gif大表情无法正常显示
请升级版本至3.8.6以上
71、 环信im针对appkey迁移用户数据
我们无法操作客户数据,否则会破坏完整性,建议您自己操作
72、在进入聊天界面时,会有一个滚动的动态效果,我不想要这个效果.
您好,您这边将如下图所示红色箭头指向的bool值改成false即可
73、服务端获取新的token之后旧的token是否失效?
不会失效,token失效以服务器返回时间为准。
74、客户APP集成环信后打包上架过程中审核报错:调用了苹果私有Api.
1.尝试再次提交审核;2.发邮件申诉并贴出EMMessage代码。
75、iOS端SDK没有找回密码的API,这个功能如何实现?
需要后台调用Rest Api重置用户密码的接口即可。
76、每次重启App,deviceToken会不会改变?
不会改变,一般是卸载app重装,升级手机系统,deviceToken才会改变。
77、如何获取昵称?
环信是不涉及用户个人信息的,所以通过环信ID是获取不到用户昵称头像的,用户的个人信息可以在自己服务器与环信ID绑定存储维护,知道环信ID就可以到自己服务器下载这个环信ID对应的用户信息。
78、线上的离线推送不成功,开发环境没问题,如何排查?
换一个新的账号
79、用户未读消息数,在服务端怎么获取?
目前服务端不支持获取未读消息数,可在客户端获取。
80、群组功能,邀请用户进入群组,被邀人能直接进入群组吗?还是需要被邀请人同意才能进入群组?
客户端用户接收群邀请可以自动进入群组,也可以被邀请人同意后进入群组。
81、如何同时集成IM和客服云SDK?
开通IM和客服之后,只集成客服即可(客服内部有IM模块,可直接使用此模块)
82、环信IM账号客户端退出登录为什么还能够收到推送消息?
在登出的方法里将BOOL值设置为YES
83、更换AppKey后服务端发送推送消息移动端收到的消息通知不显示消息内容?
更换AppKey,下属账号默认不显示消息内容,客户端的默认设置不显示消息内容,需要将displayStyle打开即可。
84、将用户拉入黑名单还能聊天?
A把B拉黑,A能B发消息,但是B不能给A发消息。