项目使用的推送功能是阿里云平台的推送,后端在进行推送时一般都是使用 Device 进行推送,这需要 App 端提供用户登录设备对应的 Devid。最近在测试发现使用 IOS 设备登录 App 会出现 Devid 为空的情况,导致推送失败,下面是对问题的调查处理过程。
问题原因
问题的原因是后台缓存中 DevId 为空,所以通知不会推送。
测试分析
IOS 卸载重装 App 后,登录 A 的账号。App 端会与聊天服务建立连接,这时会传一些设备信息过来,后台会将这些信息存储到缓存中,其中包括设备ID - DevId。
A 登录后服务端收到的设备信息如下:

其中 DevId 为空,这时如果推送一条通知给A,通知将不会发送。

作为对比,找了一台 Android 设备,也进行卸载重装的操作,登录后对应的设备信息如下:

所以
Android设备不会出现这个问题,只有IOS端有。
回到对 A 的测试上来,将 App 杀死重进后(退出登录后重新登录也可以),通知就恢复正常了,因为后台拿到了 DevId,如下:

猜测和验证
A 登录的 IOS 端安装的是 release 版,两台测试的 Android 机安装的都是 debug 版,猜测是否与安装的版本有关,进行了如下测试:
IOS端安装DEBUG版,发现DevId能够正常拿到。Android端安装Release版,DevId能够正常拿到
所以可以判断出,只有安装了
Release版的Ios设备会出现拿不到DevID的情况。
解决办法
阿里云推送官方文档中给出了上面问题产生的原因:iOS端获取deviceToken的问题

与 App 端讨论后得出两个解决办法:
- 如果
DeviceId没有获取成功,那么就继续轮询获取,直到获取成功。 - 目前会在打开
App时获取一次DeviceId,现在调整为在登录时再获取一次DeviceId。
最终
App使用第二种方法解决了问题。