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

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

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

推送成功的邏輯.jpg

再次感嘆當(dāng)年研究任何一項陌生的技術(shù),最怕什么SDK了或者老板限定時間搞定似嗤!如今呢啸臀,已能做到胸有成竹,什么技術(shù)也不怕烁落,就是這么任性乘粒!

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

一.遠程推送的本質(zhì):


遠程推送的原理圖.png

解釋:我的理解是這樣的:當(dāng)我們的設(shè)備處在聯(lián)網(wǎng)狀態(tài)下,服務(wù)器會把要發(fā)的信息通過APNS(蘋果服務(wù)器)發(fā)送給我們的用戶伤塌,達到通知用戶的目的灯萍!

流程如下:
推送準(zhǔn)備工作:
蘋果手機通過自己的UUID和Bundle ID注冊APNS推送通知 --> APNS把UUID和Bundle ID加密生成deviceToken
真正的推送流程:
蘋果手機 -->自身App服務(wù)器(需要配置APNS證書)-->推送信息時查詢對應(yīng)的deviceToken,并把deviceToken 和要發(fā)的信息 --> APNS 找到合適的 deviceToken每聪,在合適的時機(比如聯(lián)網(wǎng))-->用戶的手機旦棉,完成推送齿风!

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

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


選擇AppID的推送功能.png

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


創(chuàng)建推送證書的選項.png

創(chuàng)建Provisioning Profiles(描述文件:Xcode調(diào)試纪他,打包到AppStore專用)

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

2.推送平臺創(chuàng)建應(yīng)用
注冊并登錄官網(wǎng) :https://www.jiguang.cn
創(chuàng)建自己的應(yīng)用:
需要準(zhǔn)備項目的Bundle Id 以及上一步驟的開發(fā)和生產(chǎn)推送證書!

三.集成極光推送的流程
1.SDK下載以及對應(yīng)庫的導(dǎo)入
SDK下載網(wǎng)址為: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 這個庫薪寓,一定要記得添加,敝人爬的就是這個坑澜共,按照官網(wǎng)的沒添加向叉,就報如下的錯:

2.AppDelegate 中要導(dǎo)入那些東西
導(dǎo)入的頭文件:

// 引入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"
// 標(biāo)識當(dāng)前應(yīng)用所使用的APNs證書環(huán)境,0 (默認值)表示采用的是開發(fā)證書嗦董,1 表示采用生產(chǎn)證書發(fā)布應(yīng)用
#define isProduction 0

遵循<JPUSHRegisterDelegate>

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

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

上面2個方法的實現(xiàn)如下:

// 初始化APNS
-(void)initAPNSCode {
    //Required
    //notice: 3.0.0及以后版本注冊可以這樣寫母谎,也可以繼續(xù)用之前的注冊方式
    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功能請?zhí)砑哟舜a并在初始化方法的advertisingIdentifier參數(shù)中填寫對應(yīng)值
    NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    
    // Required
    // init Push
    // notice: 2.1.5版本的SDK新增的注冊方法贡必,改成可上報IDFA歉提,如果沒有使用IDFA直接傳nil
    // 如需繼續(xù)使用pushConfig.plist文件聲明appKey等配置內(nèi)容,請依舊使用[JPUSHService setupWithOption:launchOptions]方式初始化峭拘。
    [JPUSHService setupWithOption:launchOptions appKey:JPushAppKey
                          channel:@"App Store"
                 apsForProduction:isProduction
            advertisingIdentifier:nil];
}

添加以下UIApplication 和 JPUSHRegisterDelegate方法的實現(xiàn)

#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); // 需要執(zhí)行這個方法匹摇,選擇是否提醒用戶咬扇,有Badge、Sound廊勃、Alert三種類型可以選擇設(shè)置
}

// 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();  // 系統(tǒng)要求執(zhí)行這個方法
}

- (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之后打開推送開關(guān)1.png
Xcode 8之后打開推送開關(guān)2.png

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

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

當(dāng)然您如果用我的空項目
http://www.reibang.com/p/c8b6b8660693
進行集成懈贺,這個支持http的key可以忽略!

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


集成遇到的報錯展示.png

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

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

附上自己集成過的技術(shù):(如果您想集成或者集成過程中休溶,遇到任何問題,我樂意給您解答扰她,分享無價嘛J揸)
地圖:百度地圖
支付:微信,支付寶支付
分享:友盟分享徒役,ShareSDK分享(微信孽尽,QQ,微博等分享)
第三方登錄:微信和QQ第三方登錄
聊天忧勿,即時通信:環(huán)信集成
推送:友盟推送杉女,極光推送
語音交流:科大訊飛的語音解析與合成

五.附上學(xué)習(xí)推送的參考資料:
1.極光推送官網(wǎng)
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.reibang.com/p/53e0244e6081
重點來了:個人極光推送項目地址:
https://github.com/zxwIsCode/TestPushJiGuang

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市院溺,隨后出現(xiàn)的幾起案子楣嘁,更是在濱河造成了極大的恐慌,老刑警劉巖珍逸,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逐虚,死亡現(xiàn)場離奇詭異,居然都是意外死亡谆膳,警方通過查閱死者的電腦和手機叭爱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漱病,“玉大人买雾,你說我怎么就攤上這事把曼。” “怎么了漓穿?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵嗤军,是天一觀的道長。 經(jīng)常有香客問我晃危,道長叙赚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任僚饭,我火速辦了婚禮震叮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浪慌。我一直安慰自己冤荆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布权纤。 她就那樣靜靜地躺著钓简,像睡著了一般。 火紅的嫁衣襯著肌膚如雪汹想。 梳的紋絲不亂的頭發(fā)上外邓,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音古掏,去河邊找鬼损话。 笑死,一個胖子當(dāng)著我的面吹牛槽唾,可吹牛的內(nèi)容都是我干的丧枪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼庞萍,長吁一口氣:“原來是場噩夢啊……” “哼拧烦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钝计,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恋博,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后私恬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體债沮,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年本鸣,在試婚紗的時候發(fā)現(xiàn)自己被綠了疫衩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡永高,死狀恐怖隧土,靈堂內(nèi)的尸體忽然破棺而出提针,到底是詐尸還是另有隱情,我是刑警寧澤曹傀,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布辐脖,位于F島的核電站,受9級特大地震影響皆愉,放射性物質(zhì)發(fā)生泄漏嗜价。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一幕庐、第九天 我趴在偏房一處隱蔽的房頂上張望久锥。 院中可真熱鬧,春花似錦异剥、人聲如沸瑟由。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歹苦。三九已至,卻和暖如春督怜,著一層夾襖步出監(jiān)牢的瞬間殴瘦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工号杠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚪腋,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓姨蟋,卻偏偏與公主長得像屉凯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子眼溶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容