推送技术哪家强,还是要去找极光,没有一点打广告的意思哦!
接触苹果远程推送功能不是一天二天了,记得上次也就是前年集成推送,当时用的是友盟推送,当时对于推送各面的理解什么的都需要一定时间,毕竟第一次嘛!
举几个例子:
为何说是最快呢?蔽人不是在夸极光平台的速度,也不是在说其他平台速度慢怎么的。
那是因为我集成极光推送功能仅仅用半天就全部搞定,晒下成果!
再次感叹当年研究任何一项陌生的技术,最怕什么SDK了或者老板限定时间搞定!如今呢,已能做到胸有成竹,什么技术也不怕,就是这么任性!
本篇说什么:
一.远程推送的本质:
二.集成极光推送的准备工作
三.集成极光推送的流程
四.梳理集成第三方平台SDK的步骤:
五.附上学习推送的参考资料:
一.远程推送的本质:
解释:我的理解是这样的:当我们的设备处在联网状态下,服务器会把要发的信息通过APNS(苹果服务器)发送给我们的用户,达到通知用户的目的!
流程如下:
推送准备工作:
苹果手机通过自己的UUID和Bundle ID注册APNS推送通知 --> APNS把UUID和Bundle ID加密生成deviceToken
真正的推送流程:
苹果手机 -->自身App服务器(需要配置APNS证书)-->推送信息时查询对应的deviceToken,并把deviceToken 和要发的信息 --> APNS 找到合适的 deviceToken,在合适的时机(比如联网)-->用户的手机,完成推送!
二.集成极光推送的准备工作
1.推送申请证书方面(这里只说注意事项,并没有把所有流程都说到,因为网上这样的教程太多了呢!)
创建AppID:
按照正常的流程创建注意,这里一定要勾选 Push Notifications 选项
创建Certificates:
记得创建的证书如下所示:其他按照正常流程处理
创建成功后,就双击运行到钥匙串中,然后再从钥匙串中导出P12文件,后面上传到极光官方后台即可。
创建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个文件,拖拽到您的工程中
在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 7之后添加info.plist 以下的key以支持http的请求
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
当然您如果用我的空项目
http://www.jianshu.com/p/c8b6b8660693
进行集成,这个支持http的key可以忽略!
4.本人集成过程中唯一爬过的坑分享:
先附上错误的图片:
解决办法:
被极光所误,还是要在在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支持项,以及原来部分图片出错!