好久沒有單獨弄推送這塊啦瘫析,連申請證書都很不熟悉啦,最近確實也變化了一些濒憋,特別是 iOS 10 以后,特此記錄下陶夜。
- 推送證書中新增選項的區(qū)別
- 推送時entitlements文件 的增加
- 下載的證書沒有密鑰
- P 12 轉(zhuǎn) PEM
- 推送開關(guān)何時打開
- 證書沒匹配的的bug
1凛驮、Apple Push Notification Authentication Key (Sandbox & Production) 與 Apple Push Notification service SSL (Sandbox & Production) 選項的區(qū)別
在生產(chǎn)環(huán)境下,push 推送出現(xiàn)下面兩個選項条辟,
記得以前都是直接選下一個選項的黔夭,當然現(xiàn)在推送時也是一樣的選下面那個宏胯。而對于這個新的選項( Authentication Key)又是什么意思呢?
使用它后本姥,可以為我們提供一個 key 給后臺肩袍,避免我們的推送證書過期的問題 ,它是說這樣設(shè)置后永遠不會過期婚惫,除非我們刪掉它氛赐,但是目前還沒用過!
2先舷、注意推送需要增加一個entitlements文件
**appName.entitlements **
在targets->Capabilities->Push Notifications中打開推送,然后系統(tǒng)會自動幫你寫入.entitlements文件蒋川,所以不需要自己去手動加牲芋。需要注意的是,有人遇到過.entitlements文件沒有被加入工程的尔破,這也會產(chǎn)生問題街图,需要手動把.entitlements加入工程。
<key>aps-environment</key>
<string>development</string>
// <string>production</string>
3懒构、下載的證書沒有密鑰
遇到這種情況,通常有兩種方式:
- 自己重新申請一次證書胆剧,不管這個證書了
- 找到申請證書的Mac 會有秘鑰絮姆,然后就會有了
然而我卻是用了我另一個同事的賬號和電腦就行了,暫時還不清楚是什么原因秩霍,因為之前申請證書的賬號和Mac 我并不清楚篙悯,但是我發(fā)現(xiàn)在那有密鑰,此處還有點疑問...
4铃绒、 P 12 轉(zhuǎn) PEM
下載好證書后(分為開發(fā)版和正式版)(develop.cer & production.cer), 然后導(dǎo)出 p12鸽照。
我記得我之前只要將 cer.p12 給我們后臺就好了。
現(xiàn)在卻要傳兩個颠悬,需要通過 鑰匙鏈分別導(dǎo)出 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 發(fā)給后臺矮燎,并告訴密碼就好了
詳細可以看 導(dǎo)出 p12 或 pem 文件,但不要輸入錯誤赔癌,像我不小心輸入錯了诞外,關(guān)鍵是還沒提示,最后終于坑了一把我們后臺灾票。
5峡谊、推送開關(guān)何時打開
一般來說,我們設(shè)置是推送是重新發(fā)版本的時候才打開的,或者說打開推送開關(guān)后既们。
而我這次遇到的這個問題是:測試在不斷切換版本時濒析,發(fā)現(xiàn)推送不了。實際原因就是推送的開關(guān)的贤壁,也就是那個我們系統(tǒng)的彈出框 “問你是否允許打開推送的那個開關(guān)”悼枢,才是真正啟動推送接口的問題。
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 是否存在也可以作為打開推送開關(guān)的問題解決脾拆,畢竟服務(wù)器只要這個 deviveToken 的馒索。
另外以下幾種情景最好更新下信息上傳給給服務(wù)器:
- 第一次啟動時
- 更換 用戶 ID 時
- 第一次啟動不允許通知,后面重新打開通知開關(guān)時
- 更新版本時
這是我們推送名船,在設(shè)置定制化時需要做的绰上。
6、一個打包時遇到
No suitable application records were found. Verify your bundle identifier 'xx' is correct
原因是: 自己的賬號和公司的賬號混淆了渠驼,需要轉(zhuǎn)換下!
備注參考:
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