react-native iOS接入极光推送
开始之前首先需要进入你的项目目录,打开命令终端安装相应的包
npm install jpush-react-native
npm install jcore-react-native
一、配置iOS的证书
1. 创建App ID:苹果开发者网站(如已创建可跳到下一步)
- 点击注册
- 这是我们刚刚创建好的App ID
2. 创建推送证书
- 打开钥匙串:右上角钥匙串访问->证书助理->从证书颁发机构请求证书
- 用户电子邮箱随便填写一个常用的就好,选择存储到磁盘,点击继续将文件存储下来(一会儿创建推送证书会用到,文件后后缀为.certSigningRequest)
- 找到刚刚创建好的App ID,点击进入找到Push Notifications,点击Configure
- Development SSL Certificate:开发SSL证书
- Production SSL Certificate:生产SSL证书
- 我们拿生产证书创建举例(开发证书的创建步骤同生产证书,没有区别),点击Create Certificate
- 点击Choose File,将刚才存储的.certSigningRequest文件上传,点击continue
- 将创建好的证书下载下来(后缀为 .cer)
- 双击下载好的.cer推送证书,会在钥匙串中多出一个证书
- 右键点击证书选择导出,点击存储会导出一个p12格式的文件
3. 配置极光iOS
- 进入极光官网 -> 进入应用管理 -> 找到对应项目点击应用管理
- 点击推送设置 -> iOS -> 证书配置
- iOS生产证书:上传之前下载下来的p12生产推送证书
- 生产证书密码:创建p12证书时设置的密码,
- 是否将生产证书用于开发环境:如果选择是则可以不用上传开发的推送证书
- 点击保存,配置完成
- 在应用信息中可以查看AppKey和Master Secret (后台会用到)
- 打开iOS工程,在 link 之后,RCTJPushModule.xcodeproj 工程会自动添加到 Libraries 目录里面
- 在 iOS 工程 target 的 Build Phases->Link Binary with Libraries 中加入如下库
libz.tbd
CoreTelephony.framework
Security.framework
CFNetwork.framework
CoreFoundation.framework
SystemConfiguration.framework
Foundation.framework
UIKit.framework
UserNotifications.framework
libresolv.tbd
- 在info.plist文件中添加如下配置
- 勾选Background Modes中的Remote notifications
- 打开Push Notifications(如没有Push Notifications,打开Capability双击Push Notifications即可添加)
- 在AppDelegate.h文件中添加下列代码
static NSString *appKey = @"appkey"; //填写appkey
static NSString *channel = nil; //填写channel 一般为nil
static BOOL isProduction = YES; // 生产环境填YES,测试为False
- 在AppDelegate.m文件中添加下列代码
@interface AppDelegate ()<JPUSHRegisterDelegate>
@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
.........
// 注册apns通知
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { // iOS10 {
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
entity.types = UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound;
[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
#endif
} else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
//可以添加自定义categories
[JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
UIUserNotificationTypeSound |
UIUserNotificationTypeAlert)
categories:nil];
} else {
//iOS 8以前 categories 必须为nil
[JPUSHService registerForRemoteNotificationTypes:(UNAuthorizationOptionBadge |
UNAuthorizationOptionSound |
UNAuthorizationOptionAlert)
categories:nil];
}
[JPUSHService setupWithOption:launchOptions appKey:appKey
channel:channel apsForProduction:isProduction];
......
}
#pragma mark - 极光推送
// *** 注册APNs成功并上报DeviceToken ***
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[JPUSHService registerDeviceToken:deviceToken];
}
// *** 添加处理APNs通知回调方法 ***
// JPUSHRegisterDelegate
// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
NSDictionary * userInfo = notification.request.content.userInfo;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
[[NSNotificationCenter defaultCenter] postNotificationName:kJPFDidReceiveRemoteNotification object:userInfo];
}
completionHandler(UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
}
// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
NSDictionary * userInfo = response.notification.request.content.userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
[[NSNotificationCenter defaultCenter] postNotificationName:kJPFOpenNotification object:userInfo];
}
completionHandler();// 系统要求执行这个方法
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[[NSNotificationCenter defaultCenter] postNotificationName:kJPFDidReceiveRemoteNotification object:userInfo];
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[[NSNotificationCenter defaultCenter] postNotificationName:kJPFDidReceiveRemoteNotification object:userInfo];
}
#pragma mark - 清除角标
- (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
[UIApplication sharedApplication].applicationIconBadgeNumber=0;
[JPUSHService setBadge:0];
}
5.推送测试
- 项目运行起来后会在打印出registrationID,可以通过registrationID像App发送推送