前言
最近公司要求把維護(hù)期的項(xiàng)目都集成極光推送薪者,集成期間遇到一些小坑竿裂,特此在這總結(jié)玉吁!
極光推送能干嘛?
1.為 JPush Server 上報(bào) Device Token铛绰,免除開發(fā)者管理 Device Token 的麻煩
2.支持iOS APNs推送
3.前臺(tái)運(yùn)行時(shí)诈茧,可接收由JPush下發(fā)的(透?jìng)鞯模┳远x消息
4.靈活管理接收用戶:Tag(標(biāo)簽分組)、Alias(用戶別名)捂掰、RegistrationID(設(shè)備注冊(cè)ID)
知道能干嘛了那就開始動(dòng)手集成??
配push證書:
此步驟直接看極光的 文檔即可,寫得很詳細(xì)??
導(dǎo)入必要的框架
CFNetwork.framework
CoreFoundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
Security.framework
Xcode7需要的是libz.tbd敢会;Xcode7以下版本是libz.dylib
創(chuàng)建并配置PushConfig.plist文件
在你的工程中創(chuàng)建一個(gè)新的Property List文件,并將其命名為PushConfig.plist这嚣,文件所含字段如下:
CHANNEL
指明應(yīng)用程序包的下載渠道鸥昏,為方便分渠道統(tǒng)計(jì),具體值由你自行定義姐帚,如:App Store吏垮。
APP_KEY
填寫管理Portal上創(chuàng)建應(yīng)用后自動(dòng)生成的AppKey值。請(qǐng)確保應(yīng)用內(nèi)配置的 AppKey 與第1步在 Portal 上創(chuàng)建應(yīng)用后生成的 AppKey 一致。
APS_FOR_PRODUCTION
1.3.1版本新增膳汪,用于標(biāo)識(shí)當(dāng)前應(yīng)用所使用的APNs證書環(huán)境唯蝶。
0 (默認(rèn)值)表示采用的是開發(fā)證書,1 表示采用生產(chǎn)證書發(fā)布應(yīng)用遗嗽。
注:此字段的值要與Build Settings的Code Signing配置的證書環(huán)境一致粘我。
在1.2.2或之前版本的配置文件中,有 TEST_MODE 這個(gè)鍵痹换,新版的SDK不再使用征字,可以將它刪除。
核心代碼
首先在AppDelegate.m
導(dǎo)入#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 : 是你在極光推送申請(qǐng)下來的appKey Jchannel : 可以直接設(shè)置默認(rèn)值即可 Publish channel
[JPUSHService setupWithOption:launchOptions appKey:JAppKey
channel:Jchannel apsForProduction:NO]; //如果是生產(chǎn)環(huán)境應(yīng)該設(shè)置為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];
}
我們還能監(jiān)聽極光推送生命周期通知:
API里面提供了下面 5 種類型的通知:
extern NSString * const kJPFNetworkDidSetupNotification; // 建立連接
extern NSString * const kJPFNetworkDidCloseNotification; // 關(guān)閉連接
extern NSString * const kJPFNetworkDidRegisterNotification; // 注冊(cè)成功
extern NSString * const kJPFNetworkDidLoginNotification; // 登錄成功
溫馨提示:
Registration id 需要在執(zhí)行到kJPFNetworkDidLoginNotification的方法里獲取
extern NSString * const kJPFNetworkDidReceiveMessageNotification; // 收到自定義消息(非APNS)
其中娇豫,kJPFNetworkDidReceiveMessageNotification傳遞的數(shù)據(jù)可以通過NSNotification中的userInfo方法獲取匙姜,包括標(biāo)題、內(nèi)容冯痢、extras信息等
#### 使用方法
###### Tag(標(biāo)簽分組)& Alias(用戶別名)
//用于綁定Tag的 根據(jù)自己想要的Tag加入氮昧,值得注意的是這里Tag需要用到NSSet
[JPUSHService setTags:[NSSet set]callbackSelector:nil object:self];
//用于綁定Alias的 使用NSString 即可
[JPUSHService setAlias:@"" callbackSelector:nil object:self];
如果想要即要綁定Alias也要綁定Tag,必須使用以下方法,已被坑
//用于同時(shí)綁定Tag與Alias的
[JPUSHService setTags:[NSSet set] alias:@"" callbackSelector:nil target:self];
###### 一般在項(xiàng)目哪里綁定呢系羞?
我主要是在項(xiàng)目的登錄成功或者自動(dòng)登錄后郭计,使用用戶的唯一標(biāo)示進(jìn)行綁定,或者根據(jù)需求添加一些前綴
###### 去除綁定
用戶進(jìn)行退出登錄的方法里添加去除綁定即可椒振,值得注意的是用到即時(shí)通訊的話,被擠下線也要去除綁定梧乘,已被坑澎迎,貼代碼:
//沒有值就代表去除
[JPUSHService setTags:[NSSet set]callbackSelector:nil object:self];
[JPUSHService setAlias:@"" callbackSelector:nil object:self];
[JPUSHService setTags:[NSSet set] alias:@"" callbackSelector:nil target:self];
#### 測(cè)試是否集成成功
到極光[平臺(tái)](https://www.jpush.cn/push/apps/c8d9798cc63b93bf2c1ed834/push/notification/)測(cè)試推送:
![測(cè)試推送.jpg](http://upload-images.jianshu.io/upload_images/313852-ffaf1b475c5debb7.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
只要推送成功,剩下的由后臺(tái)根據(jù)Alias或者Tag來推送就可以了??
#### 補(bǔ)充
關(guān)于推送來的小紅點(diǎn)角標(biāo)选调,簡(jiǎn)稱badge夹供。默認(rèn)是極光推送過來一次角標(biāo)+1,這個(gè)值badge是由后臺(tái)推送過來的消息傳的值仁堪,但是當(dāng)用戶看了哮洽,角標(biāo)會(huì)默認(rèn)被清除,如果你沒有去告訴后臺(tái)的話弦聂,后臺(tái)下次推送過來鸟辅,你的badge顯示的值還是你上一次的值加一,那如何解決這個(gè)問題呢莺葫?
細(xì)心的開發(fā)者會(huì)去查看極光推送的API文檔匪凉,但是我覺得看文檔就有點(diǎn)麻煩了,所以我直接去看``JPUSHService.h``文件捺檬,所以我發(fā)現(xiàn)極光為這個(gè)問題提供了解決的方法
/*!
- @abstract 設(shè)置角標(biāo)(到服務(wù)器)
- @param value 新的值. 會(huì)覆蓋服務(wù)器上保存的值(這個(gè)用戶)
- @discussion 本接口不會(huì)改變應(yīng)用本地的角標(biāo)值.
- 本地仍須調(diào)用 UIApplication:setApplicationIconBadgeNumber 函數(shù)來設(shè)置腳標(biāo).
- 本接口用于配合 JPush 提供的服務(wù)器端角標(biāo)功能.
- 該功能解決的問題是, 服務(wù)器端推送 APNs 時(shí), 并不知道客戶端原來已經(jīng)存在的角標(biāo)是多少, 指定一個(gè)固定的數(shù)字不太合理.
- JPush 服務(wù)器端腳標(biāo)功能提供:
- 通過本 API 把當(dāng)前客戶端(當(dāng)前這個(gè)用戶的) 的實(shí)際 badge 設(shè)置到服務(wù)器端保存起來;
- 調(diào)用服務(wù)器端 API 發(fā) APNs 時(shí)(通常這個(gè)調(diào)用是批量針對(duì)大量用戶),
- 使用 "+1" 的語(yǔ)義, 來表達(dá)需要基于目標(biāo)用戶實(shí)際的 badge 值(保存的) +1 來下發(fā)通知時(shí)帶上新的 badge 值;
*/
- (BOOL)setBadge:(NSInteger)value;
而且我還發(fā)現(xiàn)極光推送也能收集Crash日志,之前只知道友盟與聽云
/*!
- @abstract 開啟Crash日志收集
- @discussion 默認(rèn)是關(guān)閉狀態(tài).
*/
- (void)crashLogON;
如何改變推送過來的提示音呢再层?
只需要讓服務(wù)端設(shè)置sound字段就可以了。
>iOS 通知聲音 (sound)
APNs通知,通過這個(gè)字段指定聲音聂受。默認(rèn)為default蒿秦,即系統(tǒng)默認(rèn)聲音。
如果設(shè)置為空值蛋济,則為靜音渤早。
如果設(shè)置為特殊的名稱,則需要你的App里配置了該聲音才可以正常瘫俊。
#### [JPushSDK資源下載](http://docs.jpush.io/resources/)