史上最快集成__極光推送集成(一)

推送技術哪家強,還是要去找極光,沒有一點打廣告的意思哦!
接觸蘋果遠程推送功能不是一天二天了,記得上次也就是前年集成推送,當時用的是友盟推送,當時對于推送各面的理解什么的都需要一定時間,畢竟第一次嘛!

舉幾個例子:
為何說是最快呢?蔽人不是在夸極光平臺的速度,也不是在說其他平臺速度慢怎么的。
那是因為我集成極光推送功能僅僅用半天就全部搞定,曬下成果!

推送成功的邏輯.jpg

再次感嘆當年研究任何一項陌生的技術,最怕什么SDK了或者老板限定時間搞定!如今呢,已能做到胸有成竹,什么技術也不怕,就是這么任性!

本篇說什么:
一.遠程推送的本質:
二.集成極光推送的準備工作
三.集成極光推送的流程
四.梳理集成第三方平臺SDK的步驟:
五.附上學習推送的參考資料:

一.遠程推送的本質:


遠程推送的原理圖.png

解釋:我的理解是這樣的:當我們的設備處在聯網狀態下,服務器會把要發的信息通過APNS(蘋果服務器)發送給我們的用戶,達到通知用戶的目的!

流程如下:
推送準備工作:
蘋果手機通過自己的UUID和Bundle ID注冊APNS推送通知 --> APNS把UUID和Bundle ID加密生成deviceToken
真正的推送流程:
蘋果手機 -->自身App服務器(需要配置APNS證書)-->推送信息時查詢對應的deviceToken,并把deviceToken 和要發的信息 --> APNS 找到合適的 deviceToken,在合適的時機(比如聯網)-->用戶的手機,完成推送!

二.集成極光推送的準備工作
1.推送申請證書方面(這里只說注意事項,并沒有把所有流程都說到,因為網上這樣的教程太多了呢!)

創建AppID:
按照正常的流程創建注意,這里一定要勾選 Push Notifications 選項


選擇AppID的推送功能.png

創建Certificates:
記得創建的證書如下所示:其他按照正常流程處理
創建成功后,就雙擊運行到鑰匙串中,然后再從鑰匙串中導出P12文件,后面上傳到極光官方后臺即可。


創建推送證書的選項.png

創建Provisioning Profiles(描述文件:Xcode調試,打包到AppStore專用)

上面3個文件的區別具體可見我另一篇文章的介紹:
蘋果的上線和推送證書的理解:
http://www.lxweimin.com/p/84f82e6bd527

2.推送平臺創建應用
注冊并登錄官網 :https://www.jiguang.cn
創建自己的應用:
需要準備項目的Bundle Id 以及上一步驟的開發和生產推送證書!

三.集成極光推送的流程
1.SDK下載以及對應庫的導入
SDK下載網址為:https://www.jiguang.cn/push#B_vid=5497159614553159929

將下載好的SDK中的以下3個文件,拖拽到您的工程中


極光推送SDK文件.png

在Build Phases選項卡的Link Binary With Libraries中,增加以下依賴:

CFNetwork.framework
CoreFoundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
Security.framework
libz.tbd (Xcode7以下版本是libz.dylib)
AdSupport.framework (獲取IDFA需要;如果不使用IDFA,請不要添加)
UserNotifications.framework (Xcode8及以上)
libresolv.tbd (JPush 2.2.0及以上版本需要, Xcode7以下版本是libresolv.dylib)

其中對于AdSupport.framework 這個庫,一定要記得添加,敝人爬的就是這個坑,按照官網的沒添加,就報如下的錯:

2.AppDelegate 中要導入那些東西
導入的頭文件:

// 引入JPush功能所需頭文件
#import "JPUSHService.h"
// iOS10注冊APNs所需頭文件
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif
// 如果需要使用idfa功能所需要引入的頭文件(可選)
#import <AdSupport/AdSupport.h>

#define JPushAppKey @"您的極光推送的Appkey"
// 標識當前應用所使用的APNs證書環境,0 (默認值)表示采用的是開發證書,1 表示采用生產證書發布應用
#define isProduction 0

遵循<JPUSHRegisterDelegate>

Code方面
在didFinishLaunchingWithOptions 方法中加入以下代碼

 // 初始化APNS
    [self initAPNSCode];
    // 初始化JPush
    [self initJPush:launchOptions];

上面2個方法的實現如下:

// 初始化APNS
-(void)initAPNSCode {
    //Required
    //notice: 3.0.0及以后版本注冊可以這樣寫,也可以繼續用之前的注冊方式
    JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
    entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        // 可以添加自定義categories
        // NSSet<UNNotificationCategory *> *categories for iOS10 or later
        // NSSet<UIUserNotificationCategory *> *categories for iOS8 and iOS9
    }
    [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
}
// 初始化JPush
-(void)initJPush:(NSDictionary *)launchOptions {
    
    // Optional
    // 獲取IDFA
    // 如需使用IDFA功能請添加此代碼并在初始化方法的advertisingIdentifier參數中填寫對應值
    NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    
    // Required
    // init Push
    // notice: 2.1.5版本的SDK新增的注冊方法,改成可上報IDFA,如果沒有使用IDFA直接傳nil
    // 如需繼續使用pushConfig.plist文件聲明appKey等配置內容,請依舊使用[JPUSHService setupWithOption:launchOptions]方式初始化。
    [JPUSHService setupWithOption:launchOptions appKey:JPushAppKey
                          channel:@"App Store"
                 apsForProduction:isProduction
            advertisingIdentifier:nil];
}

添加以下UIApplication 和 JPUSHRegisterDelegate方法的實現

#pragma mark - UIApplication

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    
    /// Required - 注冊 DeviceToken
    [JPUSHService registerDeviceToken:deviceToken];
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    //Optional
    NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}


#pragma mark- JPUSHRegisterDelegate

// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
    // Required
    NSDictionary * userInfo = notification.request.content.userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
    }
    completionHandler(UNNotificationPresentationOptionAlert); // 需要執行這個方法,選擇是否提醒用戶,有Badge、Sound、Alert三種類型可以選擇設置
}

// iOS 10 Support
- (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];
    }
    completionHandler();  // 系統要求執行這個方法
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    
    // Required, iOS 7 Support
    [JPUSHService handleRemoteNotification:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    
    // Required,For systems with less than or equal to iOS6
    [JPUSHService handleRemoteNotification:userInfo];
}

3.其他注意事項:
Xcode 8之后的添加推送的方法如下圖所示:

Xcode 8之后打開推送開關1.png
Xcode 8之后打開推送開關2.png

另外Xcode 7之后添加info.plist 以下的key以支持http的請求

  <key>NSAppTransportSecurity</key> 
  <dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
  </dict>      

當然您如果用我的空項目
http://www.lxweimin.com/p/c8b6b8660693
進行集成,這個支持http的key可以忽略!

4.本人集成過程中唯一爬過的坑分享:
先附上錯誤的圖片:


集成遇到的報錯展示.png

解決辦法:
被極光所誤,還是要在在Build Phases選項卡的Link Binary With Libraries中添加AdSupport.framework,之后Build ,成功了!

四.梳理集成第三方平臺SDK的步驟:
1.尋找資料,合適的平臺,以及對應的技術文檔
如申請賬號,創建應用,下載SDK等
2.創建自己的項目
導入SDK以及添加系統依賴庫
AppDelegate中導入頭文件加入代碼
具體實現的項目文件中導入頭文件以及加入代碼
3.開始調試,有2種方式:
假數據:如支付技術
在人家平臺測試:如遠程推送等
4.收尾階段:
遇到的Bug,或者形成自己對這塊技術的思想精華,并給予分享!(特別是對于新手,建議樂于分享才能成長的更快!)

附上自己集成過的技術:(如果您想集成或者集成過程中,遇到任何問題,我樂意給您解答,分享無價嘛!)
地圖:百度地圖
支付:微信,支付寶支付
分享:友盟分享,ShareSDK分享(微信,QQ,微博等分享)
第三方登錄:微信和QQ第三方登錄
聊天,即時通信:環信集成
推送:友盟推送,極光推送
語音交流:科大訊飛的語音解析與合成

五.附上學習推送的參考資料:
1.極光推送官網
https://www.jiguang.cn
2.極光推送官方文檔
https://docs.jiguang.cn/jpush/client/iOS/ios_guide_new/
3.極光推送集成視頻教程
https://community.jiguang.cn/t/jpush-ios-sdk/4247
4.大牛寫的極光推送大全
http://www.lxweimin.com/p/53e0244e6081
重點來了:個人極光推送項目地址:
https://github.com/zxwIsCode/TestPushJiGuang

如果有任何問題,歡迎騷擾QQ:1824496534,謝謝!
ps:本篇說的都是推送方面很簡單的問題,新手值的看下,老鳥可以繞過,歡迎吐槽!
下篇會把極光推送方面的核心如Alias 和Tag 分群推送等總結下,一并分享!

修改日志:
于20170503修改:添加了Appkey支持項,以及原來部分圖片出錯!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容