版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.05.15 |
前言
前一篇已經對ios的SDK進行了研究,這一篇則對iOS SDK 常見問題進行說明。
1. 極光推送集成(一)
2. 極光推送集成(二)
3. 極光推送集成(三)
4. 極光推送集成(四)
5. 極光推送集成(五)
6. 極光推送集成(六)
下面說一下iOS SDK 的常見問題。
iOS SDK 常見問題
一、iOS 9集成
1.iOS 9變動影響SDK部分:
- 增加了bitCode編碼格式,當SDK不支持bitCode時,用戶集成時無法開啟bitCode選項.
- 現象:用戶集成SDK后無法編譯通過,錯誤日志里包含了bitCode的相關錯誤信息
- 默認使用https連接,如果請求為http,需要手動配置plist來支持http服務,當前我們的服務器請求都走http服務。
- 現象:用戶集成SDK后,所有JPush相關的http服務都提示連接錯誤或者連接超時,可能是此問題。
2.bitCode解決方式
- JPush iOS SDK v1.8.7 及以上版本的SDK,已經增加對 iOS 9 新特性 bitCode 的支持.JMessage iOS SDK v2.0.0 及以上版本支持bitCode。
3.Https解決方式
SDK未提供https地址版本時
- 需要用戶主動在當前項目的Info.plist中添加NSAppTransportSecurity類型Dictionary。
- 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads類型Boolean,值設為YES。
二、iOS 如何推送自定義聲音
客戶端需要將聲音文件導入工程里,選中工程Target -> Build Phrases -> Copy Bundle Resources。
服務端推送時,需要指定iOS 平臺下的sound參數,具體傳入的值是聲音文件名+后綴。
三、為什么iOS收不到推送消息?
如果你確認 appKey 在 SDK 客戶端與 Portal 上設置是一致,其他環節也按照文檔正確地操作。但還是收不到推送消息。那么,有一定的可能性,是你在 Portal 上上傳的證書,不是 APNs (Push) 證書。推送時指定的iOS推送環境和應用證書是同一個環境。請參考iOS 證書設置指南再次檢查證書選擇是否正確。
請注意:iOS能接受消息的必要條件是:應用程序的證書要和你上傳到jpush portal上的證書對應,如果你的程序是直接在xcode上運行的,你的應用部署環境必須是開發狀態才能收到APNS消息。
溫馨提示:目前api推送的時候可以通過參數apns_production可以指定推送環境,false為開發環境,true為生產環境。V3 api不帶此參數則默認為生產環境,V3 api封裝的sdk 默認為開發環境。如果api有傳apns_production則以此值為準,否則以應用詳情的部署環境為準。
四、為什么啟動的時候出現 Did Fail To Register For Remote Notifications With Error的錯誤
程序運行的時候出現下面的錯誤信息:
did Fail To Register For Remote Notifications With Error: Error Domain=NSCocoaErrorDomain Code=3000 "未找到應用程序的“aps-environment”的權利字符串" UserInfo=0x1c55e000 {NSLocalizedDescription=未找到應用程序的“aps-environment”的權利字符串}
這個是由于你的Provisioning Profile文件,不具備APNS功能導致的。請登陸Apple Developer 網站設置好證書,更新Provisioning Profile,重新導入Xcode。或參考博客
五、如何在接收到 APN 的時候獲取 APN 消息內容并進行跳轉或做出響應處理?
六、如何關閉 APN 推送?
可通過調用代碼
// iOS 8 以上可用此方法
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]] ;
進入您的應用的設置頁面,點擊“通知設置”,用戶手可以動變更“允許通知”的狀態。
七、App badge number(角標)如何更改與清空?
JPush 網站上推送 iOS 通知時,可在[可選設置]里面指定 badge 參數的值,如:1或"+1"。
api上指定badge的參數請看:Push API
客戶端上報badge到JPush服務器的接口請看:設置badge
關于badge +1的介紹,請看APNs Notification badge
八、Icon Badge number 的清空方法:
- APN 推送內容指定 badge number 為 0;
- 在代碼中使用如下代碼清空 badge number: [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
注意:
badge累加只能通過v3 api推送,且只有1.7.4版本以上才能支持。
九、為何推送一條 APN 后,點擊通知中心的 APN 通知打開 App,可是 APN 通知在通知中心依然存在而未被刪除?
如果推送 APN 時,Badge number 被指定為0 ,則可能出現 APN 消息在通知中心被點擊后,盡管調用了 [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; 但 APN 消息在通知中心不會被刪除的情況。 這種情況可以按如下代碼調用以清除通知中心的 APN 通知。
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
如果仍有其他消息,則考慮清除 local notification 通知。
( [[UIApplication sharedApplication] cancelAllLocalNotifications] )
十、出現Not get deviceToken yet. Maybe: your certificate not configured APNs?...錯誤日志時如何排除問題?
如果出現上述日志,則說明一段時間內都無法獲取device token,那么:
- 確認你的app配置了apns權限,如果未配置apns權限,則應該會出現此錯誤提示。
- 確認你的app運行在ios真機而非模擬器上,且通知中心中對應app的通知權限沒有完全關閉(alert/sound/badge至少有一個權限是打開的)。
- 確認你的網絡狀況,與apple的服務器的連接是通過tcp的 5223端口連接,確認你網絡的對應端口是否可用,可通過下列命令來確認這點:
telnet 1-courier.push.apple.com 5223
在代碼中可在以下兩個函數中斷點以確認device token的獲取狀態。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;
如果app運行進入 didFailToRegisterForRemoteNotificationsWithError 則說明app的APNS權限問題或者app運行在模擬器,參考 證書設置文檔。
如果app運行進入didRegisterForRemoteNotificationsWithDeviceToken 則說明運行正常,請確認你在此函數中的代碼中有將token傳遞給jpush的調用:
[JPUSHService registerDeviceToken:deviceToken];
- 如果以上兩個registerRemoteNotification的函數都未進入, 請確認你的代碼中有注冊申請apns的函數調用:
[JPUSHService registerForRemoteNotificationTypes:];
- 如果上述情況都已確認且未進入第4步的任意回調函數,則可以判斷無法獲取token的原因在于設備與apple的網絡連通性問題(注:一個設備只有在未申請過token的情況下才會需要與apple的網絡交互來獲取token,已經獲取過某一環境token的設備在無網絡的情況下也能獲取到對應環境的token(環境分為 開發/生產)),這種情況下切換網絡能夠在大部分情況下解決此問題。
- 如果仍然有問題,請將上述步驟的結果以郵件附件的形式發送到JPush支持郵箱,我們將協助你解決此問題。
十一、上傳到appStore的版本為什么收不到推送?
- 請確認xcode選擇的生產證書和上傳的證書的bundleid一致;
- 如果是在jpush網站上推送,請確認新建通知時推送對象是否選擇了生產環境;
- 如果是v3 api推送,請確認是否使用了apns_production參數,值是否為:true;如果沒有使用apns_production參數請確認jpush網站上該應用的部署環境是否已經切換到生產環境。
十二、iOS 平臺上傳證書一直為未通過狀態
證書上傳未通過的原因一般有:
- 密碼錯誤;
- 上傳的apns證書環境不一致;
- 上傳到控制臺必須是apns證書,非apns證書會帶來錯誤,還有其他的原因可能是開發者證書也可能是apns證書那里導出來的私鑰。
具體請看上傳后顯示的錯誤輸出內容
十三、為什么日志里面會打印:You've implemented -[ <UIApplicationDelegate> application:didReceiveRemoteNotification:fetchCompletionHandler:], but you still need to add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist.
這個主要是提示開發者如果要支持UIBackgroundModes,需要開啟Remote notifications,具體操作可以看:iOS 7 Background Remote Notification
后記
??極光推送理論和常見問題就這些了,以后我會加一下我寫的工程上的代碼。有什么不對的地方,歡迎發郵件或者私信我,謝謝大家。