版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.05.15 |
前言
前一篇已經(jīng)對ios的SDK進行了研究烹困,這一篇則對iOS SDK 常見問題進行說明。
1. 極光推送集成(一)
2. 極光推送集成(二)
3. 極光推送集成(三)
4. 極光推送集成(四)
5. 極光推送集成(五)
6. 極光推送集成(六)
下面說一下iOS SDK 的常見問題航厚。
iOS SDK 常見問題
一、iOS 9集成
1.iOS 9變動影響SDK部分:
- 增加了bitCode編碼格式,當SDK不支持bitCode時井誉,用戶集成時無法開啟bitCode選項.
- 現(xiàn)象:用戶集成SDK后無法編譯通過抡句,錯誤日志里包含了bitCode的相關(guān)錯誤信息
- 默認使用https連接,如果請求為http,需要手動配置plist來支持http服務(wù)滩租,當前我們的服務(wù)器請求都走http服務(wù)赋秀。
- 現(xiàn)象:用戶集成SDK后,所有JPush相關(guān)的http服務(wù)都提示連接錯誤或者連接超時,可能是此問題律想。
2.bitCode解決方式
- JPush iOS SDK v1.8.7 及以上版本的SDK,已經(jīng)增加對 iOS 9 新特性 bitCode 的支持.JMessage iOS SDK v2.0.0 及以上版本支持bitCode猎莲。
3.Https解決方式
SDK未提供https地址版本時
- 需要用戶主動在當前項目的Info.plist中添加NSAppTransportSecurity類型Dictionary。
- 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads類型Boolean,值設(shè)為YES技即。
二著洼、iOS 如何推送自定義聲音
客戶端需要將聲音文件導(dǎo)入工程里,選中工程Target -> Build Phrases -> Copy Bundle Resources而叼。
服務(wù)端推送時身笤,需要指定iOS 平臺下的sound參數(shù),具體傳入的值是聲音文件名+后綴葵陵。
三液荸、為什么iOS收不到推送消息?
如果你確認 appKey 在 SDK 客戶端與 Portal 上設(shè)置是一致脱篙,其他環(huán)節(jié)也按照文檔正確地操作娇钱。但還是收不到推送消息。那么绊困,有一定的可能性文搂,是你在 Portal 上上傳的證書,不是 APNs (Push) 證書秤朗。推送時指定的iOS推送環(huán)境和應(yīng)用證書是同一個環(huán)境煤蹭。請參考iOS 證書設(shè)置指南再次檢查證書選擇是否正確。
請注意:iOS能接受消息的必要條件是:應(yīng)用程序的證書要和你上傳到j(luò)push portal上的證書對應(yīng),如果你的程序是直接在xcode上運行的疯兼,你的應(yīng)用部署環(huán)境必須是開發(fā)狀態(tài)才能收到APNS消息然遏。
溫馨提示:目前api推送的時候可以通過參數(shù)apns_production可以指定推送環(huán)境,false為開發(fā)環(huán)境吧彪,true為生產(chǎn)環(huán)境待侵。V3 api不帶此參數(shù)則默認為生產(chǎn)環(huán)境,V3 api封裝的sdk 默認為開發(fā)環(huán)境姨裸。如果api有傳apns_production則以此值為準秧倾,否則以應(yīng)用詳情的部署環(huán)境為準。
四傀缩、為什么啟動的時候出現(xiàn) Did Fail To Register For Remote Notifications With Error的錯誤
程序運行的時候出現(xiàn)下面的錯誤信息:
did Fail To Register For Remote Notifications With Error: Error Domain=NSCocoaErrorDomain Code=3000 "未找到應(yīng)用程序的“aps-environment”的權(quán)利字符串" UserInfo=0x1c55e000 {NSLocalizedDescription=未找到應(yīng)用程序的“aps-environment”的權(quán)利字符串}
這個是由于你的Provisioning Profile文件那先,不具備APNS功能導(dǎo)致的。請登陸Apple Developer 網(wǎng)站設(shè)置好證書赡艰,更新Provisioning Profile售淡,重新導(dǎo)入Xcode】犊澹或參考博客
五揖闸、如何在接收到 APN 的時候獲取 APN 消息內(nèi)容并進行跳轉(zhuǎn)或做出響應(yīng)處理?
六料身、如何關(guān)閉 APN 推送汤纸?
可通過調(diào)用代碼
// iOS 8 以上可用此方法
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]] ;
進入您的應(yīng)用的設(shè)置頁面,點擊“通知設(shè)置”芹血,用戶手可以動變更“允許通知”的狀態(tài)贮泞。
七、App badge number(角標)如何更改與清空幔烛?
JPush 網(wǎng)站上推送 iOS 通知時啃擦,可在[可選設(shè)置]里面指定 badge 參數(shù)的值,如:1或"+1"饿悬。
api上指定badge的參數(shù)請看:Push API
客戶端上報badge到JPush服務(wù)器的接口請看:設(shè)置badge
關(guān)于badge +1的介紹议惰,請看APNs Notification badge
八、Icon Badge number 的清空方法:
- APN 推送內(nèi)容指定 badge number 為 0乡恕;
- 在代碼中使用如下代碼清空 badge number: [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
注意:
badge累加只能通過v3 api推送言询,且只有1.7.4版本以上才能支持。
九傲宜、為何推送一條 APN 后运杭,點擊通知中心的 APN 通知打開 App,可是 APN 通知在通知中心依然存在而未被刪除函卒?
如果推送 APN 時辆憔,Badge number 被指定為0 ,則可能出現(xiàn) APN 消息在通知中心被點擊后,盡管調(diào)用了 [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; 但 APN 消息在通知中心不會被刪除的情況虱咧。 這種情況可以按如下代碼調(diào)用以清除通知中心的 APN 通知熊榛。
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
如果仍有其他消息,則考慮清除 local notification 通知腕巡。
( [[UIApplication sharedApplication] cancelAllLocalNotifications] )
十玄坦、出現(xiàn)Not get deviceToken yet. Maybe: your certificate not configured APNs?...錯誤日志時如何排除問題?
如果出現(xiàn)上述日志,則說明一段時間內(nèi)都無法獲取device token绘沉,那么:
- 確認你的app配置了apns權(quán)限煎楣,如果未配置apns權(quán)限,則應(yīng)該會出現(xiàn)此錯誤提示车伞。
- 確認你的app運行在ios真機而非模擬器上择懂,且通知中心中對應(yīng)app的通知權(quán)限沒有完全關(guān)閉(alert/sound/badge至少有一個權(quán)限是打開的)。
- 確認你的網(wǎng)絡(luò)狀況另玖,與apple的服務(wù)器的連接是通過tcp的 5223端口連接困曙,確認你網(wǎng)絡(luò)的對應(yīng)端口是否可用,可通過下列命令來確認這點:
telnet 1-courier.push.apple.com 5223
在代碼中可在以下兩個函數(shù)中斷點以確認device token的獲取狀態(tài)谦去。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;
如果app運行進入 didFailToRegisterForRemoteNotificationsWithError 則說明app的APNS權(quán)限問題或者app運行在模擬器慷丽,參考 證書設(shè)置文檔。
如果app運行進入didRegisterForRemoteNotificationsWithDeviceToken 則說明運行正常哪轿,請確認你在此函數(shù)中的代碼中有將token傳遞給jpush的調(diào)用:
[JPUSHService registerDeviceToken:deviceToken];
- 如果以上兩個registerRemoteNotification的函數(shù)都未進入, 請確認你的代碼中有注冊申請apns的函數(shù)調(diào)用:
[JPUSHService registerForRemoteNotificationTypes:];
- 如果上述情況都已確認且未進入第4步的任意回調(diào)函數(shù)翔怎,則可以判斷無法獲取token的原因在于設(shè)備與apple的網(wǎng)絡(luò)連通性問題(注:一個設(shè)備只有在未申請過token的情況下才會需要與apple的網(wǎng)絡(luò)交互來獲取token窃诉,已經(jīng)獲取過某一環(huán)境token的設(shè)備在無網(wǎng)絡(luò)的情況下也能獲取到對應(yīng)環(huán)境的token(環(huán)境分為 開發(fā)/生產(chǎn))),這種情況下切換網(wǎng)絡(luò)能夠在大部分情況下解決此問題赤套。
- 如果仍然有問題飘痛,請將上述步驟的結(jié)果以郵件附件的形式發(fā)送到JPush支持郵箱,我們將協(xié)助你解決此問題容握。
十一宣脉、上傳到appStore的版本為什么收不到推送?
- 請確認xcode選擇的生產(chǎn)證書和上傳的證書的bundleid一致剔氏;
- 如果是在jpush網(wǎng)站上推送塑猖,請確認新建通知時推送對象是否選擇了生產(chǎn)環(huán)境;
- 如果是v3 api推送谈跛,請確認是否使用了apns_production參數(shù)羊苟,值是否為:true;如果沒有使用apns_production參數(shù)請確認jpush網(wǎng)站上該應(yīng)用的部署環(huán)境是否已經(jīng)切換到生產(chǎn)環(huán)境感憾。
十二蜡励、iOS 平臺上傳證書一直為未通過狀態(tài)
證書上傳未通過的原因一般有:
- 密碼錯誤;
- 上傳的apns證書環(huán)境不一致;
- 上傳到控制臺必須是apns證書凉倚,非apns證書會帶來錯誤兼都,還有其他的原因可能是開發(fā)者證書也可能是apns證書那里導(dǎo)出來的私鑰。
具體請看上傳后顯示的錯誤輸出內(nèi)容
十三稽寒、為什么日志里面會打影绫獭: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.
這個主要是提示開發(fā)者如果要支持UIBackgroundModes,需要開啟Remote notifications瓦胎,具體操作可以看:iOS 7 Background Remote Notification
后記
??極光推送理論和常見問題就這些了芬萍,以后我會加一下我寫的工程上的代碼。有什么不對的地方搔啊,歡迎發(fā)郵件或者私信我柬祠,謝謝大家。