Change 1:升級至 Xcode 8
建議儘快升級。使用 iOS 10 SDK 需要 Xcode 8 的支援。iOS 10 推出兩週內,安裝率就已經達到 48.16%,不升級 Xcode 8 並適配 iOS 10 意味著你現在可能已經損失了 50% 的高階客戶,而且在未來的幾個月內或許會陸續損失 90% 以上的客戶。
Change 2:Xcode 8 推送基本配置
- 首先跟以前版本的 Xcode 沒什麼區別。下載自己在 Apple Developer 官網申請好的證書、描述檔案(iOS 證書 設定指南
)。填寫 Bundle Identifier、選擇開發者,正確配置後,這裡不會有任何異常警告:
- Target - your target - Capabilities - 開啟 Push Notifications
證書如果配置正確,這裡會自動打勾。系統會在工程目錄裡生成一個projectName.entitlements
檔案,請不要隨意刪除、修改: - 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
- 資源下載
- 替換工程中原有的 JPush SDK 檔案為
JPUSHService.h
、jpush-ios-2.1.9.a
。 - Target - your target - Build Phases - Link Binary With Libraries - 引入一個新的庫
UserNotifications.framework
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 類必須實現
實現
- (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 展示。
收到推送小圖 - 下拉 - 展示大圖
Notification Content
用於完全自定義推送展示 UI,響應使用者操作事件,並即時更新推送展示 UI。
注意下圖中點選 Accept 後,推送 UI 裡日程表 UI 發生了重新整理。