项目需求:在用户收到推送的时候能和QQ或者是微信一样能够持续的震动和响铃,至于如何实现这篇文章已经将的很详细了https://oopsr.github.io/2016/06/20/voip/,所以关于实现这一块就不再赘述了,主要是说一下这一块遇到的问题。
问题一:就是VoIP的推送在测试环境下能够收到推送,一切正常,但是在正式环境下就是收不到推送,证书配置代码都一样,但就是收不到。关于这一块的问题建议从以下几个方面去排查一下:
1、 移动端有没有注册推送,注册完成后会有一个回调方法,
- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type
在回调方法里能够获取到pushToken,这个token是要上传后台服务器的,后台如果采用的是socket连接的话,会直接那这个token给对应的设备去推。
后台使用的接口
开发接口:gateway.sandbox.push.apple.com:2195
发布接口:gateway.push.apple.com:2195
官网提供的是:
开发接口: api.development.push.apple.com:443
发布接口: api.push.apple.com:443
这两个接口都能使用一个是Socket连接的方式,一个是采用Http的方式
推荐一个验证推送的小工具:https://github.com/KnuffApp/Knuff (十分好用)
(验证是否已经获取到了:在本地存储一个文件,将获取到的token放在里面,然后打ADHoc的包,然后连接Xcode 在沙盒中查看token的值。注:发布环境和开发环境的token是不一样的)
2、移动端获取deviceToken的方式是否正确,后台有没有获取到。这一块的原因主要在于token的上传时机,是在客户端登录的时候上传token还是在客户端ping的时候上传token这一块要区分一下,最好和后台一起联调看一下数据的上传情况。
3、检查VoIP证书是否有效,这个有效包括证书的过期时间,证书与包名是否匹配【这一点上很关键,也是很重要的,因为后台不会帮你区分包,只会根据你上传的PushToken推送到你的设备,很有可能后台这边的日志记录已经推送成功了可是客户端就是收不到,客户端能怎么办?很绝望啊!!!!】
4、App是否开启了通知权限,这个也是一条容易忽略的一点吧,一开始要在AppDelegate里面注册一下就可以了。然后在设置里查看一下当前的是否开启,如果因为这个原因收不到推送真是很尴尬。。。。。
5、App在接收VoIP推送的那个回执处
- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type
做一些能够确定是否收到推送的逻辑,比如本地推送,写入Document沙盒文件(iOS11可见)等,然后查看沙盒中对应的文件是否有数据
6、如果之前后台是VPNS都没有问题,讲道理只需要切换下VoIP证书就行。
最终我的正式环境收到了推送,感谢简书的:CoderXLL帮忙分析。
相关VoIP的链接:做时可参考:
APNS ====VoIP相关 https://www.jianshu.com/p/edbfd8d515de https://www.jianshu.com/p/22ffe3816090 https://stackoverrun.com/cn/q/11836206/%E8%BF%81%E7%A7%BB%E5%88%B0ios-voip%E6%8E%A8%E9%80%81%E9%80%9A%E7%9F%A5 https://www.jianshu.com/p/22ffe3816090 https://www.jianshu.com/p/9afff11dd6af https://www.jianshu.com/p/f3e0e2f0b8e8 https://github.com/oopsr/VoIPPush/issues/4 通知横幅 https://www.jianshu.com/p/9afff11dd6af // 论坛相关 https://forums.developer.apple.com/message/221601#221601 https://forums.developer.apple.com/message/93885#93885 // 遇到的问题 https://forums.developer.apple.com/message/234613#234613 // voip 开发文档 https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/OptimizeVoIP.html 400BadDeviceToken指定的设备令牌是坏的。验证请求是否包含有效令牌并且令牌与环境匹配. // 验证推送的软件 Knuff https://github.com/KnuffApp/Knuff