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

推送技术哪家强,还是要去找极光,没有一点打广告的意思哦!
接触苹果远程推送功能不是一天二天了,记得上次也就是前年集成推送,当时用的是友盟推送,当时对于推送各面的理解什么的都需要一定时间,毕竟第一次嘛!

举几个例子:
为何说是最快呢?蔽人不是在夸极光平台的速度,也不是在说其他平台速度慢怎么的。
那是因为我集成极光推送功能仅仅用半天就全部搞定,晒下成果!

推送成功的逻辑.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.jianshu.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.jianshu.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.jianshu.com/p/53e0244e6081
重点来了:个人极光推送项目地址:
https://github.com/zxwIsCode/TestPushJiGuang

如果有任何问题,欢迎骚扰QQ:1824496534,谢谢!
ps:本篇说的都是推送方面很简单的问题,新手值的看下,老鸟可以绕过,欢迎吐槽!
下篇会把极光推送方面的核心如Alias 和Tag 分群推送等总结下,一并分享!

修改日志:
于20170503修改:添加了Appkey支持项,以及原来部分图片出错!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容