? 近日公司來了新的后臺(tái)赠制,說他原先集成的是百度推送边酒。然而我們App老版用的都是極光推送默垄。無奈我們換成了百度推送。但是測(cè)試推送的時(shí)候甚纲,百度推送網(wǎng)站的web后臺(tái)老是出現(xiàn)“網(wǎng)絡(luò)原因口锭,無法發(fā)送推送”的提示,搞得連測(cè)試也沒法測(cè)介杆,絕對(duì)不是我證書的問題鹃操。在這里我要吐槽一下百度推送,要么出現(xiàn)以上網(wǎng)絡(luò)原因春哨,發(fā)不出推送荆隘。要么推送有延遲,一下收到好幾條赴背。反正我對(duì)百度推送的感覺已經(jīng)很不好了椰拒。最后又換回了極光推送。
? 原本十分鐘就能搞完的東西凰荚,結(jié)果出了莫名其妙的問題燃观。
? 極光推送打印臺(tái)提示:[JPUSHClientController] Not get deviceToken yet。也就是代理中?
?- (void)application:didRegisterForRemoteNotificationsWithDeviceToken:和- (void)application didFailToRegisterForRemoteNotificationsWithError:不調(diào)用便瑟。
原先都是按照demo一步一步來的缆毁,如今出現(xiàn)了這個(gè)問題,那種感覺就像無數(shù)只草泥馬奔騰而過到涂,這才讓我從頭到尾對(duì)推送原理擼了一遍脊框,特此記錄下來,給大家分享践啄。
? 證書就不多說了浇雹,唯一注意的一點(diǎn)是在你創(chuàng)建開發(fā)推送證書的時(shí)候類型應(yīng)該是Apple Push Notification service SSL (Sandbox),不是app Development屿讽。這里有幾份詳細(xì)的集成過程和對(duì)推送在AppDelegate中的封裝昭灵,感覺不錯(cuò)。
大部分的問題都可以在以上找到解決方案虎锚,我來列舉幾個(gè)比較容易遺漏的點(diǎn)硫痰;
? 1.推送設(shè)置setupWithOption中的appKey要和推送平臺(tái)上注冊(cè)時(shí)給的一致,isProduction 為NO就是開發(fā)狀態(tài)窜护,為YES就是生產(chǎn)狀態(tài)效斑。
? 2.程序設(shè)置中的Capabilities中 Remote notification要打?qū)?/p>
? 3.確定你的手機(jī)聯(lián)網(wǎng)并打開通知權(quán)限
? 4.代碼中是否重寫了AppDelegate中的方法(百度時(shí)有人提到了環(huán)信API重寫了獲取Token的方法)
? 5.確定你的代碼中有這個(gè)
? 很多人問題都出在了第五種情況上。
? 然而我的經(jīng)過徹底的排查柱徙,還是不調(diào)用獲取DeviceToken的函數(shù)缓屠,這種情況下,我拿同事的手機(jī)測(cè)試就能獲取到DeviceToken护侮。但別高興的太早敌完,如果你把APP卸載了重新打包就獲取不到了,原因是第一次打包調(diào)用registerForRemoteNotificationTypes注冊(cè)成功后羊初,之后即使不聯(lián)網(wǎng)滨溉,再調(diào)用都會(huì)以最上一次的device token作為參數(shù)回調(diào)didRegisterForRemoteNotificationsWithDeviceToken方法,除非你卸載了重裝长赞,這時(shí)的APNs要向你發(fā)送新的DeviceToken晦攒,這時(shí)就獲取不到了,這就是我現(xiàn)在的問題得哆,然后就會(huì)報(bào)[JPUSHClientController] Not get deviceToken yet脯颜。這個(gè)問題折磨了我一天,舊版的推送SDK也換過贩据,依舊不行栋操。碉堡的是第二天早上再打包的時(shí)候莫名其妙的就好了,簡(jiǎn)直嗶了狗饱亮。我沒有作任何改動(dòng)矾芙。按照我的理解,應(yīng)該是證書從蘋果開發(fā)者中心分發(fā)下來驗(yàn)證要經(jīng)過一段時(shí)間近尚,或是Xcode Bug蠕啄,或者是用這個(gè)證書在與百度推送綁定后再與極光綁定時(shí)發(fā)生了微妙的變化场勤,反正問題就這樣解決了戈锻。
? 下面是收到推送時(shí)的一些知識(shí)點(diǎn)和坑,大家可以交流一下
1.注意:App在活躍狀態(tài)時(shí)是收不到推送通知的橫幅的
2.App在后臺(tái)狀態(tài)時(shí)和媳,點(diǎn)擊推送會(huì)調(diào)用-(void)application:didReceiveRemoteNotification:fetchCompletionHandler:在這個(gè)函數(shù)里判斷applicationState從而做相應(yīng)的處理格遭。
注意,這里有個(gè)坑.從后臺(tái)點(diǎn)擊推送進(jìn)入前臺(tái)留瞳,進(jìn)入到這個(gè)函數(shù)里時(shí)拒迅,application的狀態(tài)是InActive,而非Active或Background。開始我還以為這個(gè)狀態(tài)是殺死狀態(tài)璧微,其實(shí)應(yīng)該叫空閑狀態(tài)作箍。那么這個(gè)函數(shù)里只需要判斷UIApplicationStateActive(正在使用)和UIApplicationStateInActive(從后臺(tái)進(jìn)入前臺(tái))狀態(tài)。
3.當(dāng)App在殺死狀態(tài)下點(diǎn)擊推送(注意不是點(diǎn)擊APP)并不會(huì)執(zhí)行以上函數(shù)前硫,而會(huì)進(jìn)入到- (BOOL)application: didFinishLaunchingWithOptions:胞得,不點(diǎn)擊推送時(shí)launchOptions為nil,這時(shí)推送的內(nèi)容都在launchOptions里屹电,可以用以下方法獲取
以上就是我推送的艱辛歷程俐填,僅代表個(gè)人對(duì)推送的理解翔忽,歡迎各位大神指出錯(cuò)誤英融,謝謝。