近一次弄推送遇到的问题

好久没有单独弄推送这块啦,连申请证书都很不熟悉啦,最近确实也变化了一些,特别是 iOS 10 以后,特此记录下。

  • 推送证书中新增选项的区别
  • 推送时entitlements文件 的增加
  • 下载的证书没有密钥
  • P 12 转 PEM
  • 推送开关何时打开
  • 证书没匹配的的bug
1、Apple Push Notification Authentication Key (Sandbox & Production)Apple Push Notification service SSL (Sandbox & Production) 选项的区别

在生产环境下,push 推送出现下面两个选项,

近一次弄推送遇到的问题_第1张图片
Apple Push Notification Production

记得以前都是直接选下一个选项的,当然现在推送时也是一样的选下面那个。而对于这个新的选项( Authentication Key)又是什么意思呢?

近一次弄推送遇到的问题_第2张图片
生成的key

使用它后,可以为我们提供一个 key 给后台,避免我们的推送证书过期的问题 ,它是说这样设置后永远不会过期,除非我们删掉它,但是目前还没用过!

2、注意推送需要增加一个entitlements文件
近一次弄推送遇到的问题_第3张图片
注意这两步骤,特别是第二步

**appName.entitlements **
在targets->Capabilities->Push Notifications中打开推送,然后系统会自动帮你写入.entitlements文件,所以不需要自己去手动加。需要注意的是,有人遇到过.entitlements文件没有被加入工程的,这也会产生问题,需要手动把.entitlements加入工程。

aps-environment
development
// production
开发环境下
正式环境下
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

你可能感兴趣的:(近一次弄推送遇到的问题)