错题集
更新时间: 2024/03/14 17:08:35
本文汇总了云信 IM 即时通讯的开发者在各个场景实践过程中的易错问题以及对应的解题思路,帮助您避开别人踩过的坑,为您的开发提效加速。
调用 sendMessage 发送消息时,为什么会发送失败,出现报错?
问题描述
用户再次调用 sendMessage
发送已经发送过的图片和文件类消息时,发送失败,报“参数错误”。
问题原因
文件类消息创建时可以选择相册路径和 data 两种创建形式,创建时会赋值给文件 NIMMessageObject
的私有属性sourceImage
,sourceFilepath
和sourceData
。发送完消息后,这些私有属性会置空。如果再次调用sendmessage
方法的话,会因为找不到这些参数导致报“参数错误”。
解决方案
- 如果是转发的场景可以调用转发接口
forwardMessage
,或者先调用makeForwardMessageFromMessage
构造转发的message
,再调用sendMessage
发送。 - 如果是自己想多次发送同一个内容的消息,就按创建消息的流程,创建一个
message
对象发送,避免发送完不重新创建就再次sendMessage
同一个message
对象。
调用 forwardMessage 发送消息时,为什么会发送失败,出现报错?
问题描述
用户直接调用forwardMessage
发送新创建的消息时,发送失败,报“参数错误”。
问题原因
调用forwardMessage
发送消息,sdk 会解析messageObject
的encodeContent
属性,获取到messageObject
的对象数据进行转发,如果是新创建的消息,调用转发方法发送会因为找不到messageObject
的encodeContent
导致报“参数错误”。
解决方案
新创建的消息可以直接使用sendMessage
发送,避免调用转发接口forwardMessage
发送。
在消息发送的过程中退出聊天界面后再次进入,提示消息发送失败?
问题描述
发送消息过程中,退出聊天界面后再次进入,提示消息发送失败。消息的状态 deliveryState
为 NIMMessageDeliveryStateFailed
。(实际已发送成功。)
问题原因
消息投递状态deliveryState
(只读属性),是 SDK 来赋值管理的,用户无法对其进行赋值。消息的初始默认状态是 NIMMessageDeliveryStateFailed
(发送失败)。消息发送完成之前,SDK 不会改变消息的状态。消息发送完成之后,需要刷新页面重新从数据库获取消息,消息状态才会更新;如果未刷新页面,没有重新从数据库获取消息,会出现消息已发送成功,但是显示消息发送失败的情况。
解决方案
在消息发送过程中(还未发送完成),退出聊天界面后再次进入时,需要通过消息发送完成的回调(sendMessage:didCompleteWithError:
)重新从本地数据库获取消息记录。或者通过消息发送的生命周期(将要发送,发送过程,发送完成等回调,具体请参见NIMChatManagerDelegate
),开发者在消息的扩展字段中,自行定义消息的发送状态,再通过 UI 进行显示。
在子线程中查询用户信息和群信息时,为什么会崩溃导致无法获取信息?
问题描述
在子线程中调用NIMUserManage#userInfo:
和 NIMTeamManager#teamById:
方法获取用户信息或群信息时,会出现崩溃(偶现)和信息读取异常(获取不到用户信息或者群信息)的情况。
问题原因
SDK 的 document 读写操作目前只支持在主线程中调用,在子线程中调用可能会存在线程问题。
解决方案
用户信息和群信息的读写数据量比较小,获取用户信息或者群信息的耗时几乎可以忽略,所以建议用户在主线程调用相关接口,直接获取信息。
发送语音消息为什么会失败?
问题描述
发送语音消息时,报 414 参数错误,上传文件返回IO读写错误。
问题原因
发送的语音录制时间过短,根据录制文件计算的文件大小还是 0。因此会导致文件快传报错 414,普通上传 SDK 判断IO读写错误。
解决方案
用户在业务层设置判断逻辑,判断音频录制时间是否过短,若过短(如 1s),则不发送消息。
为什么客户端消息发送方无法获取第三方回调的扩展字段?
问题描述
用户在服务端对 IM 消息,进行了拦截,并设置了三方回调的扩展字段,但是客户端的消息发送方获取不到该扩展字段。
问题原因
只有服务端responseCode
返回 200 时,客户端才能读取callbackExt
的内容。
解决方案
- 将服务端的
responseCode
设置为 200,其他信息以 json 的形式放在callbackExt
中。 - 客户端需要在消息状态变化回调中获取
callbackExt
字段的内容。
为什么消息对象的反垃圾结果在命中后为空?
问题描述
命中反垃圾后,在消息状态变更的监听中获取到的message
对象的反垃圾结果为null
。
问题原因
V5 以上版本的安全通才会有反垃圾这个字段。
解决方案
- 联系商务确认当前使用的安全通版本是否为 V5 以上版本,如果不是,让商务在后台进行修改。
- 客户端从 8.7.0 版本开始支持反垃圾结果查询。
- Android:
IMMessage#getYidunAntiSpamRes
,获取时机的回调为observeMsgStatus
。 - iOS:
NIMMessage#yidunAntiSpamRes
,获取时机的回调为sendMessage:didCompleteWithError
。
- Android: