Xcode8下快速集成極光推送并兼顧iOS10

不同版本極光推送SDK集成各有差異,集成時(shí)一定要注意版本號(hào),樓主已將博文更新成最新的SDK JPush v3.0.2. 各位童鞋先閱讀下JPush v3.0.2的升級(jí)指南吧熙宇!
極光的最近更新
極光資源下載

JPush SDK v3.0.2 升級(jí)指南
  • 更新時(shí)間
    2017-02-13

  • 更新信息
    修復(fù):DNS解析失敗帶來(lái)的崩潰問(wèn)題围段,提升穩(wěn)定性

  • 升級(jí)提示
    建議升級(jí)!
    注意:支持 Xcode 8.0 以上版本 開(kāi)啟 bitcode台腥。

  • 升級(jí)指南
    1.注意 3.0.0及以上版本將不再支持處理器為i386的模擬器宏赘。
    2.添加libresolv.tbd庫(kù)(2.2.0及以上版本要求)
    3.Xcode7 升級(jí)到 Xcode8,替換原先導(dǎo)入的 .dylib 框架為 .tbd (特別留意)

本博文修改歷史
  • 2017.03.25 ------------ JPush v3.0.2
  • 2016.12.13 ------------ JPush v2.2.0
  • 2016.09.28 ----------- JPush v2.1.9

簡(jiǎn)介

iOS10下黎侈,遠(yuǎn)程推送發(fā)生了變化察署,新增的UserNotifications.framework將本地推送和遠(yuǎn)程推送整合在一起。 最近剛剛更新了Xcode8蜓竹,自動(dòng)創(chuàng)建證書(shū)和配置文件確實(shí)方便許多箕母。琰君分享下以開(kāi)發(fā)環(huán)境為例(非生產(chǎn)環(huán)境)在Xcode8下,快速集成極光推送并兼顧iOS10俱济。

注意:極光的遠(yuǎn)程推送是免費(fèi)的嘶是,并同時(shí)兼顧iOS,Android蛛碌,Windows Phone三個(gè)平臺(tái)聂喇,但相應(yīng)的用戶統(tǒng)計(jì),終端統(tǒng)計(jì)等功能是不免費(fèi)的蔚携。如果你需要用戶統(tǒng)計(jì)希太,終端統(tǒng)計(jì)這些功能意味著需要付費(fèi)才能使用。

參考鏈接

開(kāi)發(fā)證書(shū)配置
APNs 推送原理及問(wèn)題
iOS 推送全解析酝蜒,你不可不知的所有 Tips誊辉!

接下來(lái)假設(shè)你都了解證書(shū)相關(guān)的,推送的一些概念和極光推送的知識(shí)亡脑。那么相信你應(yīng)該知道需要一臺(tái)iOS設(shè)備和一個(gè)蘋(píng)果開(kāi)發(fā)者帳號(hào)才能去體驗(yàn)遠(yuǎn)程推送堕澄。如果你清楚遠(yuǎn)程推送的原理邀跃,那可以直接從以下第2步開(kāi)始。

集成步驟

  1. 遠(yuǎn)程推送原理
  2. Xcode8創(chuàng)建項(xiàng)目蛙紫,配置自動(dòng)創(chuàng)建App ID/證書(shū)/配置文件
  3. 創(chuàng)建APNs 推送證書(shū)
  4. 在極光推送后臺(tái)創(chuàng)建應(yīng)用拍屑,并上傳APNs 推送證書(shū)
  5. 項(xiàng)目中集成極光推送SDK
  6. notification payload 和遠(yuǎn)程推送類(lèi)型
  7. 獲取 APNs推送內(nèi)容
  8. 極光推送后臺(tái)發(fā)送遠(yuǎn)程推送測(cè)試
1. 遠(yuǎn)程推送原理

當(dāng)iOS設(shè)備連網(wǎng)的情況下,iOS設(shè)備和蘋(píng)果服務(wù)器建立了一個(gè)長(zhǎng)鏈接坑傅,即便應(yīng)用處于掛起和后臺(tái)的狀態(tài)僵驰,蘋(píng)果可以給iOS設(shè)備中的應(yīng)用發(fā)送通知。


遠(yuǎn)程推送原理
概念
  1. iOS:iOS設(shè)備
  1. APNs Server:蘋(píng)果服務(wù)器
  2. Your App: 自己的應(yīng)用
  3. Your Server:自己的服務(wù)器
推送流程
  1. iOS 應(yīng)用注冊(cè)推送通知唁毒,iOS設(shè)備將設(shè)備的UDID和應(yīng)用的Bundle ID發(fā)送到蘋(píng)果服務(wù)器蒜茴。
  2. 蘋(píng)果服務(wù)器將接收到的UDIDBundle ID加密生成一個(gè)deviceToken,并返回給對(duì)應(yīng)iOS應(yīng)用枉证。
  3. iOS應(yīng)用將接收到的deviceToken發(fā)送到自己的服務(wù)器矮男,服務(wù)器并保存。
  4. 自己的服務(wù)器需配置APNs 推送證書(shū)室谚,當(dāng)需要推送時(shí)毡鉴,去后臺(tái)查詢推送目標(biāo)設(shè)備的deviceToken,將notification payloaddeviceToken一起發(fā)送給蘋(píng)果服務(wù)器秒赤。notification payload是一個(gè)JSON字典猪瞬,包含著發(fā)給應(yīng)用程序的數(shù)據(jù),并且包含通知的類(lèi)型(類(lèi)型決定系統(tǒng)如何通知用戶)入篮。
  5. 蘋(píng)果服務(wù)器通過(guò)deviceToken找到對(duì)應(yīng)設(shè)備下的對(duì)應(yīng)應(yīng)用陈瘦,推送消息。
說(shuō)明
  1. 真機(jī)測(cè)試并且包含推送功能需要?jiǎng)?chuàng)建對(duì)應(yīng)App ID/證書(shū)/配置文件潮售, 這步可以用Xcode8 自動(dòng)創(chuàng)建痊项,而不需要到蘋(píng)果開(kāi)發(fā)者平臺(tái)去創(chuàng)建。如果不是Xcode8酥诽,則需要去開(kāi)發(fā)者平臺(tái)申請(qǐng)鞍泉,確保App ID包含推送通知服務(wù),并且在Xcode中配置肮帐,保證真機(jī)測(cè)試即可咖驮。
  2. 我們自己的服務(wù)器需要配置 APNs 推送證書(shū),同樣的分為開(kāi)發(fā)證書(shū)和生產(chǎn)證書(shū)训枢。需要到蘋(píng)果開(kāi)發(fā)者平臺(tái)去申請(qǐng)托修。
  3. 如果不借助第三方推送平臺(tái),我們需要完成推送流程中的1恒界,3睦刃,4步。借助極光推送十酣,那么我們只需要完成推送流程中的1眯勾,3步枣宫,但同樣需要我們完成第4步中的申請(qǐng)APNs 推送證書(shū),并且上傳到極光推送平臺(tái)吃环。
2. Xcode8配置自動(dòng)創(chuàng)建App ID/證書(shū)/配置文件
  1. 在Xcode8下,確保已經(jīng)登錄付費(fèi)蘋(píng)果開(kāi)發(fā)者帳號(hào)洋幻。請(qǐng)開(kāi)啟Application Target的Capabilities->Push Notifications選項(xiàng)郁轻。
開(kāi)啟遠(yuǎn)程推送

2.勾選自動(dòng)管理App ID證書(shū)配置文件

勾選自動(dòng)管理

3.檢查Xcode自動(dòng)創(chuàng)建的App ID證書(shū)配置文件,保證下圖中第4步App ID包含的遠(yuǎn)程推送服務(wù)文留。如果沒(méi)問(wèn)題就可以真機(jī)運(yùn)行了好唯。

檢查Xcode生產(chǎn)的App ID/證書(shū)/配置文件

3. 創(chuàng)建APNs 推送證書(shū)
  1. 登錄開(kāi)發(fā)者網(wǎng)站,并點(diǎn)擊按鈕創(chuàng)建證書(shū)
點(diǎn)擊按鈕創(chuàng)建證書(shū)

2.選擇開(kāi)發(fā)環(huán)境APNs 推送證書(shū)點(diǎn)擊右下角按鈕創(chuàng)建

創(chuàng)建開(kāi)發(fā)環(huán)境APNs 推送證書(shū)

3.選擇工程的App ID

選擇工程的App ID

4.上傳證書(shū)請(qǐng)求文件燥翅,不知道的童鞋可參照開(kāi)發(fā)證書(shū)配置

上傳證書(shū)請(qǐng)求文件

5.點(diǎn)擊下載證書(shū)骑篙,并雙擊安裝到鑰匙串.


安裝APNs 推送證書(shū)

6.打開(kāi)鑰匙串,找到對(duì)應(yīng)的APNs 推送證書(shū)森书,并選擇右鍵導(dǎo)出包含私鑰的證書(shū)靶端。(確保證書(shū)左側(cè)為向右的小箭頭,導(dǎo)出的證書(shū)才會(huì)包含私鑰.)


鑰匙串導(dǎo)出證書(shū)

7.設(shè)置證書(shū)名字凛膏,并選擇證書(shū)存放位置杨名。


設(shè)置證書(shū)名字

8.設(shè)置證書(shū)密碼,可不填猖毫。極光推送支持證書(shū)設(shè)置密碼台谍,但像leanCloud推送不支持證書(shū)設(shè)置密碼,各位童鞋可按照實(shí)際情況來(lái)吁断。最后輸入電腦開(kāi)密碼趁蕊,導(dǎo)出證書(shū)。

設(shè)置證書(shū)密碼

輸入電腦開(kāi)機(jī)密碼導(dǎo)出證書(shū)
4. 在極光推送后臺(tái)創(chuàng)建應(yīng)用仔役,并上傳APNs 推送證書(shū)

1.登錄極光推送平臺(tái)掷伙,切換到控制臺(tái),并創(chuàng)建應(yīng)用骂因。接下來(lái)在應(yīng)用信息中上傳開(kāi)發(fā)推送證書(shū)炎咖。生產(chǎn)推送證書(shū)配置類(lèi)似,不做贅述寒波。

上傳開(kāi)發(fā)APNs 推送證書(shū)
  1. 核對(duì)應(yīng)用的Bundle ID 等信息是否正確.
    核對(duì)Bundle ID 等信息
5. 項(xiàng)目中集成極光推送SDK

極光推送最新版本3.0.2已支持CocoaPods導(dǎo)入乘盼。

  • 方式一:CocoaPods導(dǎo)入,一句話搞定俄烁。
pod 'JPush', '3.0.2'
  • 方式二:手動(dòng)導(dǎo)入SDK和系統(tǒng)依賴(lài)庫(kù)
    jpush-ios-3.0.2.a
    jcore-ios-1.1.1.a
    JPUSHService.h
    
導(dǎo)入系統(tǒng)依賴(lài)庫(kù)

CFNetwork.framework
CoreFoundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
Security.framework
libz.tbd
Adsupport.framework (獲取IDFA需要绸栅;如果不使用IDFA,請(qǐng)不要添加)
UserNotifications.framework(Xcode8及以上)
libresolv.tbd (JPush 2.2.0及以上版本需要)

3. AppDelegate.m 配置
導(dǎo)入以下頭文件

import "JPUSHService.h"

// 如果需要使用idfa功能所需要引入的頭文件(可選)

import <AdSupport/AdSupport.h>

ifdef NSFoundationVersionNumber_iOS_9_x_Max

import <UserNotifications/UserNotifications.h>

endif

并且遵守`<JPUSHRegisterDelegate>`協(xié)議

@interface AppDelegate ()<JPUSHRegisterDelegate>
@end

注冊(cè)遠(yuǎn)程推送页屠,初始化極光推送SDK粹胯。

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

//-------------注冊(cè)遠(yuǎn)程推送
//notice: 3.0.0及以后版本注冊(cè)可以這樣寫(xiě)蓖柔,也可以繼續(xù)用之前的注冊(cè)方式
JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;
[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
//-------------極光推送SDK初始化
BOOL isProduction = NO;// NO為開(kāi)發(fā)環(huán)境,YES為生產(chǎn)環(huán)境
//廣告標(biāo)識(shí)符 如果沒(méi)有使用IDFA直接傳nil
NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
[JPUSHService setupWithOption:launchOptions appKey:@"極光推送AppKey"
channel:nil
apsForProduction:isProduction
advertisingIdentifier:advertisingId];
return YES;
}

以上是注冊(cè)遠(yuǎn)程推送極光版本风纠,很簡(jiǎn)潔况鸣。下面是注冊(cè)遠(yuǎn)程推送系統(tǒng)版本,可以參考下竹观。

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

CGFloat version = [[[UIDevice currentDevice] systemVersion] floatValue];  
  
if (version >= 10.0)  
{  
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];  
    [center requestAuthorizationWithOptions:UNAuthorizationOptionCarPlay | UNAuthorizationOptionSound | UNAuthorizationOptionBadge | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) {  
          
        if (granted) {  
            NSLog(@" iOS 10 request notification success");  
        }else{  
            NSLog(@" iOS 10 request notification fail");  
        }  
    }];  
}  
else if (version >= 8.0)  
{  
    UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert categories:nil];  
    [application registerUserNotificationSettings:setting];  
}else  
{     //iOS <= 7.0
    UIRemoteNotificationType type = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound;  
    [application registerForRemoteNotificationTypes:type];  
}    

//注冊(cè)通知  
[[UIApplication sharedApplication] registerForRemoteNotifications];  
  
return YES;  

}

將蘋(píng)果服務(wù)器返回的`deviceToken`,上傳到極光推送服務(wù)器镐捧。

-(void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
[JPUSHService registerDeviceToken:deviceToken];
}

注冊(cè)遠(yuǎn)程通知失敗,比如沒(méi)有聯(lián)網(wǎng)的狀態(tài)下臭增。

-(void)application:(UIApplication *)application
didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}


#####6.notification payload 和遠(yuǎn)程推送類(lèi)型
發(fā)送遠(yuǎn)程推送的服務(wù)器發(fā)送給APNs的每個(gè)通知都包含payload懂酱。 payload是一個(gè)JSON字典,包含要發(fā)送到應(yīng)用程序的任何自定義數(shù)據(jù)誊抛,并包含有關(guān)推送類(lèi)型的信息(推送類(lèi)型決定系統(tǒng)如何通知用戶)列牺。

遠(yuǎn)程推送分為普通推送,后臺(tái)推送拗窃,靜默推送三種方式瞎领。以下以遠(yuǎn)程推送的類(lèi)型來(lái)討論下payload的構(gòu)造。以下只考慮iOS7之后的操作系統(tǒng)并炮。

- 普通推送 
  - payload 構(gòu)造:包含聲音默刚、內(nèi)容、角標(biāo)逃魄、自定義字段荤西。

{
aps = {
alert = "顯示內(nèi)容";//alert對(duì)應(yīng)的值也可以是字典,字典中body鍵的值對(duì)應(yīng)顯示內(nèi)容
badge = 1; // App 角標(biāo)伍俘,可推送 n邪锌、+n、-n 來(lái)實(shí)現(xiàn)角標(biāo)的固定癌瘾、增加觅丰、減少
sound = default; // 推送聲音,默認(rèn)系統(tǒng)三全音妨退,如需使用自己的聲音妇萄,需要將聲音文件拖拽&拷貝至 Xcode 工程目錄任意位置,并在推送時(shí)指定其文件名
};
proNo = "tb_pro_no_id249349874"; // 自定義字段
DesVc = "ProViewController";
}


 - 處于未啟動(dòng)咬荷,系統(tǒng)會(huì)顯示通知冠句,點(diǎn)擊通知橫幅啟動(dòng),在以下方法中獲取通知內(nèi)容:

-(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

 - 處于后臺(tái)幸乒,系統(tǒng)會(huì)顯示通知懦底,但不會(huì)通知對(duì)應(yīng)應(yīng)用(即應(yīng)用的方法不會(huì)被調(diào)用)。
 - 處于前臺(tái)罕扎,iOS10之后會(huì)顯示通知聚唐。(iOS10之前會(huì)不會(huì)展示通知丐重,樓主也記不住了??)在以下方法中獲取通知內(nèi)容:
   - iOS7 ~ iOS9

-(void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void(^(UIBackgroundFetchResult))completionHandler

   - iOS10 after (UNUserNotificationCenterDelegate中的代理方法)

-(void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler

 
- 后臺(tái)推送
 - 必須在 Xcode 工程中 TARGETS – Capabilities – Background Modes 中開(kāi)啟Remote notifications功能。
 - payload構(gòu)造:必須攜帶 "content-available" = 1杆查,必須攜帶 alert中的顯示信息扮惦、badge、sound 中 至少 1 個(gè)字段亲桦。

{
aps = {
alert = "顯示內(nèi)容";//alert對(duì)應(yīng)的值也可以是字典径缅,字典中body鍵的值對(duì)應(yīng)顯示內(nèi)容
badge = 1;
"content-available" = 1; // 必帶字段
sound = default;
};
key1 = value1;
}

 - 處于未啟動(dòng),同上述普通推送一致烙肺。
 - 處于后臺(tái)或者掛起,系統(tǒng)會(huì)顯示通知氧卧。通過(guò)下述獲取通知內(nèi)容桃笙,你的應(yīng)用會(huì)在后臺(tái)啟動(dòng)(如果應(yīng)用為掛起狀態(tài),則喚醒它沙绝,處于后臺(tái)狀態(tài))搏明,將有30秒的時(shí)間進(jìn)行處理通知或者下載數(shù)據(jù)等操作。

-(void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void(^(UIBackgroundFetchResult))completionHandler


 - 處于前臺(tái)闪檬, 系統(tǒng)會(huì)顯示通知星著。可通過(guò)以下方法獲取內(nèi)容:

   - iOS7 after

-(void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void(^(UIBackgroundFetchResult))completionHandler

   - 注:iOS10 之后除了會(huì)調(diào)用上面的方法粗悯,還會(huì)調(diào)用此方法 (UNUserNotificationCenterDelegate中的代理方法)

-(void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler


- 靜默推送
 - 系統(tǒng)不會(huì)顯示通知虚循,用戶不會(huì)有任何察覺(jué)。
 - payload構(gòu)造:必須攜帶 "content-available" = 1样傍。必須不攜帶 alert中的顯示內(nèi)容横缔、badge、sound衫哥。

{
aps = {
alert = "";//alert對(duì)應(yīng)的值也可以為字典茎刚,字典中不能包含body鍵值對(duì)。
"content-available" = 1; // 必帶字段
};
key1 = value1;
}

 - 處于未啟動(dòng)撤逢,獲取不到通知內(nèi)容
 - 處于后臺(tái)膛锭,iOS7 之后你的應(yīng)用會(huì)在后臺(tái)啟動(dòng)(如果應(yīng)用為掛起狀態(tài),則喚醒它蚊荣,處于后臺(tái)狀態(tài))初狰,將有30秒的時(shí)間進(jìn)行處理通知或者下載數(shù)據(jù)等操作「狙海可通過(guò)下述方法獲取內(nèi)容:

-(void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void(^(UIBackgroundFetchResult))completionHandler

 - 處于前臺(tái)跷究, iOS7 之后可通過(guò)下述方法獲取內(nèi)容:

-(void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void(^(UIBackgroundFetchResult))completionHandler



#####7.獲取 APNs(通知) 推送內(nèi)容
iOS 設(shè)備收到一條推送(APNs),用戶點(diǎn)擊推送通知打開(kāi)應(yīng)用時(shí)敲霍,應(yīng)用程序根據(jù)狀態(tài)不同進(jìn)行處理俊马,需在 AppDelegate 中的以下方法中添加代碼以獲取apn內(nèi)容丁存。
- 如果 App 狀態(tài)為未運(yùn)行,此函數(shù)將被調(diào)用柴我,如果launchOptions包含UIApplicationLaunchOptionsRemoteNotificationKey表示用戶點(diǎn)擊apn 通知導(dǎo)致app被啟動(dòng)運(yùn)行解寝;如果不含有對(duì)應(yīng)鍵值則表示 App 不是因點(diǎn)擊apn而被啟動(dòng),可能為直接點(diǎn)擊icon被啟動(dòng)或其他艘儒。

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
// apn 內(nèi)容獲攘住:
NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]
}

2.基于iOS 6 及以下的系統(tǒng)版本,如果 App狀態(tài)為正在前臺(tái)或者點(diǎn)擊通知欄的通知消息界睁,那么此函數(shù)將被調(diào)用觉增,并且可通過(guò)AppDelegate的applicationState是否為UIApplicationStateActive判斷程序是否在前臺(tái)運(yùn)行。

-(void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo{
}

3.此方法會(huì)在以下幾種情況下調(diào)用
 - iOS7 ~ iOS9 前臺(tái)接收普通推送翻斟。
 - iOS7之后開(kāi)啟Background Mode Remote Notification特性逾礁,在前臺(tái)或者后臺(tái)接收到后臺(tái)推送和靜默推送。

-(void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:
(void (^)(UIBackgroundFetchResult))completionHandler {
[JPUSHService handleRemoteNotification:userInfo];
NSLog(@"iOS7及以上系統(tǒng)访惜,收到通知:%@", [self logDic:userInfo]);

completionHandler(UIBackgroundFetchResultNewData);
}
-(NSString *)logDic:(NSDictionary *)dic {
if (![dic count]) {
return nil;
}
NSString *tempStr1 =
[[dic description] stringByReplacingOccurrencesOfString:@"\u"
withString:@"\U"];
NSString *tempStr2 =
[tempStr1 stringByReplacingOccurrencesOfString:@""" withString:@"\""];
NSString *tempStr3 =
[[@""" stringByAppendingString:tempStr2] stringByAppendingString:@"""];
NSData *tempData = [tempStr3 dataUsingEncoding:NSUTF8StringEncoding];
NSString *str =
[NSPropertyListSerialization propertyListFromData:tempData
mutabilityOption:NSPropertyListImmutable
format:NULL
errorDescription:NULL];
return str;
}

4.基于iOS 10及以上的系統(tǒng)版本嘹履,
原`[application: didReceiveRemoteNotification:]`將會(huì)被系統(tǒng)廢棄,
由新增`UserNotifications.framework`中的以下兩個(gè)方法替代债热。

[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:]
[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]

在極光推送SDK2.1.9版本以后可實(shí)現(xiàn)SDK封裝的JPUSHRegisterDelegate協(xié)議方法砾嫉,適配iOS10新增的delegate協(xié)議方法。
即以下兩個(gè)方法:

ifdef NSFoundationVersionNumber_iOS_9_x_Max

pragma mark- JPUSHRegisterDelegate

//前臺(tái)收到推送窒篱,可以采取必要的措施處理通知和更新APP的內(nèi)容焕刮。
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {

NSDictionary * userInfo = notification.request.content.userInfo;
UNNotificationRequest *request = notification.request; // 收到推送的請(qǐng)求
UNNotificationContent *content = request.content; // 收到推送的消息內(nèi)容
NSNumber *badge = content.badge; // 推送消息的角標(biāo)
NSString *body = content.body; // 推送消息體
UNNotificationSound *sound = content.sound; // 推送消息的聲音
NSString *subtitle = content.subtitle; // 推送消息的副標(biāo)題
NSString *title = content.title; // 推送消息的標(biāo)題

if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
NSLog(@"iOS10 前臺(tái)收到遠(yuǎn)程通知:%@", [self logDic:userInfo]);
}
// 指定系統(tǒng)如何提醒用戶,有Badge舌剂、Sound济锄、Alert三種類(lèi)型可以設(shè)置
// 如果不需提醒可傳UNNotificationPresentationOptionNone
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}
//當(dāng)用戶點(diǎn)擊了通知的某個(gè)操作,需要進(jìn)行相應(yīng)處理霍转,如跳轉(zhuǎn)到某個(gè)界面
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
NSDictionary * userInfo = response.notification.request.content.userInfo;
UNNotificationRequest *request = response.notification.request; // 收到推送的請(qǐng)求
UNNotificationContent *content = request.content; // 收到推送的消息內(nèi)容
NSNumber *badge = content.badge; // 推送消息的角標(biāo)
NSString *body = content.body; // 推送消息體
UNNotificationSound *sound = content.sound; // 推送消息的聲音
NSString *subtitle = content.subtitle; // 推送消息的副標(biāo)題
NSString *title = content.title; // 推送消息的標(biāo)題
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
NSLog(@"iOS10 收到遠(yuǎn)程通知:%@", [self logDic:userInfo]);
}
// 讓系統(tǒng)知道你已處理完通知荐绝。
completionHandler();
}

endif

#####8. 極光推送后臺(tái)發(fā)送遠(yuǎn)程推送測(cè)試
1.登錄`極光推送`,切換到控制臺(tái)避消,并點(diǎn)擊對(duì)應(yīng)的應(yīng)用低滩,點(diǎn)擊推送按鈕
![點(diǎn)擊推送按鈕](http://upload-images.jianshu.io/upload_images/790038-ce63654e0f2dafec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![點(diǎn)擊發(fā)送通知](http://upload-images.jianshu.io/upload_images/790038-e67a3d8e1f5eec8e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2.設(shè)置推送內(nèi)容
![設(shè)置推送內(nèi)容](http://upload-images.jianshu.io/upload_images/790038-86e85fb6524a99e9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

選擇推送環(huán)境iOS開(kāi)發(fā)環(huán)境,目標(biāo)人群岩喷,發(fā)送時(shí)間恕沫。再點(diǎn)擊可選設(shè)置設(shè)置消息的具體內(nèi)容。
![選擇推送環(huán)境](http://upload-images.jianshu.io/upload_images/790038-b8d4bb9b0e23c641.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


3.設(shè)置消息具體內(nèi)容纱意。

![設(shè)置推送內(nèi)容](http://upload-images.jianshu.io/upload_images/790038-f8e05e4ad5093b25.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


4.iOS設(shè)備接收到遠(yuǎn)程推送
![iOS設(shè)備接收到遠(yuǎn)程推送](http://upload-images.jianshu.io/upload_images/790038-9969a3408695827e.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
以下為打印的通知內(nèi)容婶溯。

{
"_j_msgid" = 3017423712;
aps = {
alert = {
body = "你愛(ài)談天,我愛(ài)笑~~";
subtitle = "每天堅(jiān)持1小時(shí),會(huì)有大收獲迄委。";
title = "天天";
};
badge = 100;
sound = default;
};
}



5.推送歷史可以在這里看得到褐筛,但有延遲,可能遠(yuǎn)程推送已接收到叙身,推送歷史數(shù)據(jù)還沒(méi)有更新到最新渔扎。
![推送歷史](http://upload-images.jianshu.io/upload_images/790038-994708e85592d06b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


關(guān)于Xcode8下集成極光遠(yuǎn)程推送的簡(jiǎn)單介紹,到這里就結(jié)束了信轿。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晃痴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子财忽,更是在濱河造成了極大的恐慌倘核,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件即彪,死亡現(xiàn)場(chǎng)離奇詭異笤虫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)祖凫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)酬凳,“玉大人惠况,你說(shuō)我怎么就攤上這事∧校” “怎么了稠屠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)翎苫。 經(jīng)常有香客問(wèn)我权埠,道長(zhǎng),這世上最難降的妖魔是什么煎谍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任攘蔽,我火速辦了婚禮,結(jié)果婚禮上呐粘,老公的妹妹穿的比我還像新娘满俗。我一直安慰自己,他們只是感情好作岖,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布唆垃。 她就那樣靜靜地躺著,像睡著了一般痘儡。 火紅的嫁衣襯著肌膚如雪辕万。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音渐尿,去河邊找鬼醉途。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涡戳,可吹牛的內(nèi)容都是我干的结蟋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼渔彰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嵌屎!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起恍涂,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤讯嫂,失蹤者是張志新(化名)和其女友劉穎售担,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡政恍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膘滨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耀鸦。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖顷扩,靈堂內(nèi)的尸體忽然破棺而出拐邪,到底是詐尸還是另有隱情,我是刑警寧澤隘截,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布扎阶,位于F島的核電站,受9級(jí)特大地震影響婶芭,放射性物質(zhì)發(fā)生泄漏东臀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一犀农、第九天 我趴在偏房一處隱蔽的房頂上張望惰赋。 院中可真熱鬧,春花似錦呵哨、人聲如沸谤逼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)流部。三九已至,卻和暖如春纹坐,著一層夾襖步出監(jiān)牢的瞬間枝冀,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留果漾,地道東北人球切。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绒障,于是被迫代替她去往敵國(guó)和親吨凑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 前言 iOS10下户辱,遠(yuǎn)程推送發(fā)生了變化鸵钝,新增的UserNotifications.framework將本地推送和遠(yuǎn)...
    夭Y夭閱讀 1,111評(píng)論 2 10
  • 極光推送: 1.JPush當(dāng)前版本是1.8.2,其SDK的開(kāi)發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋(píng)果官方的步伐庐镐,SD...
    Isspace閱讀 6,696評(píng)論 10 16
  • 推送通知注意:這里說(shuō)的推送通知跟NSNotification有所區(qū)別NSNotification是抽象的恩商,不可見(jiàn)的...
    醉葉惜秋閱讀 1,504評(píng)論 0 3
  • 介紹一下iOS10的通知新功能,用戶體驗(yàn)的提升和開(kāi)發(fā)者能夠發(fā)揮的地方非常多必逆,使得iOS更具有競(jìng)爭(zhēng)力怠堪。 1.iOS ...
    F麥子閱讀 3,793評(píng)論 3 4
  • 推送通知 注意:這里說(shuō)的推送通知跟NSNotification有所區(qū)別 NSNotification是抽象的,不可...
    iOS開(kāi)發(fā)攻城獅閱讀 4,191評(píng)論 1 13