JPush的集成步骤及相关原理
Posted Dream-seekerGirl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JPush的集成步骤及相关原理相关的知识,希望对你有一定的参考价值。
第三方推送:极光推送的集成
苹果官方的APNS推送,想必大家并不陌生,它有一些不足之处就是:到达率低,推送效率慢,开发维护运营比较高;对于它的这些不足之处,才产生了受大家欢迎的第三方推送:极光推送;极光推送和苹果官方推送相比有如下几点好处:
1. 减少开发及维护成本:
· 应用开发者不需要去开发维护自己的推送服务器与APN的对接。
· 集成了JPush的ios SDK后不必自己维护更新设备令牌。
· 通过JPush的门户网站直接推送,也可以调用JPush的HTTP协议的API来完成,开发工作量大大减少。
2.减少运营成本:
· 极光推送支持一次推送,同时向安卓,iOS的,WinPhone三个平台。支持统一的API与推送界面。
· 极光推送提供标签、别名绑定机制,以及提供了非常细分的用户分群方式,运营起来非常简单、直观。
3. 提供应用内推送:
· 除了使得的APN推送更简单,也另外提供应用内消息推送。这在类似于聊天的场景里很有必要。
因此,极光推送也受各大企业欢迎和使用,接下来我们就来看一下,极光推送的步骤,以及应用内推送的一些简单操作。
以下是极光推送的集成步骤:
第一步:创建应用程序ID
登陆iOS Dev Center选择进入Certificates, Identifiers & Profiles
在
Certificates, Identifiers & Profiles中,点击App IDs进入App ID列表
创建 App ID,如果 ID 已经存在可以直接跳过此步骤
为 App 开启 Push Notification 功能。如果是已经创建的 App ID 也可以通过设置开启 Push Notification 功能。
根据实际情况完善 App ID 信息并提交,注意此处需要指定具体的 Bundle ID 不要使用通配符。
第二步:配置和下载证书(以供传到Jpush后台的push证书)
如果你之前没有创建过 Push 证书或者是要重新创建一个新的,请在证书列表下面新建。
新建证书需要注意选择证书种类(开发证书用于开发和调试使用,生产证书用于 App Store 发布)
点击 Continue 后选择证书对应的应用ID,然后继续会出现“About Creating a Certificate Signing Request (CSR)”。
根据它的说明创建打开KeychainAccess 创建 Certificate Signing Request。
填写“User Email Address”和“Common Name” 后选择 Saved to disk 进行保存
- 继续返回Apple developer 网站点击 Continue ,上传刚刚生成的 .certSigningRequest 文件生成 APNs Push Certificate。
- 下载并双击打开证书,证书打开时会启动“钥匙串访问”工具。
- 在“钥匙串访问”中你的证书会显示在“我的证书”中,注意选择“My Certificates” 和"login"
-
导出 .p12 证书文件
导出.p12文件以供上传到极光后台。
第三步:上传证书
在Jpush后台管理,针对某应用程序,上传上面步骤得到 .p12 证书文件。这是 iOS SDK 能够接收到 JPush 推送消息的必要步骤。第四步:创建与Xcode中安装的证书以及对应的配置文件(Provisioning Profile)
- 假设创建了一个App ID:cn.jpush.examlpe,并为此App ID配置开发环境的Push Notifications:
创建开发者证书以及发布证书在这里我就不多做介绍了,和上面的传入极光后台证书的制作过程类似,以下讲解的主要是制作与证书对应的配置文件
选择要创建Provisioning Profile的App ID后点击[Continue]:
选择所属的开发者证书,(这里创建了多个开发者证书,建议只创建一个,方便管理)为了方便,选择了[Select All],再点击[Continue]进入下一步:
为该Provisioning Profile选择将要安装的设备(一般选择[Select All]),点击[Continue]:
给该Provisioning Profile填写Profile Name,点击[generate]完成创建。
点击[DownLoad]下载Provisioning Profile,并双击配置文件即可。
第四步:Xcode的证书配置过程
打开xxx-info.plist的Bundle identifier项把上传到JPush 控制台的bundle id填写进去:
Xcode7.2还需要改一个地方:
点击项目,进入Build Setting 界面,向下滑动,去到Code Signing 配置证书:
第五步:客户端设置开启Remote notifications
需要在Xcode 中修改应用的 Capabilities 开启Remote notifications,请参考下图:
第六步:集成极光推送的SDK
创建成功后自动生成 AppKey 用以标识该应用。
导入API开发包到应用程序项目
将SDK包解压,在XCode中选择“Add files to 'Your project name'...”,将解压后的lib子文件夹(包含APService.h、libPushSDK.a)添加到你的工程目录中。
必要的框架
- CFNetwork.framework
- CoreFoundation.framework
- CoreTelephony.framework
- SystemConfiguration.framework
- CoreGraphics.framework
- Foundation.framework
- UIKit.framework
- Security.framework
- Xcode7需要的是libz.tbd;Xcode7以下版本是libz.dylib
Build Settings
- 设置 Search Paths 下的 User Header Search Paths 和 Library Search Paths,比如SDK文件夹(默认为lib)与工程文件在同一级目录下,则都设置为"$(SRCROOT)/[文件夹名称]"即可。
创建并配置PushConfig.plist文件
在你的工程中创建一个新的Property List文件,并将其命名为PushConfig.plist,填入Portal为你的应用提供的APP_KEY等参数。
"APS_FOR_PRODUCTION" = "0";
"CHANNEL" = "Publish channel";
"APP_KEY" = "AppKey copied from JPush Portal application";
- CHANNEL
- 指明应用程序包的下载渠道,为方便分渠道统计。根据你的需求自行定义即可。
- APP_KEY
- 在管理Portal上创建应用时自动生成的(AppKey)用以标识该应用。请确保应用内配置的 AppKey 与第1步在 Portal 上创建应用时生成的 AppKey 一致,AppKey 可以在应用详情中查询。
添加代码:
API
APIs 主要集中在 APService 接口类里。
#pragma - mark 基本功能
// 以下四个接口是必须调用的
+ (void)setupWithOption:(NSDictionary *)launchingOption; // 初始化
+ (void)registerForRemoteNotificationTypes:(NSUInteger)types
categories:(NSSet *)categories; // 注册APNS类型
+ (void)registerDeviceToken:(NSData *)deviceToken; // 向服务器上报Device Token
+ (void)handleRemoteNotification:(NSDictionary *)
remoteInfo; // 处理收到的APNS消息,向服务器上报收到APNS消息
调用代码
监听系统事件,相应地调用 JPush SDK 提供的 API 来实现功能。
以下 3 个事件监听与调用 JPush SDK API 都是必须的。请直接复制如下代码块里,注释为 "Required" 的行,到你的应用程序代理类里相应的监听方法里。
#pragma mark - 第一步:初始化Jpush
-(void)initJPushWithFinishLaunchingWithOptions:(NSDictionary *)launchOptions
//第一步 Required
[APService setupWithOption:launchOptions];
#pragma mark - 第二步:注册推送通知
-(void)registerJPush
// Required
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
//可以添加自定义categories
[APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
UIUserNotificationTypeSound |
UIUserNotificationTypeAlert)
categories:nil];
else
//categories 必须为nil
[APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)
categories:nil];
#pragma mark - 第三步:把苹果服务器返回回来的token,交给jPush,换取RegisterId
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
// Required
[APService registerDeviceToken:deviceToken];
#pragma mark - 第四步:处理收到的推送信息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
// Required
[APService handleRemoteNotification:userInfo];
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
// IOS 7 Support Required
[APService handleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
监听通知
API里面提供了下面 5 种类型的通知:
extern NSString * const kJPFNetworkDidSetupNotification; // 建立连接
extern NSString * const kJPFNetworkDidCloseNotification; // 关闭连接
extern NSString * const kJPFNetworkDidRegisterNotification; // 注册成功
extern NSString * const kJPFNetworkDidLoginNotification; // 登录成功
extern NSString * const kJPFNetworkDidReceiveMessageNotification; // 收到消息(非APNS)
其中,kJPFNetworkDidReceiveMessageNotification通知是有传递数据的,可以通过NSNotification中的userInfo方法获取,包括标题、内容、内容类型、扩展信息等
OK,集成极光推送的步骤就这么多了,是不是很easy,哈哈,大家努力集成吧。
最后补充一点:应用内推送的相关知识点
根据相对应的RegisterID进行定点推送,以及用户关机时,保留多久推送时间等等应用内推送需要注册通知:
//获取registerID
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(getRegisterIdFromJPush:) name:kJPFNetworkDidLoginNotification object:nil];
//根据registerid获取推送的相关内容
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(registerIdPushSuccess:) name:kJPFNetworkDidReceiveMessageNotification object:nil];
//极光推送应用内推送
#pragma mark - 获取registerId
-(void)getRegisterIdFromJPush:(NSNotification *)notification
NSString * registerId = [APService registrationID];
NSLog(@"registerId = %@",registerId);
#pragma mark - 根据registerId进行推送看是否推送成功
- (void)registerIdPushSuccess:(NSNotification *)notification
NSLog(@"%@",[notification userInfo]);
OK,极光推送,应用内推送基本介绍完毕,具体需要要根据项目而定哦!
以上是关于JPush的集成步骤及相关原理的主要内容,如果未能解决你的问题,请参考以下文章
用 jpush-react-native 插件快速集成推送功能(Android 篇)