** 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)才能使用。
參考鏈接
極光推送官方文檔
開發(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ā)送通知。

注:
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)。

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

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

<a id = "創(chuàng)建APNs 推送證書"></a>3. 創(chuàng)建APNs 推送證書
3.1 登錄開發(fā)者網(wǎng)站,并點(diǎn)擊按鈕創(chuàng)建證書

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

3.3 選擇工程的App ID

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

附: 3.4.1 請求文件的創(chuàng)建流程
從證書頒發(fā)機(jī)構(gòu)請求證書
存儲到磁盤
存儲
請求文件
3.5 點(diǎn)擊下載證書,并雙擊安裝到鑰匙串.

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

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

3.8.設(shè)置證書密碼,可不填。極光推送支持證書設(shè)置密碼,但像leanCloud
推送不支持證書設(shè)置密碼,各位童鞋可按照實(shí)際情況來。最后輸入電腦開機(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 推送證書配置類似,不做贅述.

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

<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)配置的AppKey與Portal上創(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ā)送通知

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

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

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

Xcode8下集成極光遠(yuǎn)程推送的簡單介紹,到這里就結(jié)束了。
祭出自己的JPushDemo
另外我想說,如果學(xué)習(xí)不是為了裝逼,那將毫無意義!
另外.....
我的愿望是.......
世界和平.........



