首先用cocoapods導(dǎo)入 pod 'JPush'
然后在AppDelegate引用
// 引入JPush功能所需頭文件
#import "JPUSHService.h"
// iOS10注冊(cè)APNs所需頭文件
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif
// 如果需要使用idfa功能所需要引入的頭文件(可選)
#import <AdSupport/AdSupport.h>
設(shè)置代理<JPUSHRegisterDelegate>
然后注冊(cè)JPush
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//程序殺死狀態(tài)下從外部進(jìn)入app 獲取到遠(yuǎn)程推送消息 跳轉(zhuǎn)指定頁(yè)面的做法
if (launchOptions) {
// 獲取推送通知定義的userinfo
NSDictionary * remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (remoteNotification) {
roomid = remoteNotification[@"roomId"];
nickName = remoteNotification[@"senderNickName"];
[self setupMainViewController];
}else{
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
}
//notice: 3.0.0及以后版本注冊(cè)可以這樣寫,也可以繼續(xù)用之前的注冊(cè)方式
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];
// Optional
// 獲取IDFA
// 如需使用IDFA功能請(qǐng)?zhí)砑哟舜a并在初始化方法的advertisingIdentifier參數(shù)中填寫對(duì)應(yīng)值
NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
// Required // init Push // notice: 2.1.5版本的SDK新增的注冊(cè)方法授翻,改成可上報(bào)IDFA或悲,如果沒有使用IDFA直接傳nil
// 如需繼續(xù)使用pushConfig.plist文件聲明appKey等配置內(nèi)容镐作,請(qǐng)依舊使用[JPUSHService setupWithOption:launchOptions]方式初始化。
[JPUSHService setupWithOption:launchOptions appKey:@"appKey" channel:@"AppStore" apsForProduction:0 advertisingIdentifier:advertisingId];
return YES;
}
pragma mark - iOS10 收到通知(本地和遠(yuǎn)端) UNUserNotificationCenterDelegate
//App處于前臺(tái)接收通知時(shí) 只會(huì)是app處于前臺(tái)狀態(tài) 前臺(tái)狀態(tài) and 前臺(tái)狀態(tài)下才會(huì)走隆箩,后臺(tái)模式下是不會(huì)走這里的
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
//收到推送的請(qǐng)求
UNNotificationRequest *request = notification.request;
//收到推送的內(nèi)容
UNNotificationContent *content = request.content;
//收到用戶的基本信息
NSDictionary *userInfo = content.userInfo;
//收到推送消息的角標(biāo)
NSNumber *badge = content.badge;
//收到推送消息body
NSString *body = content.body;
//推送消息的聲音
UNNotificationSound *sound = content.sound;
// 推送消息的副標(biāo)題
NSString *subtitle = content.subtitle;
// 推送消息的標(biāo)題
NSString *title = content.title;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
//此處省略一萬行需求代碼该贾。。捌臊。杨蛋。。理澎。
// NSLog(@"iOS10 收到遠(yuǎn)程通知:%@",userInfo);
}else {
// 判斷為本地通知
//此處省略一萬行需求代碼逞力。。糠爬。寇荧。。执隧。
NSLog(@"iOS10 收到本地通知:{\\\\nbody:%@揩抡,\\\\ntitle:%@,\\\\nsubtitle:%@,\\\\nbadge:%@,\\\\nsound:%@镀琉,\\\\nuserInfo:%@\\\\n}",body,title,subtitle,badge,sound,userInfo); }
// 需要執(zhí)行這個(gè)方法峦嗤,選擇是否提醒用戶,有Badge屋摔、Sound烁设、Alert三種類型可以設(shè)置
completionHandler(UNNotificationPresentationOptionBadge| UNNotificationPresentationOptionSound| UNNotificationPresentationOptionAlert); }
App通知的點(diǎn)擊事件 下面這個(gè)代理方法,
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
//收到推送的請(qǐng)求
UNNotificationRequest *request = response.notification.request;
//收到推送的內(nèi)容
UNNotificationContent *content = request.content;
//收到用戶的基本信息
NSDictionary *userInfo = content.userInfo;
//收到推送消息的角標(biāo)
NSNumber *badge = content.badge;
//收到推送消息body
NSString *body = content.body;
//推送消息的聲音
UNNotificationSound *sound = content.sound;
// 推送消息的副標(biāo)題
NSString *subtitle = content.subtitle;
// 推送消息的標(biāo)題
NSString *title = content.title;
if([response.notification.request.trigger isKindOfClass:
[UNPushNotificationTrigger class]]) {
NSLog(@"iOS10 收到遠(yuǎn)程通知:%@",userInfo);
//此處省略一萬行需求代碼钓试。装黑。。弓熏。恋谭。。
}else {
// 判斷為本地通知
//此處省略一萬行需求代碼硝烂。箕别。。滞谢。串稀。。
NSLog(@"iOS10 收到本地通知:{\\\\nbody:%@狮杨,\\\\ntitle:%@,\\\\nsubtitle:%@,\\\\nbadge:%@母截,\\\\nsound:%@,\\\\nuserInfo:%@\\\\n}",body,title,subtitle,badge,sound,userInfo);
}
completionHandler(); // 系統(tǒng)要求執(zhí)行這個(gè)方法
}
pragma mark -iOS 10之前收到通知
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"iOS6及以下系統(tǒng)橄教,收到通知:%@", userInfo);
[JPUSHService handleRemoteNotification:userInfo];
//此處省略一萬行需求代碼清寇。喘漏。。华烟。翩迈。。
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"iOS7及以上系統(tǒng)盔夜,收到通知:%@", userInfo);
[JPUSHService handleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
//此處省略一萬行需求代碼负饲。。喂链。返十。。椭微。
}
appKey 在極光獲取
channel 指明應(yīng)用程序包的下載渠道,為方便分渠道統(tǒng)計(jì),具體值由你自行定義
apsForProduction 0 (默認(rèn)值)表示采用的是開發(fā)證書洞坑,1 表示采用生產(chǎn)證書發(fā)布應(yīng)用
advertisingIdentifier 廣告標(biāo)識(shí)符吧好像 記不太清了 用處不大
注冊(cè)APNs成功并上報(bào)DeviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// Required - 注冊(cè) DeviceToken
[JPUSHService registerDeviceToken:deviceToken];
//這里應(yīng)該將獲取的registrationID 和服務(wù)器存儲(chǔ)的用戶綁定 來實(shí)現(xiàn)定點(diǎn)推送
[JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) { NSLog(@"%@", registrationID); }];
}
實(shí)現(xiàn)注冊(cè)APNs失敗接口(可選)
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
//Optional
NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}
添加處理APNs通知回調(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è)方法
}
#pragma mark -iOS 10之前收到通知
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"iOS6及以下系統(tǒng)瓢剿,收到通知:%@", userInfo);
[JPUSHService handleRemoteNotification:userInfo];
//此處省略一萬行需求代碼逢慌。悠轩。间狂。。火架。鉴象。
}
注冊(cè)
成功運(yùn)行
真機(jī)調(diào)試該項(xiàng)目,如果控制臺(tái)輸出以下日志則代表您已經(jīng)集成成功何鸡。
2016-08-19 17:12:12.745823 219b28[1443:286814] | JPUSH | I - [JPUSHLogin]
----- login result -----
uid:5460310207
registrationID:171976fa8a8620a14a4
配置證書
創(chuàng)建 App ID纺弊,填寫 App ID 的 NAME 和 Bundle ID(如果 ID 已經(jīng)存在可以直接跳過此步驟)。
為 App 開啟 Push Notification 功能骡男。如果是已經(jīng)創(chuàng)建的 App ID 也可以通過設(shè)置開啟 Push Notification 功能淆游。
如果你之前沒有創(chuàng)建過 Push 證書或者是要重新創(chuàng)建一個(gè)新的,請(qǐng)?jiān)谧C書列表下面新建隔盛。
新建證書需要注意選擇 APNs 證書種類犹菱。如圖 APNs 證書有開發(fā)(Development)和生產(chǎn)(Production)兩種。
注:開發(fā)證書用于開發(fā)調(diào)試使用吮炕;生產(chǎn)證書既能用于開發(fā)調(diào)試腊脱,也可用于產(chǎn)品發(fā)布。此處我們選擇生產(chǎn)證書為例龙亲。
點(diǎn)擊 "Continue", 之后選擇該證書準(zhǔn)備綁定的 AppID陕凹。
擊 “Continue”悍抑,會(huì)進(jìn)入 CSR 說明界面。
再點(diǎn) “Continue” 會(huì)讓你上傳 CSR 文件杜耙。( CSR 文件會(huì)在下一步創(chuàng)建)
打開系統(tǒng)自帶的 KeychainAccess 創(chuàng)建 Certificate Signing Request搜骡。如下圖操作:
填寫“用戶郵箱”和“常用名稱” ,并選擇“存儲(chǔ)到磁盤”佑女,證書文件后綴為 .certSigningRequest 浆兰。
回到瀏覽器中 CSR 上傳頁(yè)面,上傳剛剛生成的后綴為 .certSigningRequest 的文件珊豹。
生成證書成功后簸呈,點(diǎn)擊 “Download” 按鈕把證書下載下來,是后綴為 .cer 的文件店茶。
雙擊證書后蜕便,會(huì)在“KeychainAccess”中打開,選擇左側(cè)“鑰匙串”列表中“登錄”贩幻,以及“種類”列表中“我的證書”轿腺,找到剛才下載的證書,并導(dǎo)出為 .p12 文件丛楚。如下圖:
在極光控制臺(tái)上族壳,進(jìn)入你應(yīng)用的應(yīng)用設(shè)置中 iOS 的鑒權(quán)方式選擇 “證書”,上傳剛才導(dǎo)出的 .p12 證書趣些。極光會(huì)在后臺(tái)為你的應(yīng)用進(jìn)行鑒權(quán)仿荆。
注意事項(xiàng)
開發(fā)環(huán)境測(cè)試
在對(duì) JPush iOS 開發(fā)環(huán)境進(jìn)行測(cè)試前,請(qǐng)確保 3 個(gè)統(tǒng)一:
App 是開發(fā)環(huán)境打包(開發(fā)證書 Development)
上傳了開發(fā)證書并驗(yàn)證通過
發(fā)布環(huán)境測(cè)試
在對(duì) JPush iOS 生產(chǎn)環(huán)境進(jìn)行測(cè)試前坏平,請(qǐng)確保 3 個(gè)統(tǒng)一:
App 是 ad-hoc 打包或者App Store 版本(發(fā)布證書 Production)
上傳了發(fā)布證書并驗(yàn)證通過
可能存在的其他問題
收到消息不夠穩(wěn)定
JPush iOS 是對(duì)原生官方 APNs 推送的一個(gè)補(bǔ)充拢操,是對(duì)其的封裝,以幫助開發(fā)人員更輕松地使用 APNs 舶替。
由于APNs 本身不承諾保證消息到達(dá)令境,客戶端網(wǎng)絡(luò)與服務(wù)器端的連通性,對(duì) APNs 是否及時(shí)接收到消息具有很大的影響顾瞪。