项目使用的推送功能是阿里云平台的推送,后端在进行推送时一般都是使用 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
使用第二种方法解决了问题。