iOS學習 --- 接入信鴿推送功能(V3.2.0 2018-09-11)(一)

前言

最近公司項目在接入信鴿推送功能,詳細記錄下整個過程。。。

一,信鴿後臺創建iOS應用

  1. 註冊信鴿推送開發賬號,並登陸;
  2. 登錄成功後,右上角“個人中心”,下拉列表點擊“應用列表”創建iOS應用。

選擇平臺

填寫配置(證書可以暫時不上傳,後面補填即可)

應用創建完成

應用配置(證書)

 

二,APNs推送證書製作並上傳至信鴿後臺(開發證書,生產證書)

參考信鴿官方文檔 iOS推送證書說明

三,下載官方SDK

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

應用列表-->歷史明細

七。。。。。

 

相關文章:

IOS 普通推送和靜默推送

iOS學習筆記5-推送(信鴿推送)

iOS 信鴿推送

記錄iOS 10信鴿推送適配

iOS手把手教你生成推送證書(測試和生產)

iOS靜默通知

關於推送消息的處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章