iOS 远程推送 接收消息失败原因
1. 如果推送的时候deviceToken对应的机器在APNS服务器上是离线状态,苹果会保存推送信息“一段时间”。当机器恢复在线状态时,推送信息到该机器。如果机器长时间不在线,苹果会抛弃掉这条消息。这个“一段时间”没有明文说多久,而且不知道苹果在不同情况下对这个时间有没有动态调整,所以无法推测这个时间对于信息丢失情况的影响。
2. 对于连续推送的情况,针对离线设备,苹果永远只存储最新的一条,上一条信息会被抛弃。
3. 有多条推送任务时,苹果推荐使用单个连接持续发送,而不是重复的开关连接,否则会被苹果认为D-O-S攻击给拒绝掉。如果有多台服务器,可以并发连接到APNS,分摊推送任务,可以更高效的执行任务。
4. 发送多条推送任务时,如果其中有一条推送使用了错误的deviceToken,那么连接就会被断掉,导致后面的推送任务停止执行。苹果通过一个“The Feedback Service”的服务来定期告知provider无效的deviceToken列表,如何使用这个服务参见苹果官方文档中的详细说明,下面有附连接。
原文:
开发状态服务器地址 gateway.sandbox.push.apple.com 2195
产品状态服务器地址 gateway.push.apple.com 2195
Development和Production两个版本对应的apns device token是不同的,前者是develop的mobileprovision下获取的。后者是production的mobileprovision获取的。
Development和Production两个版本可以共用一个App ID(不推荐。共用时每次调试前都要删除设备上的app,重新打包生成。而且共用appid会经常抓狂,早上行,下午就不行了。所以不推荐),但是不能共用一个mobileprovision,所以要单独生成Distribution的证书供production版本使用。
注:Distribution的版本是无法在设备上debug调试的!
Development和Production两个版本的code sign是不同的,前者是iPhone Developer,后者是iPhone Distribution。注意不能搞错。
无论是Development Push SSLCertificate还是Production Push SSL Certificate 都有过期时间的。Development Push SSL Certificate有效期大概四个月左右(后来好像改到一年了),而ProductionPush SSL Certificate的有效期是一年。需要注意在过期之前生成新的证书,以免影响使用。官网可以同时设置两个,第一个快过期的时候,生成第二个,然后替换服务器证书,等第二个使用一周没问题后删除第一个证书设置。
openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-cert.p12
openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem
cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem