好久没有单独弄推送这块啦,连申请证书都很不熟悉啦,最近确实也变化了一些,特别是 iOS 10 以后,特此记录下。
- 推送证书中新增选项的区别
- 推送时entitlements文件 的增加
- 下载的证书没有密钥
- P 12 转 PEM
- 推送开关何时打开
- 证书没匹配的的bug
1、Apple Push Notification Authentication Key (Sandbox & Production) 与 Apple Push Notification service SSL (Sandbox & Production) 选项的区别
在生产环境下,push 推送出现下面两个选项,
记得以前都是直接选下一个选项的,当然现在推送时也是一样的选下面那个。而对于这个新的选项( Authentication Key)又是什么意思呢?
使用它后,可以为我们提供一个 key 给后台,避免我们的推送证书过期的问题 ,它是说这样设置后永远不会过期,除非我们删掉它,但是目前还没用过!
2、注意推送需要增加一个entitlements文件
**appName.entitlements **
在targets->Capabilities->Push Notifications中打开推送,然后系统会自动帮你写入.entitlements文件,所以不需要自己去手动加。需要注意的是,有人遇到过.entitlements文件没有被加入工程的,这也会产生问题,需要手动把.entitlements加入工程。
<key>aps-environment</key>
<string>development</string>
// <string>production</string>
3、下载的证书没有密钥
遇到这种情况,通常有两种方式:
- 自己重新申请一次证书,不管这个证书了
- 找到申请证书的Mac 会有秘钥,然后就会有了
然而我却是用了我另一个同事的账号和电脑就行了,暂时还不清楚是什么原因,因为之前申请证书的账号和Mac 我并不清楚,但是我发现在那有密钥,此处还有点疑问...
4、 P 12 转 PEM
下载好证书后(分为开发版和正式版)(develop.cer & production.cer), 然后导出 p12。
我记得我之前只要将 cer.p12 给我们后台就好了。
现在却要传两个,需要通过 钥匙链分别导出 cer.p12 和 keyCer.p12
- cer.p12 == > cer.pem
openssl pkcs12 -clcerts -nokeys -out cer.pem -in cer.p12
- keyCer.p12 ==> keyCer.pem
openssl pkcs12 -nocerts -out keyCer.pem -in keyCer.p12
- 合并 cer.pem 和 keyCer.pem == > needCer.pem
cat cer.pem keyCer.pem > needCer.pem
然后将 needCer.pem 发给后台,并告诉密码就好了
详细可以看 导出 p12 或 pem 文件,但不要输入错误,像我不小心输入错了,关键是还没提示,最后终于坑了一把我们后台。
5、推送开关何时打开
一般来说,我们设置是推送是重新发版本的时候才打开的,或者说打开推送开关后。
而我这次遇到的这个问题是:测试在不断切换版本时,发现推送不了。实际原因就是推送的开关的,也就是那个我们系统的弹出框 “问你是否允许打开推送的那个开关”,才是真正启动推送接口的问题。
typedef NS_OPTIONS(NSUInteger, UIUserNotificationType) {
UIUserNotificationTypeNone = 0, // the application may not present any UI upon a notification being received
UIUserNotificationTypeBadge = 1 << 0, // the application may badge its icon upon a notification being received
UIUserNotificationTypeSound = 1 << 1, // the application may play a sound upon a notification being received
UIUserNotificationTypeAlert = 1 << 2, // the application may display an alert upon a notification being received
}
[[UIApplication sharedApplication] currentUserNotificationSettings].types
当然直接保存一个本地 deviceToken , 然后判断 deviceToken 是否存在也可以作为打开推送开关的问题解决,毕竟服务器只要这个 deviveToken 的。
另外以下几种情景最好更新下信息上传给给服务器:
- 第一次启动时
- 更换 用户 ID 时
- 第一次启动不允许通知,后面重新打开通知开关时
- 更新版本时
这是我们推送,在设置定制化时需要做的。
6、一个打包时遇到
No suitable application records were found. Verify your bundle identifier 'xx' is correct
原因是: 自己的账号和公司的账号混淆了,需要转换下!
备注参考:
https://eladnava.com/send-push-notifications-to-ios-devices-using-xcode-8-and-swift-3/
http://www.saitjr.com/ios/ios-export-remote-notification-p12-pem-file.html