答宅女
回答来自于问答智囊团成员:linpeiyang@云通信
专栏:https://cloud.tencent.com/developer/article/1750251
客户提到文字信息没有失败,说明消息上行到云通信IM后台 -> 云通信IM后台处理 -> 云通信IM后台下发消息给用户APP
这条消息收发的通路是没有问题的。
而云通信IM对图片信息&语音信息的处理逻辑 与 文字信息的区别在于, 对前者会将信息以文件形式存储到腾讯云COS,得到一个COS的URL传给云通信IM后台,云通信后台经过处理,同样将URL下发给消息接收方的用户APP, APP通过URL去腾讯云COS下载文件,展示给用户。
显然是与COS有关了。
日志分析
拿到用户终端的SDK日志,很容易发现了问题原因:
📷
usersig参数丢失
图片语音消息上传COS之前,需要调用REST API获取COS Token,此处UserSig这个参数丢失了,导致报错。
关于REST API调用,可参阅:https://cloud.tencent.com/document/product/269/1519
关于UserSig登录鉴权, 可参阅:https://cloud.tencent.com/developer/article/1750246
为什么UserSig会丢失
继续分析终端日志发现,此客户在已经登录成功过的情况下,之后杀掉应用再重新打开应用,SDK初始化之后,此客户的登录逻辑是使用了SDK V1接口autoLogin自动登录:
📷
autologin自动登录
autoLogin接口说明:
自动登录类似“记住密码”的功能,如果上一次已经成功登录,那么一段时间内都只需要传入用户名就可以完成登录。 相比于普通的 login(TIMLoginParam) 接口,该接口可以减少 IM SDK 向您的服务器索要 UserSig 的频率, 既可以加快登录速度,又能减少你的 UserSig 服务器压力,也在一定程度上降低了 UserSig 泄漏的风险。首次登录之后,SDK 会把登录信息存在在本地(UserSig存在内存,登录凭证存在本地),下次登录即可调用自动登录
问题原因:
用户登录成功过一次之后,UserSig存在内存,登录凭证存在本地。当用户杀掉应用或切后台一段时间被自动杀掉应用,原本存储在用户终端内存里的UserSig丢失了,而当重新开启应用,此客户的逻辑是调用autoLogin接口,不去向开发者后台请求UserSig,因此终端SDK一直没有获取到UserSig,此时调用需要UserSig的REST API请求COS token就会报错参数丢失。而用户使用其他功能不受影响是因为登录凭证仍存在本地,其他功能都是用到登录凭证来做鉴权。
问题解决:
autoLogin接口早已经在新的SDK V2版本的API里禁用了,引导不要再使用V1版本的接口。