快速集成極光推送

** Tips:** 不同版本極光推送SDK集成各有差異,各位童鞋在集成時(shí)一定要注意版本號,本人集成的是基于 極光SDK JPush SDK-3.0.1的版本.

注意:極光推送的遠(yuǎn)程推送是免費(fèi)的,但相應(yīng)的用戶統(tǒng)計(jì),終端統(tǒng)計(jì)等功能是不免費(fèi)。如果你需要用戶統(tǒng)計(jì),終端統(tǒng)計(jì)這些功能意味著需要付費(fèi)才能使用。

先祭出極光SDK(內(nèi)附極光官方Demo)

參考鏈接

極光推送官方文檔
開發(fā)證書配置
APNs 推送原理及問題
iOS 推送全解析,你不可不知的所有 Tips!

集成步驟

1.遠(yuǎn)程推送原理
2.[Xcode8創(chuàng)建項(xiàng)目,配置自動創(chuàng)建App ID/證書/配置文件](#Xcode8創(chuàng)建項(xiàng)目,配置自動創(chuàng)建App ID/證書/配置文件)
3.[創(chuàng)建APNs 推送證書](#創(chuàng)建APNs 推送證書)
4.[在極光推送后臺創(chuàng)建應(yīng)用,并上傳APNs 推送證書](#在極光推送后臺創(chuàng)建應(yīng)用,并上傳APNs 推送證書)
5.項(xiàng)目中集成極光推送SDK
6.成功運(yùn)行
7.極光推送后臺發(fā)送遠(yuǎn)程推送測試

<a id = 遠(yuǎn)程推送原理></a> 1.遠(yuǎn)程推送原理

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

遠(yuǎn)程推送原理
遠(yuǎn)程推送原理

注:
1.iOS:iOS設(shè)備
2.APNS Server:蘋果服務(wù)器
3.Your App: 自己的應(yīng)用
4.Your Server:自己的服務(wù)器

1.1 推送流程

  • iOS 應(yīng)用注冊推送通知,iOS設(shè)備將設(shè)備的UDID和應(yīng)用的Bundle ID到蘋果服務(wù)器。
  • 蘋果服務(wù)器將接收到的UDID和Bundle ID加密生成一個(gè)deviceToken,并返回給對應(yīng)iOS應(yīng)用。
  • iOS應(yīng)用將接收到的deviceToken發(fā)送到自己的服務(wù)器,服務(wù)器并保存。
  • 自己的服務(wù)器需配置APNs 推送證書,當(dāng)需要推送時(shí),去后臺查詢推送目標(biāo)設(shè)備的deviceToken,將消息和deviceToken一起發(fā)送給蘋果服務(wù)器。
  • 蘋果服務(wù)器通過deviceToken找到對應(yīng)設(shè)備下的對應(yīng)應(yīng)用,推送消息。
注意:

1.我們的應(yīng)用真機(jī)測試需要?jiǎng)?chuàng)建對應(yīng)App ID/證書/配置文件, 這步可以用Xcode8 自動創(chuàng)建,而不需要到蘋果開發(fā)者平臺去創(chuàng)建。如果不是Xcode8,則需要去開發(fā)者平臺申請,并且在Xcode配置,保證真機(jī)測試即可。
2.我們自己的服務(wù)器需要配置 APNs 推送證書,同樣的分為開發(fā)證書和生產(chǎn)證書。需要到蘋果開發(fā)者平臺去申請。
3.如果不借助第三方推送平臺,我們需要完成推送流程中的1,3,4步。借助極光推送,那么我們只需要完成推送流程中的1,3步,但同樣需要我們申請APNs 推送證書,并且上傳到極光推送平臺。

<a id = "Xcode8創(chuàng)建項(xiàng)目,配置自動創(chuàng)建App ID/證書/配置文件"></a>2. Xcode8配置自動創(chuàng)建App ID/證書/配置文件

2.1 在Xcode8下,確保已經(jīng)登錄付費(fèi)蘋果開發(fā)者帳號。請開啟Application Target的Capabilities->Push Notifications選項(xiàng)。

開啟遠(yuǎn)程推送
開啟遠(yuǎn)程推送

2.2 *勾選自動管理App ID/證書/配置文件 *


勾選自動管理
勾選自動管理

2.3 檢查Xcode生產(chǎn)的App ID/證書/配置文件這步配置好了就可以真機(jī)運(yùn)行了。

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

<a id = "創(chuàng)建APNs 推送證書"></a>3. 創(chuàng)建APNs 推送證書

3.1 登錄開發(fā)者網(wǎng)站,并點(diǎn)擊按鈕創(chuàng)建證書

創(chuàng)建推送證書
創(chuàng)建推送證書

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

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

3.3 選擇工程的App ID

選擇工程的App ID
選擇工程的App ID

3.4 上傳證書請求文件,不知道的童鞋可參照開發(fā)證書配置

上傳證書請求文件
上傳證書請求文件

附: 3.4.1 請求文件的創(chuàng)建流程


從證書頒發(fā)機(jī)構(gòu)請求證書
從證書頒發(fā)機(jī)構(gòu)請求證書

存儲到磁盤
存儲到磁盤

存儲
存儲

請求文件
請求文件

3.5 點(diǎn)擊下載證書,并雙擊安裝到鑰匙串.

安裝APNs 推送證書
安裝APNs 推送證書

3.6 打開鑰匙串,并參照下圖指示,找到對應(yīng)的APNs 推送證書,并選擇右鍵導(dǎo)出.

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

3.7 設(shè)置證書名字,并選擇證書存放位置。

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

3.8.設(shè)置證書密碼,可不填。極光推送支持證書設(shè)置密碼,但像leanCloud
推送不支持證書設(shè)置密碼,各位童鞋可按照實(shí)際情況來。最后輸入電腦開機(jī)密碼,導(dǎo)出證書。

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

輸入電腦開機(jī)密碼導(dǎo)出證書
輸入電腦開機(jī)密碼導(dǎo)出證書

<a id = "在極光推送后臺創(chuàng)建應(yīng)用,并上傳APNs 推送證書"></a> 4.在極光推送后臺創(chuàng)建應(yīng)用,并上傳APNs 推送證書

4.1 登錄極光推送平臺,切換到控制臺,并創(chuàng)建應(yīng)用。接下來在應(yīng)用信息中上傳開發(fā)APNs 推送證書。生產(chǎn)環(huán)境APNs 推送證書配置類似,不做贅述.

上傳`APNs推送證書
上傳`APNs推送證書

4.2 核對應(yīng)用的Bundle ID 等信息是否正確.

核對應(yīng)用信息
核對應(yīng)用信息

<a id = "項(xiàng)目中集成極光推送SDK"></a> 5. 項(xiàng)目中集成極光推送SDK

5.1 添加頭文件
請將以下代碼添加到 AppDelegate.m 引用頭文件的位置。

// 引入JPush功能所需頭文件
#import "JPUSHService.h"
// iOS10注冊APNs所需頭文件
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif
// 如果需要使用idfa功能所需要引入的頭文件(可選)
#import <AdSupport/AdSupport.h>

5.2 添加Delegate
為AppDelegate添加Delegate。
參考代碼:

@interface AppDelegate ()<JPUSHRegisterDelegate>

@end

5.3 添加初始化代碼

配置 key
static NSString *appKey = @"c3d* **** **** **** **** ***8";
//static NSString *channel = @" ";
static BOOL isProduction = FALSE;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [self setup_APNs];
    [self setup_JpushdidFinishLaunchingWithOptions:launchOptions];
    
    return YES;
}

5.3.1 添加初始化APNs代碼

//添加初始化APNs代碼
- (void)setup_APNs{
    //Required
    //notice: 3.0.0及以后版本注冊可以這樣寫,也可以繼續(xù)用之前的注冊方式
    JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
    entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        // 可以添加自定義categories
        // NSSet<UNNotificationCategory *> *categories for iOS10 or later
        // NSSet<UIUserNotificationCategory *> *categories for iOS8 and iOS9
    }
    [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
}

5.3.2 添加初始化JPush代碼

//添加初始化JPush代碼
- (void)setup_JpushdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Optional
    // 獲取IDFA
    // 如需使用IDFA功能請?zhí)砑哟舜a并在初始化方法的advertisingIdentifier參數(shù)中填寫對應(yīng)值
    NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    
    // Required
    // init Push
    // notice: 2.1.5版本的SDK新增的注冊方法,改成可上報(bào)IDFA,如果沒有使用IDFA直接傳nil
    // 如需繼續(xù)使用pushConfig.plist文件聲明appKey等配置內(nèi)容,請依舊使用[JPUSHService setupWithOption:launchOptions]方式初始化。
    [JPUSHService setupWithOption:launchOptions appKey:appKey
                          channel:nil
                 apsForProduction:isProduction
            advertisingIdentifier:advertisingId];
    
}
  • 部分參數(shù)說明:

1.appKey填寫管理Portal上創(chuàng)建應(yīng)用后自動生成的AppKey值。請確保應(yīng)用內(nèi)配置的AppKeyPortal 上創(chuàng)建應(yīng)用后生成的AppKey一致。
2.channel指明應(yīng)用程序包的下載渠道,為方便分渠道統(tǒng)計(jì),具體值由你自行定義,如:App Store
3.apsForProduction1.3.1版本新增,用于標(biāo)識當(dāng)前應(yīng)用所使用的APNs證書環(huán)境。
0 (默認(rèn)值)表示采用的是開發(fā)證書,1 表示采用生產(chǎn)證書發(fā)布應(yīng)用。
注:此字段的值要與Build Settings的Code Signing配置的證書環(huán)境一致。
advertisingIdentifier詳見關(guān)于IDFA。

5.3.3 注冊APNs成功并上報(bào)DeviceToken

- (void)application:(UIApplication *)application 
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

  /// Required - 注冊 DeviceToken
  [JPUSHService registerDeviceToken:deviceToken];
}

5.3.4 實(shí)現(xiàn)注冊APNs失敗接口(可選)

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

5.3.5 添加處理APNs通知回調(diào)方法
請?jiān)贏ppDelegate.m實(shí)現(xiàn)該回調(diào)方法并添加回調(diào)方法中的代碼

#pragma mark- JPUSHRegisterDelegate

// iOS 10 Support
- (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); // 需要執(zhí)行這個(gè)方法,選擇是否提醒用戶,有Badge、Sound、Alert三種類型可以選擇設(shè)置
}

// iOS 10 Support
- (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();  // 系統(tǒng)要求執(zhí)行這個(gè)方法
}

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

  // Required, iOS 7 Support
  [JPUSHService handleRemoteNotification:userInfo];
  completionHandler(UIBackgroundFetchResultNewData);
}

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

  // Required,For systems with less than or equal to iOS6
  [JPUSHService handleRemoteNotification:userInfo];
}

<a id = "成功運(yùn)行"></a> 6 成功運(yùn)行

真機(jī)調(diào)試該項(xiàng)目,如果控制臺輸出以下日志則代表您已經(jīng)集成成功。

2016-08-19 17:12:12.745823 219b28[1443:286814] | JPUSH | I - [JPUSHLogin] 
----- login result ----- 
uid:5460310207 
registrationID:171976fa8a8620a14a4

如果調(diào)試運(yùn)行中遇到問題請參考:iOS SDK 調(diào)試指南

<a id = "極光推送后臺發(fā)送遠(yuǎn)程推送測試"></a>7.極光推送后臺發(fā)送遠(yuǎn)程推送測試

7.1 登錄極光推送,切換到控制臺,并點(diǎn)擊對應(yīng)的應(yīng)用,點(diǎn)擊推送按鈕,設(shè)置推送內(nèi)容,并發(fā)送通知

點(diǎn)擊推送按鈕,設(shè)置推送內(nèi)容并發(fā)送通知
點(diǎn)擊推送按鈕,設(shè)置推送內(nèi)容并發(fā)送通知

7.2 選擇推送環(huán)境iOS開發(fā)環(huán)境,目標(biāo)人群,發(fā)送時(shí)間。再點(diǎn)擊可選設(shè)置設(shè)置消息的具體內(nèi)容。

設(shè)置推送目標(biāo)
設(shè)置推送目標(biāo)

7.3 設(shè)置消息具體內(nèi)容。遠(yuǎn)程推送分為普通推送/后臺推送/靜默推送3種類型,并且類型由推送消息設(shè)置來決定。關(guān)于如何設(shè)置請參考iOS 推送全解析,你不可不知的所有 Tips!

設(shè)置消息具體內(nèi)容
設(shè)置消息具體內(nèi)容

7.4 iOS設(shè)備接收到遠(yuǎn)程推送

iOS設(shè)備接收到遠(yuǎn)程推送
iOS設(shè)備接收到遠(yuǎn)程推送

7.5 推送歷史可以在這里看得到,但有延遲,可能遠(yuǎn)程推送已接收到,推送歷史數(shù)據(jù)還沒有更新到最新。

推送歷史
推送歷史

Xcode8下集成極光遠(yuǎn)程推送的簡單介紹,到這里就結(jié)束了。
祭出自己的JPushDemo

另外我想說,如果學(xué)習(xí)不是為了裝逼,那將毫無意義!

另外.....

我的愿望是.......

世界和平.........

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容