1.爲何啓動的時候出現 Did Fail To Register For Remote Notifications With Error的錯誤
程序運行的時候出現下面的錯誤信息:ios
did Fail To Register For Remote Notifications With Error: Error Domain=NSCocoaErrorDomain Code=3000 "未找到應用程序的「aps-environment」的權利字符串" UserInfo=0x1c55e000 {NSLocalizedDescription=未找到應用程序的「aps-environment」的權利字符串}xcode
這個是因爲你的Provisioning Profile文件,不具有APNS功能致使的。請登錄Apple Developer 網站設置好證書,更新Provisioning Profile,從新導入Xcode。服務器
2.如何在接收到 APN 的時候獲取 APN 消息內容並進行跳轉或作出響應處理?網絡
若是 App 狀態爲未運行,此函數將被調用,若是launchOptions包含UIApplicationLaunchOptionsLocalNotificationKey表示用戶點擊apn 通知致使app被啓動運行;若是不含有對應鍵值則表示 App 不是因點擊apn而被啓動,可能爲直接點擊icon被啓動或其餘。app
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; // apn 內容獲取:NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]
若是 App狀態爲正在前臺或者後臺運行,那麼此函數將被調用,而且可經過AppDelegate的applicationState是否爲UIApplicationStateActive判斷程序是否在前臺運行。此種狀況在此函數中處理:tcp
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo; // apn內容爲userInfo
若是是使用 iOS 7 的 Remote Notification 特性那麼處理函數須要使用ide
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler; // apn內容爲userInfo
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { // 取得 APNs 標準信息內容 NSDictionary *aps = [userInfo valueForKey:@"aps"]; NSString *content = [aps valueForKey:@"alert"]; //推送顯示的內容 NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; //badge數量 NSString *sound = [aps valueForKey:@"sound"]; //播放的聲音 // 取得自定義字段內容 NSString *customizeField1 = [userInfo valueForKey:@"customizeField1"]; //自定義參數,key是本身定義的 NSLog(@"content =[%@], badge=[%d], sound=[%@], customize field =[%@]",content,badge,sound,customizeField1); // Required [APService handleRemoteNotification:userInfo]; } //iOS 7 Remote Notification - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"this is iOS7 Remote Notification"); // Required [APService handleRemoteNotification:userInfo]; completionHandler(UIBackgroundFetchResultNoData); }
其次didFinishLauching中亦要加入一句註冊遠程通知的代碼函數
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 註冊推送消息監聽 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound)]; }
3.如何關閉 APN 推送?fetch
關閉推送有如下兩種方式關閉:網站
1.在iOS系統設置的通知設置中更改對應app的推送設置(推薦);
2.在代碼中調用 [[UIApplication sharedApplication] unregisterForRemoteNotifications];
對應以上關閉方式的從新打開推送方法:
1.在iOS系統設置的通知設置中修改對應app的推送設置;
2.在代碼中從新調用 [APService registerForRemoteNotificationTypes:];
4.App badge number(角標)如何更改與清空?
iOS每條 APN 推送能夠指定 badge number,iOS 系統沒法爲某個 App 的badge number作自動累加。
JPush 推送 iOS 消息時,有指定 badge 的參數。在手機上顯示的數值,就是每條推送指定的 badge 參數。
Badge number 的清空方法:
APN 推送內容指定 badge number 爲 0;
在代碼中使用以下代碼清空 badge number: [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
5.爲什麼推送一條 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] )
6.出現Not get deviceToken yet. Maybe: your certificate not configured APNs?...錯誤日誌時如何排除問題?
若是出現上述日誌,則說明一段時間內都沒法獲取device token,那麼:
1)確認你的app配置了apns權限,若是未配置apns權限,則應該會出現此錯誤提示。
2)確認你的app運行在ios真機而非模擬器上,且通知中心中對應app的通知權限沒有徹底關閉(alert/sound/badge至少有一個權限是打開的)。
3)確認你的網絡情況,與apple的服務器的鏈接是經過tcp的 5223端口鏈接,確認你網絡的對應端口是否可用,可經過下列命令來確認這點:
telnet 1-courier.push.apple.com 5223
4)在代碼中可在如下兩個函數中斷點以確認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的調用:
[APService registerDeviceToken:deviceToken];
5)若是以上兩個registerRemoteNotification的函數都未進入, 請確認你的代碼中有註冊申請apns的函數調用:
[APService registerForRemoteNotificationTypes:];
6)若是上述狀況都已確認且未進入第4步的任意回調函數,則能夠判斷沒法獲取token的緣由在於設備與apple的網絡連通性問題(注:一個設備只有在未申請過token的狀況下才會須要與apple的網絡交互來獲取token,已經獲取過某一環境token的設備在無網絡的狀況下也能獲取到對應環境的token(環境分爲 開發/生產)),這種狀況下切換網絡可以在大部分狀況下解決此問題。
7)若是仍然有問題,請將上述步驟的結果以郵件附件的形式發送到JPush支持郵箱,咱們將協助你解決此問題。
7.上傳到appStore的版本爲何收不到推送?
請確認xcode選擇的生產證書和上傳的證書的bundleid一致;
8.iOS 平臺上傳證書一直爲未經過狀態
證書上傳未經過的緣由通常有:
1)當前上傳的p12證書密碼輸入有誤;
2.)證書導出的時候展開了證書,把我的私鑰導了出來,導證書的時候請不要展開證書;
3)當前上傳的證書環境不對,如:在上傳開發證書的地方上傳了生產環境;
4)該證書已在本帳號的其它應用使用;
5)現上傳的證書與當前應用已上傳成功的證書的bundle id不一致。
具體請看上傳後顯示的錯誤輸出內容。