前言
最近公司項目在接入信鴿推送功能,詳細記錄下整個過程。。。
一,信鴿後臺創建iOS應用
- 註冊信鴿推送開發賬號,並登陸;
- 登錄成功後,右上角“個人中心”,下拉列表點擊“應用列表”創建iOS應用。
選擇平臺
填寫配置(證書可以暫時不上傳,後面補填即可)
應用創建完成
應用配置(證書)
二,APNs推送證書製作並上傳至信鴿後臺(開發證書,生產證書)
參考信鴿官方文檔 iOS推送證書說明
三,下載官方SDK
四,配置工程
參考信鴿文檔 iOS集成接入指南
注意:
checkTargetOtherLinkFlagForObjc報錯,是因爲build setting中,Other link flags未添加-ObjC
參考文章
iOS Bug --- 信鴿推送報錯:+[NSObject checkTargetOtherLinkFlagForObjc]: unrecognized selector sent to ......
五,主要代碼
- 引入頭文件,並遵守協議
#import "XGPush.h" #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 #import <UserNotifications/UserNotifications.h> #endif
@interface AppDelegate ()<XGPushDelegate> @end
- 註冊蘋果推送服務
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self registerAPNS]; } - (void)registerAPNS { float sysVer = [[[UIDevice currentDevice] systemVersion] floatValue]; #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 if (sysVer >= 10) { // iOS 10 [self registerPush10]; #endif if (sysVer < 8) { // before iOS 8 [self registerPushBefore8]; } else { // iOS 8-9 [self registerPush8to9]; } } - (void)registerPush10{ #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 //請求通知權限,本地和遠程公用 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted) { //請求成功 }else{ //請求失敗 } }]; //設置通知的代理 center.delegate = self; //註冊遠程通知 [[UIApplication sharedApplication] registerForRemoteNotifications]; #endif } - (void)registerPush8to9{ UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings]; //註冊遠程通知 [[UIApplication sharedApplication] registerForRemoteNotifications]; } - (void)registerPushBefore8{ [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; }
- 啓動信鴿推送服務
通過使用在信鴿官網註冊的應用的信息,啓動信鴿推送服務,參數說明如下:
appID:通過前臺申請的應用 ID, 即 Access ID
appKey: 通過前臺申請的 appKey,即 Access Key
delegate:回調對象
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //開啓debug模式,打印log信息 [[XGPush defaultManager] setEnableDebug:YES]; //初始化信鴿 [[XGPush defaultManager] startXGWithAppID:2200319067 appKey:@"I89PBJ5G62KU" delegate:self]; //角標設置爲0 [[XGPush defaultManager] setXgApplicationBadgeNumber:0]; //爲了更好的瞭解每一條推送消息的運營效果,需要將用戶對消息的行爲上報 [[XGPush defaultManager] reportXGNotificationInfo:launchOptions]; }
判斷程序是不是由推送打開
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (launchOptions) { self.isLaunchedByNotification = YES; NSDictionary *pushNotificationKey = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; [self performSelector:@selector(receiveRemoteNotificationWithUserInfo:) withObject:pushNotificationKey afterDelay:1.0]; }else{ self.isLaunchedByNotification = NO; } } //可以通過launchOptions這個參數是否爲空來判斷程序是否是點擊推送消息啓動了應用。launchOptions有幾個key: //UIApplicationLaunchOptionsRemoteNotificationKey返回一個遠程推送的userInfo字典類型參數; //UIApplicationLaunchOptionsLocalNotificationKey返回一個UILocalNotification對象; //receiveRemoteNotificationWithUserInfo:這個方法用來處理接收到的通知,如通過推送過來的userInfo中的內容跳轉不同的界面;
- 註冊信鴿
在V3.2.0中註冊信鴿是在 SDK內部做的,項目中可以通過下面方法獲取到註冊的deviceToken ,一般這個deviceToken要上傳到服務端,然後服務端通過deviceToken發送推送消息。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { //將來需要將此Token上傳給後臺服務器 NSString *XGPushtokenStr = [[XGPushTokenManager defaultTokenManager] deviceTokenString]; NSLog(@"XGPushtokenStr===>%@",XGPushtokenStr); }
**********************************************************************************************************************************
- iOS10之前通知的處理方法(2個)
/** 在iOS10 以前 收到推送分爲下面兩種形式,如果有方法1,方法2,方法1就不會執行 */ //iOS 3-10 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ NSLog(@"%s======》",__func__); NSString *zero =[[[userInfo objectForKey:@"aps"] objectForKey:@"alert"] objectForKey:@"body"]; if (application.applicationState == UIApplicationStateActive) { [self showAlertViewWithTitle:@"新消息提示" Message:zero ConfirmTitle:@"確定" CancelTitle:nil]; } [self receiveRemoteNotificationWithUserInfo:userInfo]; }
/** iOS7 + iOS10之前,接收遠程通知時,不管在前臺、後臺還是程序殺死都會調用此方法 在前臺,App內展示alert 在後臺,點擊彈框,進入App */ - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"%s",__func__); NSLog(@"[XGDemo] receive slient Notification"); NSLog(@"[XGDemo] userinfo %@", userInfo); if (self.isLaunchedByNotification == NO) { NSString *zero =[[[userInfo objectForKey:@"aps"] objectForKey:@"alert"] objectForKey:@"body"]; if (application.applicationState == UIApplicationStateActive) { //iOS10之前,在前臺時用自定義AlertView展示消息 [self showAlertViewWithTitle:@"新消息提示" Message:zero ConfirmTitle:@"確定" CancelTitle:nil]; [self receiveRemoteNotificationWithUserInfo:userInfo]; }else { [self receiveRemoteNotificationWithUserInfo:userInfo]; } }else{ self.isLaunchedByNotification = NO; } //iOS 9.x 及以前,需要在 UIApplicationDelegate 的回調方法(如下)中調用上報數據的接口 [[XGPush defaultManager] reportXGNotificationInfo:userInfo]; completionHandler(UIBackgroundFetchResultNewData); }
**********************************************************************************************************************************
- iOS10之後通知的處理方法
1,前臺運行
前臺運行: 指的是程序正在運行中, 用戶能看見程序的界面.
iOS10會出現通知橫幅, 而在以前的框架中, 前臺運行時, 不會出現通知的橫幅.
/** iOS 10 新增 API iOS 10 會走新 API, iOS 10 以前會走到老 API App 在前臺彈通知需要調用這個接口 */ #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - (void)xgPushUserNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { [[XGPush defaultManager] reportXGNotificationInfo:notification.request.content.userInfo]; //可設置是否在應用內彈出通知 completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert); } #endif
- iOS10之後通知的處理方法
2,後臺運行及程序退出 會調用的方法
/** iOS 10 新增 API iOS 10 會走新 API, iOS 10 以前會走到老 API App 用戶點擊通知 App 用戶選擇通知中的行爲 App 用戶在通知中心清除消息 無論本地推送還是遠程推送都會走這個回調 */ #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - (void)xgPushUserNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler { NSLog(@"%s",__func__); [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; NSLog(@"Userinfo %@",response.notification.request.content.userInfo); //處理接收到的消息 [self receiveRemoteNotificationWithUserInfo:response.notification.request.content.userInfo]; [[XGPush defaultManager] reportXGNotificationResponse:response]; completionHandler(); } #endif
**********************************************************************************************************************************
- 查詢信鴿註冊結果
/** @brief 註冊設備token的回調 @param deviceToken 當前設備的token @param error 錯誤信息 注意:此回調方法在註冊成功之後調用,當前的 Token 已經註冊過之後,SDK 將緩存註冊信息,此方法將不會再調用 */ - (void)xgPushDidRegisteredDeviceToken:(NSString *)deviceToken error:(NSError *)error{ NSLog(@"======》%s",__func__); NSLog(@"xgPushDidRegisteredDeviceToken===>%s, result %@, error %@", __FUNCTION__, error?@"NO":@"OK", error); }
- 監控信鴿推送服務的啓動情況
/** @brief 監控信鴿推送服務的啓動情況 @param isSuccess 信鴿推送是否啓動成功 @param error 信鴿推送啓動錯誤的信息 */ -(void)xgPushDidFinishStart:(BOOL)isSuccess error:(NSError *)error{ NSLog(@"======》%s",__func__); NSLog(@"%@ error %@",isSuccess? @"Success":@"Fail",error); }
- 遠程通知註冊失敗代理方法
/** 遠程通知註冊失敗代理方法 */ -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{ NSLog(@"%s",__func__); NSLog(@"[XGDemo] register APNS fail.\n[XGDemo] reason : %@", error); // [[NSNotificationCenter defaultCenter] postNotificationName:@"registerDeviceFailed" object:nil]; }
六,信鴿後臺調試
信鴿後臺 http://xg.qq.com
應用列表-->歷史明細
七。。。。。
相關文章: