小白也能掌握的個推iOS推送SDK 整合教程

個推2018發表於2019-09-05


以下是一位個推開發者在整合個推iOS推送SDK時候的親身經歷:

 作者:Ezreallp


一次偶然的機會,公司的專案要用到推送,我自己本來就很懶,不願意去弄整套APNS 的流程,剛好之前跟朋友聊起過他們的產品中整合了個推的Android 推送,說是體驗還可以,那這次我就試一下他們的iOS 推送。於是抱著試一試的心態,我先建個demo ,試著去整合一下個推iOS 推送SDK ,摸索著完成了整個流程,言歸正傳,直接上硬菜!

## 如何整合個推iOS SDK

看了個推的官網,發現他們整合的方式有兩種,分別是XCode 整合和CocoaPods 整合。本人比較懶,越簡單越好,越輕鬆越好,毫不猶豫的選擇了Cocoapods 整合方式,程式猿麼,就是要想盡辦法的懶,搞起!

###CocoaPods 整合

1. 安裝CocoaPods

安裝方式簡單, Mac 下都自帶 ruby ,使用 ruby gem 命令即可下載安裝:

$ sudo gem install cocoapods
$ pod setup

2. 準備Podfile 檔案

在我們的工程目錄下,新建一個名為Podfile 的檔案,如下格式,將依賴的庫名字依次列在檔案中即可:

作者這裡使用的是標準版本:

target 'GeTuipush' do
    platform :ios, "7.0"
    pod 'GTSDK'
end

target 'NotificationService' do
    platform :ios, "10.0"
    pod 'GTExtensionSDK'
end

3. 完成GTSDK 匯入

在專案根目錄中執行如下命令:

$ pod install

執行完成後,專案目錄結構如下圖所示:

注意: pod install 之前,首先你的工程必須建立好,並且如果Podfile 檔案裡面如果有target NotificationService ,那在pod install 之前需要建立好通知擴充套件的Target

4. 開啟推送功能:既然是推送,當然是要開推送功能啦!:

5. 後臺執行許可權設定:看個推的官網上面說是為了更好的支援訊息推送,提供更多的推送樣式,提高訊息到達率,既然這麼說了,那就不管三七二十一先開了再說,如下圖所示:

6.XCode10 建議開啟WiFi 資訊授權:在 Xcode 10.x 以上,找到應用Target 設定中的Capabilities -> Access WiFi Information ,確認開關已經設為ON 狀態。 如下圖所示:

注意: Target 和通知擴充套件的Target 都需要開啟

7. 程式碼部分,下來就是我們程式猿最喜歡的部分了,貼上複製。由於是第一次整合個推SDK 的程式碼,我還是仔細的研究了下。

#### 初始化SDK 註冊APNs 並獲取CID

1. AppDelegate 增加回撥介面類:

#import <UIKit/UIKit.h>
#import <GTSDK/GeTuiSdk.h>

// iOS10 及以上需匯入 UserNotifications.framework
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
#import <UserNotifications/UserNotifications.h>
#endif

@interface AppDelegate : UIResponder <UIApplicationDelegate, GeTuiSdkDelegate, UNUserNotificationCenterDelegate>

@property (strong, nonatomic) UIWindow *window;


@end

2. 初始化SDK 並註冊APNs

#import "AppDelegate.h"

/// 個推開發者網站中申請App 時,註冊的AppId AppKey AppSecret
#define kGtAppId           @"GVZZTqh7lu6S4VLMacneZ7"
#define kGtAppKey          @"RRYDFjGzO17TJXZfGeTuq3"
#define kGtAppSecret       @"7BXDJ0IgWF6a8M0xCgo4G"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [GeTuiSdk startSdkWithAppId:kGtAppId appKey:kGtAppKey appSecret:kGtAppSecret delegate:self];
    // 註冊 APNs
    [self registerRemoteNotification];
    return YES;
}

註冊APNs 獲取DeviceToken

/** 註冊 APNs */
- (void)registerRemoteNotification {
 
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionCarPlay) completionHandler:^(BOOL granted, NSError *_Nullable error) {
            if (!error) {
                NSLog(@"request authorization succeeded!");
            }
        }];
       
        [[UIApplication sharedApplication] registerForRemoteNotifications];
}

個推demo 裡面給開發者提供演示程式碼,根據APP 支援的iOS 系統不同,進行修改。我們的工程最低支援iOS10

獲取CID 資訊:

/** SDK 啟動成功返回cid */
- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId {
   
    NSLog(@"clientId:%@", clientId);
}

這三個引數kGtAppId kGtAppKey kGtAppSecret 是幹啥用的,這三個引數如何獲取? 回頭又看了下個推的官網才搞明白,正好記錄下如何申請者三個引數,跟我應用的bundleID 繫結。

#### 如何獲取kGtAppId kGtAppKey kGtAppSecret

1. 建立個推開發者賬號

訪問 個推開發者中心 ,申請個推賬號

2. 登記新應用

注意: 登記新應用是在應用管理頁面而不是訊息推送頁面。

在登記應用介面填寫應用名和應用表示,勾選個推產品,勾選iOS ,填寫包名和bundleID, 如下圖所示:

這裡我有點疑惑。建立應用的時候想勾選iOS ,但是看到預設選擇了Android 平臺,並要填寫Android 簽名,這簽名是what ,這如何搞?看到跟前有個提示如何獲取,點了一下,發現裡面有SHA256 的簽名,抱著試一試的態度,直接copy 過來,呦呵,能用哦,心裡美滋滋。

 

提交成功後就可以獲取到kGtAppId kGtAppKey kGtAppSecret ,將三個引數填入我們的工程中,然後執行工程,在GeTuiSdkDidRegisterClient 的回撥方法中獲取到cid 了,嗯,看來我們已經成功了一一小部分了,距離成功還要繼續加油。

#### 註冊DeviceToken 並統計APNs 通知的點選數

1. 向個推伺服器註冊DeviceToken

/** 遠端通知註冊成功委託 */
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    // 向個推伺服器註冊deviceToken 為了方便開發者,建議使用新方法
    NSLog(@"deviceToken:%@",deviceToken);
    [GeTuiSdk registerDeviceTokenData:deviceToken];
}

2. 處理APNs 通知點選事件:

因為我們的工程最低適配到iOS10 ,這裡我就只新增了iOS10 及以後版本的通知點選事件,要是想相容iOS10 以下的,可以在個推的demo 中找到。

iOS 10 及以後版本,處理APNs 通知點選事件

//  iOS 10: 點選通知進入App 時觸發,在該方法內統計有效使用者點選數
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {

    NSLog(@"didReceiveNotification %@", response.notification.request.content.userInfo);

    // [ GTSdk ] :將收到的APNs 資訊傳給個推統計
    [GeTuiSdk handleRemoteNotification:response.notification.request.content.userInfo];

    completionHandler();
}

3. 接受個推通道下發的透傳訊息:

/** SDK 收到透傳訊息回撥 */
- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId {
    // 收到個推訊息
    NSString *payloadMsg = nil;
    if (payloadData) {
        payloadMsg = [[NSString alloc] initWithBytes:payloadData.bytes length:payloadData.length encoding:NSUTF8StringEncoding];
    }

    NSString *msg = [NSString stringWithFormat:@"taskId=%@,messageId:%@,payloadMsg:%@%@",taskId,msgId, payloadMsg,offLine ? @"< 離線訊息>" : @""];
    NSLog(@"\n>>>[GexinSdk ReceivePayload]:%@\n\n", msg);
}

獲取到了透傳訊息,但是當應用在後臺或者應用殺死的情況下,我們如何獲取到APNs 訊息,這裡我們就需要在個推平臺用到推送證書,如何獲取推送證書?因為本人也是第一次搞推送這書,而且也踩了不少的坑,為了下次不再踩同樣的坑,所以在這裡就對如何製作推送證書進行了一次規整。

#### 如何製作推送證書?

1. 進入 蘋果開發者中心 ,選擇證書選項, 如下圖所示:

2. 建立推送證書之前必須建立一個APPID ,因為推送證書是和APPID 繫結在一起的,如下圖所示:

在下面的App Services 中選擇允許推送(Push Notifications) ,如下圖所示:

3.APPID 建立好了之後,這個時候需要去建立推送證書,而且還要根據需要的環境選擇對應的推送證書,包括開發環境推送證書和生產環境推送證書,然後還要跟剛才建立好的APPID 相關聯,如下圖所示:

這個時候需要上傳CSR 檔案,我們回到桌面,開啟鑰匙串,從頒發機構申請證書並儲存到本地磁碟,如下圖所示:

這樣CSR 檔案就建立好了,我們回到蘋果開發者中心,繼續建立我們的推送證書,選擇儲存到本地的CSR 檔案,如下圖所示:

這樣,我們的推送證書就建立完成了,在本地下載中找到下載的推送證書並雙擊新增到鑰匙串中,然後開啟鑰匙串找到建立好的推送證書,右鍵匯出P12 證書,並輸入證書密碼,如下圖所示:

4. 開啟我們的個推開發者中心,在個推· 訊息推送- 應用列表- 應用配置中上傳正確的APNs 證書,如下圖所示:

接下來最重要的時刻來了,那就是測試了,看看我們的推送能不能成功。

### 推送測試

本人是在個推平臺上面進行推送測試的,在應用列表裡面點選之前建立的應用上的建立推送按鈕,如下圖所示:

進入後,我有點懵逼,因為之前沒有了解過個推SDK 的邏輯,在詢問了個推技術支援後,技術支援告訴我怎麼在個推平臺上面去推,也是自己太粗心了,人家進去第一句話就寫的很清楚,推送通知目前僅支援安卓使用者,iOS 請使用透傳訊息。尷尬!那就透傳訊息頁面試試推。如下圖所示:

透傳訊息測試:

APNs 訊息測試

NICE 啊,這下應用在前臺、應用在後臺和應用被殺死的情況下都可以收到推送訊息了,爽歪歪啊!看來我們已經成功看了百分之九十了!

###Notification Service Extension

正在沾沾自喜的時候,突然發現個推的官網上面還有多媒體推送,我靠,還有這種操作,好奇心的趨勢下,讓我重新審視如何去做多媒體推送。因為我們之前已經把通知擴充套件的target 建立好了,所以,直接上程式碼。

1.Notification Service Extension 新增成功後會在專案中自動生成 NotificationService.h NotificationService.m 兩個類,包含以下兩個方法:

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent *_Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];

    // [ 測試程式碼 ] TODO: 使用者可以在這裡處理通知樣式的修改,eg: 修改標題,開發階段可以用於判斷是否執行通知擴充套件
    //self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [WillIn]", self.bestAttemptContent.title];

    // [ GTSDK ] 統計APNs 到達情況和多媒體推送支援介面, 建議使用該介面
    [GeTuiExtSdk handelNotificationServiceRequest:request withAttachmentsComplete:^(NSArray *attachments, NSArray *errors) {
       
        // self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [Success]", self.bestAttemptContent.title];
       
        self.bestAttemptContent.attachments = attachments;      // 設定通知中的多媒體附件
        self.contentHandler(self.bestAttemptContent);          
    }];
}

我們可以在這個方法中處理我們的 APNs 通知,並個性化展示給使用者。APNs 推送的訊息送達時會呼叫這個方法,此時你可以對推送的內容進行處理,然後使用contentHandler 方法結束這次處理。但是如果處理時間過長,將會進入serviceExtensionTimeWillExpire 方法進行最後的緊急處理。

- (void)serviceExtensionTimeWillExpire {
 // [ GTSDK ] 銷燬SDK ,釋放資源
    [GeTuiExtSdk destory];
   
    //self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [Timeout]", self.bestAttemptContent.title];
   
    self.contentHandler(self.bestAttemptContent);
}

如果didReceiveNotificationRequest 方法在限定時間內沒有呼叫 contentHandler 方法結束處理,則會在過期之前進行回撥本方法。此時你可以對你的 APNs 訊息進行緊急處理後展示,如果沒有處理,則顯示原始 APNs 推送。

接下來就是測試我們的多媒體推送是否成功,我在網上找了個小狗的照片,直接在個推平臺上面推。

多媒體測試

6 啊,終於搞定了!棒棒噠~~~

但是,之前的一個老專案說也要整合推送,我透,老專案要用XCode 整合,這對於我這種懶人來說,簡直是一種折磨啊,哎,折磨歸折磨,該搞還要搞。但是之前已經用CocoaPods 搞過一遍,這次用XCode 整合還不是手到擒來。但是為了防止出錯,本人還是先做了個demo ,這樣後面在自己專案上面整合的話把握性會更大,踩的坑也就會更少。

###XCode 整合

1. 匯入個推SDK

2. 庫引用檢查:

3. 新增系統依賴庫:

libc++.tbd
libz.tbd
libsqlite3.tbd
libresolv.tbd
Security.framework
MobileCoreServices.framework
SystemConfiguration.framework
CoreTelephony.framework
AVFoundation.framework
CoreLocation.framework
UserNotifications.framework (iOS 10 及以上需新增,使用 Optional 方式接入)
AdSupport.framework   (如果使用無IDFA 版本SDK ,則需刪除該 AdSupport 庫)

幸虧後面的步驟基本上都是一樣的,唯一的欣慰呀!

4. 開啟推送功能、後臺執行許可權設定、開啟WiFi 資訊授權

這裡跟上面步驟一樣,就不囉嗦了。

5.copy 程式碼,這是我們程式猿最喜歡的啦,哈哈哈,之前搞過,這裡就不累贅了。

6. 新增Notification Service Extension

(1). 開啟XCode ,選單中選擇File->New->Target->Notification Service Extension 。如下圖所示:

注意:1.Extension Bundle Identifier 不能和Main Target( 也就是自己的App Target) Bundle Identifier 相同,否則會報BundleID 重複的錯誤。2.Extension Bundle Identifier 需要在 Main Target 的名稱空間下,比如說 Main Target BundleID ent.getui.xxx ,那麼Extension BundleID 應該類似與ent.getui.xxx.yyy 這樣的格式。 如果不這麼做,會引起命名錯誤。

這個是在個推官網上面看到的,之前自己也踩了這個坑,這裡就記錄下來。

新增 Notification Service Extension 後會生成相應的 Target 。點Finish 按鈕後會彈出是否啟用該 Target 對應 scheme 的選項框,選擇 Activate ,如果沒有彈出該選項框,需要自行新增相應的 scheme 。如下圖所示:

(2).Notification Service Extension 新增成功後會在專案中自動生成 NotificationService.h NotificationService.m 兩個類

這裡跟上面一樣,就不累贅了。

(3). 新增GtExtensionSdk 依賴庫

選擇Notification Service Extension 所對應的Target ,新增如下依賴庫:

libz.tbd
libsqlite3.tbd
GTExtensionSDK.framework
UserNotifications.framework

(4).XCode10 建議開啟WiFi 資訊授權:在 Xcode 10.x 以上,找到應用Target 設定中的Capabilities -> Access WiFi Information ,確認開關已經設為ON 狀態。如下圖所示:

(5). 開啟多媒體地址Http 訪問支援:

## 整合過程中遇到的問題

deviceToken

最讓我印象深刻的就是無效的deviceToken ,在測試APNS 推送的時候,詢問過個推那邊的技術支援,他們說可以先在應用配置裡面測試一下,然後我就拿著我的deviceToken 去測試一下,結果提示我是無效的deviceToken ,我暈,然後繼續諮詢個推的技術支援,他們還蠻耐心的,跟我說這個原因有可能是我證書環境的問題。經過一番仔細的檢查之後,發現,我在個推平臺上面上傳的是通用證書,然後我XCode 上面的授權證書是開發環境下,這樣一來,拿到的是開發環境下的deviceToken ,用測試一下,當然會出錯。 解決的方案有兩種:第一,在個推開發平臺上傳開發環境下的推送證書。第二:將自己的授權證書更換為生產環境。

self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [Success]", self.bestAttemptContent.title];

發現demo 裡面有這麼一行程式碼,我把這行程式碼開啟後,推送一條訊息,發現標題沒有變化,我驚呆了!詢問個推技術支援,個推技術支援說,讓我先執行主target ,然後再執行通知擴充套件,執行通知擴充套件的時候會讓我們去找主targetAPP ,選擇主target ,然後再推送就會有了,嗯,想了下,這個應該是XCode bug

 

結語:

最後,我要說,訊息推送功能的整合對APP 而言真的真的很重要。以上是個推iOS 推送SDK 整合的全步驟,給大家做個參考。特別需要注意的幾點是:

1. 在個推平臺上上傳的推送證書一定要正確並且要和自己的環境相對應,推薦上傳P8 證書;

2. target 和通知擴充套件target 是兩個target ,命名和bundleID 上要注意,本人是按照個推官網給的建議命名的。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31556026/viewspace-2656176/,如需轉載,請註明出處,否則將追究法律責任。

相關文章