前几天集成推送的时候碰到一个坑。
先说一下推送的大致流程:1 客户端注册苹果的推送通知服务,回调拿到deviceToken,保存在客户端。
2 以后客户端每次登陆的时候在传给自己的服务器,服务器做一次保存,保存在数据库。
3 服务器用在数据库的deviceToken给客户端推送消息。
关于啥是deviceToken :就是苹果服务器根据我们这一台设备的UDID和app的bundleID混编而成的。因为每次下载的app的时候deviceToken会变化(这个是ios9之后才会这样的,不过对于客户端不影响,只要每次登陆的时候及时更新服务器保存的deviceToken就行了),所以还和客户端下载app的时间有关系~~
所以deviceToken其实是和我们的手机和app绑定的。不是我们用户。只是我们在登录的时候传给了服务器,相当于做了一次绑定,所以我们才能精确的给某个用户推送消息。
所以,坑就产生了。(QAQ)
假如有用户A和B,先后在同一部手机上登录了。先是A登录的,再是B登录的。这样服务器会记录A和B的deviceToken是一样的。然后服务器想给A推消息的时候推送给了B。
解决办法也很简单:B是后登陆的,后登陆的时候必须要把之前与A绑定的deviceToken和A解除或者是直接删除掉就行了。如果A在别的设备上登录了会重新绑定,如果没有登录那自然是收不到推送的。
总而言之,手机的deviceToken和用户之间不只是绑定,还要有解除绑定的过程。
---over---
碰到的第二个坑。顺便总结一下。
场景大概是这样的。
最开始的时候我自己集成完推送后在第三方的平台测试,推送成功;
后台从服务器给客户端推也可以推成功;
但是,boss从App Store下载后,在后台给自己推送消息,竟然失败了!!!
猜想 1 :估计是注册推送的时候失败,这也是有概率发生的,比如注册推送的时候刚好网不太好,没拿到deviceToken,就会推送失败。
解决:boss你重新下一个吧,应该就没问题了。
结果:还是收不到推送!(一脸懵逼??)
猜想 2 :我测试一直是在测试环境下测试的,但是boss在App Store下载的是生产环境的包,难道是我把环境搞错了,证书搞错了??或者证书过期了???
解决 :查看开发中心的证书,没有过期!!那就可能是证书导入到项目的时候倒错了??吓得我赶紧吧证书从开发者中心下载下来,然后重新发了个包。
结果 :还是收不到推送!!(内心要崩溃了)
猜想 3 :客户端是在是找不到问题了,那问题就只能在服务端了吧!!找后台的哥们找下问题,结果这笔非说不是他的问题;那好宝宝自己找!
解决 :查看了第三方后台的集成文档。终于发现了点问题;后台组织json的时候需要传一个有关推送环境的字段,生产环境要设置为YES,测试环境要设置为NO,我让 他查下代码,看看他设置的什么鬼,结果这笔真的设置的是NO。那我收不到推送就不奇怪了。赶紧让他改为YES(我一直在旁边看着,就怕这笔没改)。
结果:特么的还是收不到!!!(oh~shit~)
猜想 4 :回顾整个过程,觉得问题还是在服务端,不行,我的让后台的这笔把他组织的json给我打印出来,我必须看看他到底组织的什么鬼给我。结果一下我真的是惊呆 了,这笔刚刚组织给我的那个字段特么的还是设置的NO。尼玛,你自己赶紧找吧,我要的是YES!!!
解决 : 找了半天,后台发现自己还有一个地方没改。然后默默的改了,然后我赶紧的测试了下。
结果 : 呵呵,推送收到了!(果然,这笔就是个坑!!)
总结:一定要测试,以实际看到的数据为准,代码会有逻辑没看清的时候,但数据不会骗人!!