react-native iOS接入极光推送

开始之前首先需要进入你的项目目录,打开命令终端安装相应的包

npm install jpush-react-native
npm install jcore-react-native

一、配置iOS的证书

1. 创建App ID:苹果开发者网站(如已创建可跳到下一步)

reactnative ios reactnative ios接入广告_reactnative ios


reactnative ios reactnative ios接入广告_reactnative ios_02


reactnative ios reactnative ios接入广告_reactnative ios_03


reactnative ios reactnative ios接入广告_推送证书_04


reactnative ios reactnative ios接入广告_iOS_05


reactnative ios reactnative ios接入广告_ios_06


reactnative ios reactnative ios接入广告_react native_07

  • 点击注册
  • 这是我们刚刚创建好的App ID

2. 创建推送证书

  • 打开钥匙串:右上角钥匙串访问->证书助理->从证书颁发机构请求证书
  • reactnative ios reactnative ios接入广告_iOS_08

  • 用户电子邮箱随便填写一个常用的就好,选择存储到磁盘,点击继续将文件存储下来(一会儿创建推送证书会用到,文件后后缀为.certSigningRequest)
  • reactnative ios reactnative ios接入广告_iOS_09

  • 找到刚刚创建好的App ID,点击进入找到Push Notifications,点击Configure
  • reactnative ios reactnative ios接入广告_react native_10

  • Development SSL Certificate:开发SSL证书
  • Production SSL Certificate:生产SSL证书
  • reactnative ios reactnative ios接入广告_reactnative ios_11

  • 我们拿生产证书创建举例(开发证书的创建步骤同生产证书,没有区别),点击Create Certificate
  • reactnative ios reactnative ios接入广告_react native_12

  • 点击Choose File,将刚才存储的.certSigningRequest文件上传,点击continue
  • reactnative ios reactnative ios接入广告_ios_13

  • 将创建好的证书下载下来(后缀为 .cer)
  • reactnative ios reactnative ios接入广告_推送证书_14

  • 双击下载好的.cer推送证书,会在钥匙串中多出一个证书
  • reactnative ios reactnative ios接入广告_ios_15

  • 右键点击证书选择导出,点击存储会导出一个p12格式的文件
  • reactnative ios reactnative ios接入广告_推送证书_16

3. 配置极光iOS

  • 进入极光官网 -> 进入应用管理 -> 找到对应项目点击应用管理
  • reactnative ios reactnative ios接入广告_iOS_17

  • 点击推送设置 -> iOS -> 证书配置
  • reactnative ios reactnative ios接入广告_iOS_18

  • iOS生产证书:上传之前下载下来的p12生产推送证书
  • 生产证书密码:创建p12证书时设置的密码,
  • 是否将生产证书用于开发环境:如果选择是则可以不用上传开发的推送证书
  • reactnative ios reactnative ios接入广告_iOS_19

  • 点击保存,配置完成
  • reactnative ios reactnative ios接入广告_推送证书_20

  • 在应用信息中可以查看AppKey和Master Secret (后台会用到)
  • reactnative ios reactnative ios接入广告_推送证书_21

reactnative ios reactnative ios接入广告_iOS_22

  • 打开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即可添加)

reactnative ios reactnative ios接入广告_reactnative ios_23

  • 在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发送推送

reactnative ios reactnative ios接入广告_iOS_24


reactnative ios reactnative ios接入广告_reactnative ios_25