說(shuō)一下最近項(xiàng)目里遇到的極光推送:
具體步驟:
一:首先需要一個(gè)推送的p12 證書(shū):我是傳送門(mén)(創(chuàng)建推送證書(shū))
但是我在導(dǎo)出aps.證書(shū)制作p12的時(shí)候,我這邊在系統(tǒng)鑰匙串訪問(wèn)里面產(chǎn)生了兩個(gè)名字是一樣時(shí)間不一樣的證書(shū),要區(qū)分生產(chǎn)的和測(cè)試,否則上傳到極光會(huì)不通過(guò),
二:登錄極光賬號(hào)(我是登錄傳送門(mén)),創(chuàng)建應(yīng)用并上傳p12證書(shū),APNS證書(shū)文件顯示 已驗(yàn)證 說(shuō)明通過(guò),其他則不能正確接通極光推送
三:極光的官網(wǎng)集成文檔(我是官網(wǎng)傳送門(mén))----->里面創(chuàng)建應(yīng)用,集成SDK都很詳細(xì),或者在下載的sdk包里面有一個(gè) iOS+SDK+Integration+Guide.pdf 里面寫(xiě)的比官網(wǎng)看著清楚些,在AppDelegate代碼里做一些app在前臺(tái)的時(shí)候的通知處理,在前臺(tái)的時(shí)候就不通知,只做彈窗提示,我的測(cè)試代碼如下(我這邊沒(méi)做IDFA功能):
```
#import "AppDelegate.h"
// 引 JPush功能所需頭文件
#import "JPUSHService.h"
// iOS10注冊(cè)APNS所需頭文件
#ifdef NSFoundationVersionNumber_iOS_9_x_Max?
#import <UserNotifications/Usernofications.h>
#endif
```
// 如果需要使 idfa功能所需要引 的頭 件(可選)#import<AdSupport/AdSupport.h>
#import "ViewController.h"
#import "TwoViewController.h"
@interface AppDelegate ()<JPUSHRegisterDelegate>
@end
static NSString *appKey = @"3bd1eb35caec54f9c91a493b";
static NSString *channel = @"App Store";
static BOOL isProduction = FALSE;
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {? ? ? ??
if (launchOptions !=nil) {// 不是空 就是推送點(diǎn)擊 否則是圖標(biāo)啟動(dòng)? ? ? ??
NSDictionary* remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];? ? ? ?
?if ([[UIDevice currentDevice].systemVersion floatValue] < 10.0) {? ??
? ? ? ? // iOS 10 不必走此方法? ? ? ? ? ?
? ? ? [self reciveNotification:remoteNotification];// 處理推送跳轉(zhuǎn)方法 詳見(jiàn)下方? ? ? ?
?}? ?
?}? ? ? ??
//Required? ? //notice: 3.0.0及以后版本注冊(cè)可以這樣寫(xiě),也可以繼續(xù) 之前的注冊(cè) 式? ? JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];? ? ? ?
?entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;? ? ? [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];? ? ? ?
?/* Optional? ? 獲取IDFA? ? 如需使 IDFA功能請(qǐng)?zhí)砑哟舜a并在初始化 法的advertisingIdentifier參數(shù)中填寫(xiě)對(duì)應(yīng)值? ? 需要導(dǎo)入
#importNSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
Required
init Push
notice: 2.1.5版本的SDK新增的注冊(cè) 法,改成可上報(bào)IDFA,如果沒(méi)有使 IDFA直接傳nil
如需繼續(xù)使 pushConfig.plist 件聲明appKey等配置內(nèi)容,請(qǐng)依舊使 [JPUSHService setupWithOption:launchOptions] 式初始化。
如不需要使用IDFA,advertisingIdentifier 可為nil
*/
[JPUSHService setupWithOption:launchOptions appKey:appKey
channel:channel
apsForProduction:isProduction
advertisingIdentifier:nil];
[JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
if(resCode == 0){
NSLog(@"registrationID獲取成功:%@",registrationID);
}
else{
NSLog(@"registrationID獲取失敗,code:%d",resCode);
}
}];
//開(kāi)啟Crash日志收集
[JPUSHService crashLogON];
return YES;
}
// Required - 注冊(cè) DeviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[JPUSHService registerDeviceToken:deviceToken];
}
//Optional 注冊(cè)失敗
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"注冊(cè)失敗: %@", error);
}
//iOS 7 及以上10以下 收到推送及點(diǎn)擊處理
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[JPUSHService handleRemoteNotification:userInfo];
if (application.applicationState == UIApplicationStateActive) {
NSLog(@"userInfo----%@",userInfo);
// 前臺(tái)收到推送出現(xiàn)彈窗
[self reciveNotificationAlertShow:@"userInfo"];
}else{
// 處于后臺(tái) 的點(diǎn)擊
[self reciveNotification:userInfo];
}
completionHandler(UIBackgroundFetchResultNewData);
}
#pragma mark- JPUSHRegisterDelegate
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#pragma mark iOS 10 前臺(tái)收到通知(遠(yuǎn)程推送 和 本地通知)
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
NSDictionary * userInfo = notification.request.content.userInfo;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
// iOS10處理遠(yuǎn)程推送
[JPUSHService handleRemoteNotification:userInfo];
NSDictionary * userInfo = notification.request.content.userInfo;
UNNotificationRequest *request = notification.request; // 收到推送的請(qǐng)求
UNNotificationContent *content = request.content; // 收到推送的消息內(nèi)容
//前臺(tái)接收彈框
NSLog(@"在前臺(tái)處理本地通知----iOS10 收到遠(yuǎn)程通知:%@", userInfo);
[self reciveNotificationAlertShow:content.body];
}else{
// iOS10處理本地通知
// 需要執(zhí)行這個(gè)方法,選擇是否提醒用戶,有Badge、Sound、Alert三種類型可以選擇設(shè)置
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}
}
// 程序運(yùn)行于后臺(tái) 或者被殺死 點(diǎn)擊推送通知 都會(huì)走這個(gè)方法
- (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];
NSLog(@"在后臺(tái)臺(tái)處理通知----iOS10 收到遠(yuǎn)程通知:%@", userInfo);
[self reciveNotification:userInfo];
}else{
/// 前臺(tái)運(yùn)行時(shí)收到推送 轉(zhuǎn)的本地通知,如果沒(méi)有查看,而是退到后臺(tái) 或殺死程序,點(diǎn)擊了推送到前臺(tái)push處理==============
/// 前臺(tái)運(yùn)行時(shí) 轉(zhuǎn)的本地通知 直接點(diǎn)擊也走這個(gè)方法
[self reciveNotification:userInfo];
}
completionHandler();? // 系統(tǒng)要求執(zhí)行這個(gè)方法
}
#endif
//當(dāng)程序從后臺(tái)將要重新回到前臺(tái)時(shí)候調(diào)用 把角標(biāo)的 1 去掉
- (void)applicationWillEnterForeground:(UIApplication *)application {
[application setApplicationIconBadgeNumber:0];
}
// APP殺死和后臺(tái)時(shí) 推送點(diǎn)擊的跳轉(zhuǎn)處理
- (void)reciveNotification:(NSDictionary *)pushDict{
NSLog(@" 推送點(diǎn)擊的跳轉(zhuǎn)處理----%@",pushDict);
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
TwoViewController *twoVC = [mainStoryboard instantiateViewControllerWithIdentifier:@"TwoViewController"];
twoVC.saveDict = pushDict;
[[self topViewController].navigationController pushViewController:twoVC animated:YES];
}
// APP 處于前臺(tái)的時(shí)候 推送通知點(diǎn)擊創(chuàng)建alertview? 點(diǎn)擊跳轉(zhuǎn)方法和殺死 后臺(tái)運(yùn)行狀態(tài)處理方法相同
- (void)reciveNotificationAlertShow:(NSString *)message{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"溫馨提示" message:message preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *goAction = [UIAlertAction actionWithTitle:@"查看" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
TwoViewController *twoVC = [mainStoryboard instantiateViewControllerWithIdentifier:@"TwoViewController"];
twoVC.backStr = message;
[[self topViewController].navigationController pushViewController:twoVC animated:YES];
}];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alertController addAction:goAction];
[alertController addAction:cancelAction];
[[self topViewController] presentViewController:alertController animated:YES completion:nil];
}
#pragma mark 獲取當(dāng)前的停留的VC用來(lái)實(shí)現(xiàn)任意頁(yè)面跳轉(zhuǎn)到指定頁(yè)面
- (UIViewController*)topViewController
{
return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}
- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController
{
if ([rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController *tabBarController = (UITabBarController *)rootViewController;
return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
} else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController*)rootViewController;
return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
} else if (rootViewController.presentedViewController) {
UIViewController* presentedViewController = rootViewController.presentedViewController;
return [self topViewControllerWithRootViewController:presentedViewController];
} else {
return rootViewController;
}
}