** Tips:** 不同版本極光推送SDK集成各有差異,各位童鞋在集成時一定要注意版本號,本人集成的是基于 極光SDK JPush SDK-3.0.1的版本.
注意:極光推送的遠程推送是免費的,但相應的用戶統計,終端統計等功能是不免費。如果你需要用戶統計,終端統計這些功能意味著需要付費才能使用。
參考鏈接
極光推送官方文檔
開發證書配置
APNs 推送原理及問題
iOS 推送全解析,你不可不知的所有 Tips!
集成步驟
1.遠程推送原理
2.[Xcode8創建項目,配置自動創建App ID/證書/配置文件](#Xcode8創建項目,配置自動創建App ID/證書/配置文件)
3.[創建APNs 推送證書](#創建APNs 推送證書)
4.[在極光推送后臺創建應用,并上傳APNs 推送證書](#在極光推送后臺創建應用,并上傳APNs 推送證書)
5.項目中集成極光推送SDK
6.成功運行
7.極光推送后臺發送遠程推送測試
<a id = 遠程推送原理></a> 1.遠程推送原理
當iOS設備聯網的情況下,蘋果服務器和iOS設備建立了一個長鏈接,即便應用處于掛起和后臺的狀態,蘋果可以給iOS設備中的應用發送通知。

注:
1.iOS:iOS設備
2.APNS Server:蘋果服務器
3.Your App: 自己的應用
4.Your Server:自己的服務器
1.1 推送流程
- iOS 應用注冊推送通知,iOS設備將設備的UDID和應用的Bundle ID到蘋果服務器。
- 蘋果服務器將接收到的UDID和Bundle ID加密生成一個deviceToken,并返回給對應iOS應用。
- iOS應用將接收到的deviceToken發送到自己的服務器,服務器并保存。
- 自己的服務器需配置APNs 推送證書,當需要推送時,去后臺查詢推送目標設備的deviceToken,將消息和deviceToken一起發送給蘋果服務器。
- 蘋果服務器通過deviceToken找到對應設備下的對應應用,推送消息。
注意:
1.我們的應用真機測試需要創建對應App ID/證書/配置文件, 這步可以用Xcode8 自動創建,而不需要到蘋果開發者平臺去創建。如果不是Xcode8,則需要去開發者平臺申請,并且在Xcode配置,保證真機測試即可。
2.我們自己的服務器需要配置 APNs 推送證書,同樣的分為開發證書和生產證書。需要到蘋果開發者平臺去申請。
3.如果不借助第三方推送平臺,我們需要完成推送流程中的1,3,4步。借助極光推送,那么我們只需要完成推送流程中的1,3步,但同樣需要我們申請APNs 推送證書,并且上傳到極光推送平臺。
<a id = "Xcode8創建項目,配置自動創建App ID/證書/配置文件"></a>2. Xcode8配置自動創建App ID/證書/配置文件
2.1 在Xcode8下,確保已經登錄付費蘋果開發者帳號。請開啟Application Target的Capabilities->Push Notifications選項。

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

2.3 檢查Xcode生產的App ID/證書/配置文件這步配置好了就可以真機運行了。

<a id = "創建APNs 推送證書"></a>3. 創建APNs 推送證書
3.1 登錄開發者網站,并點擊按鈕創建證書

3.2 選擇開發環境APNs 推送證書
點擊右下角按鈕創建

3.3 選擇工程的App ID

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

附: 3.4.1 請求文件的創建流程
從證書頒發機構請求證書
存儲到磁盤
存儲
請求文件
3.5 點擊下載證書,并雙擊安裝到鑰匙串.

3.6 打開鑰匙串,并參照下圖指示,找到對應的APNs 推送證書,并選擇右鍵導出.

3.7 設置證書名字,并選擇證書存放位置。

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


<a id = "在極光推送后臺創建應用,并上傳APNs 推送證書"></a> 4.在極光推送后臺創建應用,并上傳APNs 推送證書
4.1 登錄極光推送平臺,切換到控制臺,并創建應用。接下來在應用信息中上傳開發APNs 推送證書。生產環境APNs 推送證書
配置類似,不做贅述.

4.2 核對應用的Bundle ID 等信息是否正確.

<a id = "項目中集成極光推送SDK"></a> 5. 項目中集成極光推送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及以后版本注冊可以這樣寫,也可以繼續用之前的注冊方式
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功能請添加此代碼并在初始化方法的advertisingIdentifier參數中填寫對應值
NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
// Required
// init Push
// notice: 2.1.5版本的SDK新增的注冊方法,改成可上報IDFA,如果沒有使用IDFA直接傳nil
// 如需繼續使用pushConfig.plist文件聲明appKey等配置內容,請依舊使用[JPUSHService setupWithOption:launchOptions]方式初始化。
[JPUSHService setupWithOption:launchOptions appKey:appKey
channel:nil
apsForProduction:isProduction
advertisingIdentifier:advertisingId];
}
- 部分參數說明:
1.
appKey
填寫管理Portal上創建應用后自動生成的AppKey值。請確保應用內配置的AppKey
與Portal
上創建應用后生成的AppKey
一致。
2.channel
指明應用程序包的下載渠道,為方便分渠道統計,具體值由你自行定義,如:App Store
。
3.apsForProduction1.3.1
版本新增,用于標識當前應用所使用的APNs
證書環境。
0 (默認值)表示采用的是開發證書,1 表示采用生產證書發布應用。
注:此字段的值要與Build Settings的Code Signing
配置的證書環境一致。
advertisingIdentifier
詳見關于IDFA。
5.3.3 注冊APNs成功并上報DeviceToken
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
/// Required - 注冊 DeviceToken
[JPUSHService registerDeviceToken:deviceToken];
}
5.3.4 實現注冊APNs失敗接口(可選)
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
//Optional
NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}
5.3.5 添加處理APNs通知回調方法
請在AppDelegate.m實現該回調方法并添加回調方法中的代碼
#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); // 需要執行這個方法,選擇是否提醒用戶,有Badge、Sound、Alert三種類型可以選擇設置
}
// 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(); // 系統要求執行這個方法
}
- (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 = "成功運行"></a> 6 成功運行
真機調試該項目,如果控制臺輸出以下日志則代表您已經集成成功。
2016-08-19 17:12:12.745823 219b28[1443:286814] | JPUSH | I - [JPUSHLogin]
----- login result -----
uid:5460310207
registrationID:171976fa8a8620a14a4
如果調試運行中遇到問題請參考:iOS SDK 調試指南
<a id = "極光推送后臺發送遠程推送測試"></a>7.極光推送后臺發送遠程推送測試
7.1 登錄極光推送,切換到控制臺,并點擊對應的應用,點擊推送按鈕,設置推送內容,并發送通知

7.2 選擇推送環境iOS開發環境,目標人群,發送時間。再點擊可選設置設置消息的具體內容。

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

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

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