適配 iOS 10,極光推送使用者要做這 6 處更改

pikacode發表於2016-12-16

Change 1:升級至 Xcode 8

建議儘快升級。使用 iOS 10 SDK 需要 Xcode 8 的支援。iOS 10 推出兩週內,安裝率就已經達到 48.16%,不升級 Xcode 8 並適配 iOS 10 意味著你現在可能已經損失了 50% 的高階客戶,而且在未來的幾個月內或許會陸續損失 90% 以上的客戶。

Change 2:Xcode 8 推送基本配置

  1. 首先跟以前版本的 Xcode 沒什麼區別。下載自己在 Apple Developer 官網申請好的證書、描述檔案(iOS 證書 設定指南 )。填寫 Bundle Identifier、選擇開發者,正確配置後,這裡不會有任何異常警告:
    適配 iOS 10,極光推送使用者要做這 6 處更改
  2. Target - your target - Capabilities - 開啟 Push Notifications
    證書如果配置正確,這裡會自動打勾。系統會在工程目錄裡生成一個 projectName.entitlements 檔案,請不要隨意刪除、修改:
    適配 iOS 10,極光推送使用者要做這 6 處更改
  3. Target - your target - Capabilities - 開啟 Background Modes - 勾選最後一項 Remote Notifications(這是 iOS 7 以後支援的 App 在後臺收到推送時能夠讓開發者執行一段程式碼的功能,建議開啟 [iOS 7 Background Remote Notification][iOS 推送全解析 - Tip5:後臺推送/靜默推送]

Change 3:更新 JPush iOS SDK >= v2.1.9

  1. 資源下載
  2. 替換工程中原有的 JPush SDK 檔案為 JPUSHService.hjpush-ios-2.1.9.a
  3. Target - your target - Build Phases - Link Binary With Libraries - 引入一個新的庫 UserNotifications.framework
    適配 iOS 10,極光推送使用者要做這 6 處更改

Change 4:更改註冊推送程式碼

原先向系統註冊並請求推送許可權的程式碼是醬紫的,根據 iOS 8 以後及以前分兩步:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        //可以新增自定義categories
        [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
                                                          UIUserNotificationTypeSound |
                                                          UIUserNotificationTypeAlert)
                                              categories:nil];
    }
else {
        //categories 必須為nil
        [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
                                                          UIRemoteNotificationTypeSound |
                                                          UIRemoteNotificationTypeAlert)
                                              categories:nil];
}複製程式碼

現在在前面加了一段 iOS 10 的註冊方法:

//Required
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
        JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
        entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
        [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
    }
else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        //可以新增自定義categories
        [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
                                                          UIUserNotificationTypeSound |
                                                          UIUserNotificationTypeAlert)
                                              categories:nil];
} else {
        //categories 必須為nil
        [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
                                                          UIRemoteNotificationTypeSound |
                                                          UIRemoteNotificationTypeAlert)
                                              categories:nil];
}複製程式碼

Change 5:實現代理 方法

在 Change 4 中的該行程式碼處會報警告:

[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];複製程式碼

其中的 self 類必須實現 ,其是對 iOS 10 接收推送並處理的代理 的封裝。

實現 的兩個方法:

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
  // Required
  NSDictionary * userInfo = notification.request.content.userInfo;
  if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    [JPUSHService handleRemoteNotification:userInfo];
  }
  completionHandler(UNNotificationPresentationOptionAlert); // 需要執行這個方法,選擇是否提醒使用者,有Badge、Sound、Alert三種型別可以選擇設定
}

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
  // Required
  NSDictionary * userInfo = response.notification.request.content.userInfo;
  if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    [JPUSHService handleRemoteNotification:userInfo];
  }
  completionHandler();  // 系統要求執行這個方法
}複製程式碼

其中:

  • willPresentNotification 在展示推送之前觸發,可以在此替換推送內容,更改展示效果:內容、聲音、角標。
  • didReceiveNotificationResponse 在收到推送後觸發,你原先寫在 didReceiveRemoteNotification 方法裡接收推送並處理相關邏輯的程式碼,現在需要在這個方法裡也寫一份:
    • App 處於後臺收到推送觸發
    • 點選推送條目或橫幅後,App 進入前臺或 App 啟動觸發
    • App 處於前臺時觸發

Change 6:Notification Service Extension & Notification Content

這兩個 iOS 10 的新特性,暫未包含在 JPush SDK 中,需要使用者手動建立相應的 Target 並實現。

Notification Service Extension

主要負責修改推送內容、增加圖片、gif、audio、video 展示。
收到推送小圖 - 下拉 - 展示大圖

適配 iOS 10,極光推送使用者要做這 6 處更改

Notification Content

用於完全自定義推送展示 UI,響應使用者操作事件,並即時更新推送展示 UI。
注意下圖中點選 Accept 後,推送 UI 裡日程表 UI 發生了重新整理。

適配 iOS 10,極光推送使用者要做這 6 處更改

關於 Change 6 的詳細教程可參照

玩轉 iOS 10 推送 —— UserNotifications Framework(下)

相關文章