最近公司要求把維護期的項目都集成極光推送,集成期間遇到一些小坑,特此在這總結!
極光推送能干嘛?
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方法貼上核心代碼:
//極光推送 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
之後還需要加入以下方法:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // Required [JPUSHService registerDeviceToken:deviceToken]; }
-(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 種類型的通知:
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(用戶別名)
//用於綁定Tag的 根據自己想要的Tag加入,值得注意的是這裡Tag需要用到NSSet [JPUSHService setTags:[NSSet set]callbackSelector:nil object:self]; //用於綁定Alias的 使用NSString 即可 [JPUSHService setAlias:@"" callbackSelector:nil object:self];
如果想要即要綁定Alias也要綁定Tag,必須使用以下方法,已被坑
//用於同時綁定Tag與Alias的 [JPUSHService setTags:[NSSet set] alias:@"" callbackSelector:nil target:self];
一般在項目哪裡綁定呢?
我主要是在項目的登錄成功或者自動登錄後,使用用戶的唯一標示進行綁定,或者根據需求添加一些前綴
去除綁定
用戶進行退出登錄的方法裡添加去除綁定即可,值得注意的是用到即時通訊的話,被擠下線也要去除綁定,已被坑,貼代碼:
//沒有值就代表去除 [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來推送就可以了????
JPushSDK資源下載