說一下最近項目里遇到的極光推送:
具體步驟:
一:首先需要一個推送的p12 證書:我是傳送門(創建推送證書)
但是我在導出aps.證書制作p12的時候,我這邊在系統鑰匙串訪問里面產生了兩個名字是一樣時間不一樣的證書,要區分生產的和測試,否則上傳到極光會不通過,
二:登錄極光賬號(我是登錄傳送門),創建應用并上傳p12證書,APNS證書文件顯示 已驗證 說明通過,其他則不能正確接通極光推送
三:極光的官網集成文檔(我是官網傳送門)----->里面創建應用,集成SDK都很詳細,或者在下載的sdk包里面有一個 iOS+SDK+Integration+Guide.pdf 里面寫的比官網看著清楚些,在AppDelegate代碼里做一些app在前臺的時候的通知處理,在前臺的時候就不通知,只做彈窗提示,我的測試代碼如下(我這邊沒做IDFA功能):
```
#import "AppDelegate.h"
// 引 JPush功能所需頭文件
#import "JPUSHService.h"
// iOS10注冊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) {// 不是空 就是推送點擊 否則是圖標啟動? ? ? ??
NSDictionary* remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];? ? ? ?
?if ([[UIDevice currentDevice].systemVersion floatValue] < 10.0) {? ??
? ? ? ? // iOS 10 不必走此方法? ? ? ? ? ?
? ? ? [self reciveNotification:remoteNotification];// 處理推送跳轉方法 詳見下方? ? ? ?
?}? ?
?}? ? ? ??
//Required? ? //notice: 3.0.0及以后版本注冊可以這樣寫,也可以繼續 之前的注冊 式? ? JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];? ? ? ?
?entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;? ? ? [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];? ? ? ?
?/* Optional? ? 獲取IDFA? ? 如需使 IDFA功能請添加此代碼并在初始化 法的advertisingIdentifier參數中填寫對應值? ? 需要導入
#importNSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
Required
init Push
notice: 2.1.5版本的SDK新增的注冊 法,改成可上報IDFA,如果沒有使 IDFA直接傳nil
如需繼續使 pushConfig.plist 件聲明appKey等配置內容,請依舊使 [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);
}
}];
//開啟Crash日志收集
[JPUSHService crashLogON];
return YES;
}
// Required - 注冊 DeviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[JPUSHService registerDeviceToken:deviceToken];
}
//Optional 注冊失敗
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"注冊失敗: %@", error);
}
//iOS 7 及以上10以下 收到推送及點擊處理
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[JPUSHService handleRemoteNotification:userInfo];
if (application.applicationState == UIApplicationStateActive) {
NSLog(@"userInfo----%@",userInfo);
// 前臺收到推送出現彈窗
[self reciveNotificationAlertShow:@"userInfo"];
}else{
// 處于后臺 的點擊
[self reciveNotification:userInfo];
}
completionHandler(UIBackgroundFetchResultNewData);
}
#pragma mark- JPUSHRegisterDelegate
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#pragma mark iOS 10 前臺收到通知(遠程推送 和 本地通知)
- (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處理遠程推送
[JPUSHService handleRemoteNotification:userInfo];
NSDictionary * userInfo = notification.request.content.userInfo;
UNNotificationRequest *request = notification.request; // 收到推送的請求
UNNotificationContent *content = request.content; // 收到推送的消息內容
//前臺接收彈框
NSLog(@"在前臺處理本地通知----iOS10 收到遠程通知:%@", userInfo);
[self reciveNotificationAlertShow:content.body];
}else{
// iOS10處理本地通知
// 需要執行這個方法,選擇是否提醒用戶,有Badge、Sound、Alert三種類型可以選擇設置
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}
}
// 程序運行于后臺 或者被殺死 點擊推送通知 都會走這個方法
- (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(@"在后臺臺處理通知----iOS10 收到遠程通知:%@", userInfo);
[self reciveNotification:userInfo];
}else{
/// 前臺運行時收到推送 轉的本地通知,如果沒有查看,而是退到后臺 或殺死程序,點擊了推送到前臺push處理==============
/// 前臺運行時 轉的本地通知 直接點擊也走這個方法
[self reciveNotification:userInfo];
}
completionHandler();? // 系統要求執行這個方法
}
#endif
//當程序從后臺將要重新回到前臺時候調用 把角標的 1 去掉
- (void)applicationWillEnterForeground:(UIApplication *)application {
[application setApplicationIconBadgeNumber:0];
}
// APP殺死和后臺時 推送點擊的跳轉處理
- (void)reciveNotification:(NSDictionary *)pushDict{
NSLog(@" 推送點擊的跳轉處理----%@",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 處于前臺的時候 推送通知點擊創建alertview? 點擊跳轉方法和殺死 后臺運行狀態處理方法相同
- (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 獲取當前的停留的VC用來實現任意頁面跳轉到指定頁面
- (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;
}
}