前言
這兩天被極光推送折磨慘了!所以特此記錄一下,望遇到同樣問題的童鞋不會重蹈我的覆轍...
問題描述
Not get deviceToken yet. Maybe: your certificate not configured APNs? or current network is not so good so APNs registration failed? or there is no APNs register code? Please refer to JPush docs.
一、先貼上官方處理方法:極光推薦處理流程(來自極光官網(wǎng))
如果出現(xiàn)上述日志,則說明一段時間內(nèi)都無法獲取device token,那么:
1、確認(rèn)你的app配置了apns權(quán)限,如果未配置apns權(quán)限,則應(yīng)該會出現(xiàn)此錯誤提示。
2、確認(rèn)你的app運(yùn)行在ios真機(jī)而非模擬器上,且通知中心中對應(yīng)app的通知權(quán)限沒有完全關(guān)閉(alert/sound/badge至少有一個權(quán)限是打開的)。
3、確認(rèn)你的網(wǎng)絡(luò)狀況,與apple的服務(wù)器的連接是通過tcp的 5223端口連接,確認(rèn)你網(wǎng)絡(luò)的對應(yīng)端口是否可用,可通過下列命令來確認(rèn)這點(diǎn):
telnet 1-courier.push.apple.com 5223
在代碼中可在以下兩個函數(shù)中斷點(diǎn)以確認(rèn)device token的獲取狀態(tài)。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;
如果app運(yùn)行進(jìn)入 didFailToRegisterForRemoteNotificationsWithError 則說明app的APNS權(quán)限問題或者app運(yùn)行在模擬器。
如果app運(yùn)行進(jìn)入 didRegisterForRemoteNotificationsWithDeviceToken 則說明運(yùn)行正常,請確認(rèn)你在此函數(shù)中的代碼中有將token傳遞給jpush的調(diào)用:
[APService registerDeviceToken:deviceToken];
如果以上兩個 registerRemoteNotification 的函數(shù)都未進(jìn)入, 請確認(rèn)你的代碼中有注冊申請apns的函數(shù)調(diào)用:
[APService registerForRemoteNotificationTypes:];
如果上述情況都已確認(rèn)且未進(jìn)入第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ò)能夠在大部分情況下解決此問題。
二、自己的原因及處理方法
原因
首先我們的項(xiàng)目是兩個人合作完成的,極光這塊是我負(fù)責(zé)的,另一個人負(fù)責(zé)的環(huán)信模塊,然后環(huán)信是二期加的,一期的時候極光是沒問題的,然后加了環(huán)信,也一直沒有測試,擋在統(tǒng)一測試的時候發(fā)現(xiàn)極光推送不管事了,因?yàn)橹虚g換過項(xiàng)目名稱相應(yīng)的極光也換過key和重新傳的證書,所以沒有想過是環(huán)信的問題??。
然后,環(huán)信的注冊推送注冊獲取token的回調(diào)是在AppDelegate的分類寫的,極光推送的是在AppDelegate內(nèi)部寫的,苦的我一遍又一遍的按照官網(wǎng)的來查原因,甚至都換了個極光賬號和新的證書,╮(╯▽╰)╭。
解決方法
將APPDelegate中以下內(nèi)部的代碼復(fù)制到環(huán)信AppDelegate+EaseMob.m中
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;
如下,為改后的AppDelegate+EaseMob.m中的注冊Token的函數(shù)
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
[[EaseMob sharedInstance] application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
[APService setTags:nil alias:[OpenUDID value] callbackSelector:nil object:nil];
[APService registerDeviceToken:deviceToken];
}