原文地址:http://www.cocoachina.com/ios/20160226/15366.html
最近公司要求把維護期的項目都集成極光推送,集成期間遇到一些小坑,特此在這總結!
極光推送能幹嘛?
1.爲 JPush Server 上報 Device Token,免除開發者管理 Device Token 的麻煩
2.支持iOS APNs推送
3.前臺運行時,可接收由JPush下發的(透傳的)自定義消息
4.靈活管理接收用戶:Tag(標籤分組)、Alias(用戶別名)、RegistrationID(設備註冊ID)
知道能幹嘛了那就開始動手集成????
配push證書:
此步驟直接看極光的文檔即可,寫得很詳細。
導入必要的框架
-
CFNetwork.framework
-
CoreFoundation.framework
-
CoreTelephony.framework
-
SystemConfiguration.framework
-
CoreGraphics.framework
-
Foundation.framework
-
UIKit.framework
-
Security.framework
-
Xcode7需要的是libz.tbd;Xcode7以下版本是libz.dylib
創建並配置PushConfig.plist文件
在你的工程中創建一個新的Property List文件,並將其命名爲PushConfig.plist,文件所含字段如下:
CHANNEL:指明應用程序包的下載渠道,爲方便分渠道統計,具體值由你自行定義,如:App Store。
APP_KEY:填寫管理Portal上創建應用後自動生成的AppKey值。請確保應用內配置的 AppKey 與第1步在 Portal 上創建應用後生成的 AppKey 一致。
APS_FOR_PRODUCTION
1.3.1版本新增,用於標識當前應用所使用的APNs證書環境。
0 (默認值)表示採用的是開發證書,1 表示採用生產證書發佈應用。
注:此字段的值要與Build Settings的Code Signing配置的證書環境一致。
在1.2.2或之前版本的配置文件中,有 TEST_MODE 這個鍵,新版的SDK不再使用,可以將它刪除。
核心代碼
首先在AppDelegate.m 導入#import "JPUSHService.h"
~didFinishLaunchingWithOptions方法貼上核心代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//極光推送 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]; } //JAppKey : 是你在極光推送申請下來的appKey Jchannel : 可以直接設置默認值即可 Publish channel [JPUSHService setupWithOption:launchOptions appKey:JAppKey channel:Jchannel apsForProduction:NO]; //如果是生產環境應該設置爲YES |
之後還需要加入以下方法:
1
2
3
|
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // Required [JPUSHService registerDeviceToken:deviceToken]; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ NSString *alert = [[userInfo objectForKey:@ "aps" ] objectForKey:@ "alert" ]; if (application.applicationState == UIApplicationStateActive) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@ "推送消息" message:alert delegate:self cancelButtonTitle:@ "OK" otherButtonTitles:nil]; [alertView show]; } [application setApplicationIconBadgeNumber:0]; [JPUSHService handleRemoteNotification:userInfo]; } |
我們還能監聽極光推送生命週期通知。API裏面提供了下面 5 種類型的通知:
API裏面提供了下面 5 種類型的通知:
1
2
3
4
5
6
7
8
|
extern NSString * const kJPFNetworkDidSetupNotification; // 建立連接 extern NSString * const kJPFNetworkDidCloseNotification; // 關閉連接 extern NSString * const kJPFNetworkDidRegisterNotification; // 註冊成功 extern NSString * const kJPFNetworkDidLoginNotification; // 登錄成功 溫馨提示: Registration id 需要在執行到kJPFNetworkDidLoginNotification的方法裏獲取 extern NSString * const kJPFNetworkDidReceiveMessageNotification; // 收到自定義消息(非APNS) 其中,kJPFNetworkDidReceiveMessageNotification傳遞的數據可以通過NSNotification中的userInfo方法獲取,包括標題、內容、extras信息等 |
使用方法
Tag(標籤分組)& Alias(用戶別名)
1
2
3
4
|
//用於綁定Tag的 根據自己想要的Tag加入,值得注意的是這裏Tag需要用到NSSet [JPUSHService setTags:[NSSet set]callbackSelector:nil object:self]; //用於綁定Alias的 使用NSString 即可 [JPUSHService setAlias:@ "" callbackSelector:nil object:self]; |
如果想要即要綁定Alias也要綁定Tag,必須使用以下方法,已被坑
1
2
|
//用於同時綁定Tag與Alias的 [JPUSHService setTags:[NSSet set] alias:@ "" callbackSelector:nil target:self]; |
一般在項目哪裏綁定呢?
我主要是在項目的登錄成功或者自動登錄後,使用用戶的唯一標示進行綁定,或者根據需求添加一些前綴
去除綁定
用戶進行退出登錄的方法裏添加去除綁定即可,值得注意的是用到即時通訊的話,被擠下線也要去除綁定,已被坑,貼代碼:
1
2
3
4
|
//沒有值就代表去除 [JPUSHService setTags:[NSSet set]callbackSelector:nil object:self]; [JPUSHService setAlias:@ "" callbackSelector:nil object:self]; [JPUSHService setTags:[NSSet set] alias:@ "" callbackSelector:nil target:self]; |
測試是否集成成功。到極光平臺測試推送:
只要推送成功,剩下的由後臺根據Alias或者Tag來推送就可以了????