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

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

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

推送成功的逻辑.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支持项,以及原来部分图片出错!

推荐阅读更多精彩内容