当前位置: 首页 > news >正文

React-Native集成极光推送(Android和IOS)

React-Native集成极光推送的具体流程如下:

本文选取的是极光官方维护的react-native推送插件,github地址:https://github.com/jpush/jpush-react-native

后台集成极光sdk的地址:https://github.com/jpush/jpush-api-java-client

需要注册极光开发者账号,注册地址:https://www.jiguang.cn

注册之后登录,然后找到极光推送,新建自己的app,包名必须跟实际一致,得到appKey和master secret,react-native前端集成需要用到appKey,极光后台SDK集成需要使用master secret

 

一、安装相关依赖库

npm install jpush-react-native --save

注意:如果项目里没有jcore-react-native,需要安装

npm install jcore-react-native --save

安装完成后连接原生库 进入到根目录执行
react-native link

react-native link jpush-react-native
react-native link jcore-react-native

二、进行相关配置

2.1 Android

  • build.gradle

    android {defaultConfig {applicationId "yourApplicationId"           //在此替换你的应用包名...manifestPlaceholders = [JPUSH_APPKEY: "yourAppKey",         //在此替换你的APPKeyJPUSH_CHANNEL: "yourChannel"        //在此替换你的channel]}}
    
    dependencies {...implementation project(':jpush-react-native')  // 添加 jpush 依赖implementation project(':jcore-react-native')  // 添加 jcore 依赖}
    
  • setting.gradle

    include ':jpush-react-native'
    project(':jpush-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/jpush-react-native/android')
    include ':jcore-react-native'
    project(':jcore-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/jcore-react-native/android')
    
  • AndroidManifest.xml

    <meta-dataandroid:name="JPUSH_CHANNEL"android:value="${JPUSH_CHANNEL}" />
    <meta-dataandroid:name="JPUSH_APPKEY"android:value="${JPUSH_APPKEY}" />    
    

 

Android还需要对Application进行如下修改:

package com.example;import android.app.Application;import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader;import java.util.List;import cn.jiguang.plugins.push.JPushModule;public class MainApplication extends Application implements ReactApplication {private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {@Overridepublic boolean getUseDeveloperSupport() {return BuildConfig.DEBUG;}@Overrideprotected List<ReactPackage> getPackages() {@SuppressWarnings("UnnecessaryLocalVariable")List<ReactPackage> packages = new PackageList(this).getPackages();//RN0.60以下需要打开,注意导包JPushPackage//packages.add(new JPushPackage());return packages;}@Overrideprotected String getJSMainModuleName() {return "index";}};@Overridepublic ReactNativeHost getReactNativeHost() {return mReactNativeHost;}@Overridepublic void onCreate() {super.onCreate();SoLoader.init(this, /* native exopackage */ false);//调用此方法:点击通知让应用从后台切到前台JPushModule.registerActivityLifecycle(this);}
}

 

2.2 iOS

注意:您需要打开ios目录下的.xcworkspace文件修改您的包名

2.2.1 pod

pod install
  • 注意:如果项目里使用pod安装过,请先执行命令

    pod deintegrate
    

2.2.2 手动方式

  • Libraries

    Add Files to "your project name"
    node_modules/jcore-react-native/ios/RCTJCoreModule.xcodeproj
    node_modules/jpush-react-native/ios/RCTJPushModule.xcodeproj
    
  • Capabilities

    Push Notification --- ON
    
  • Build Settings

    All --- Search Paths --- Header Search Paths --- +
    $(SRCROOT)/../node_modules/jcore-react-native/ios/RCTJCoreModule/
    $(SRCROOT)/../node_modules/jpush-react-native/ios/RCTJPushModule/
    
  • Build Phases

    libz.tbd
    libresolv.tbd
    UserNotifications.framework
    libRCTJCoreModule.a
    libRCTJPushModule.a

 

ios的还需要如下设置:

xxx.xcodeproj的General需要添加以下库依赖:

Signing&Capabilities需要添加push notifications(这个要注意,只有编译的密钥包含push notification权限时才可以添加,否则点击添加Capabilities按钮,选择push notification长按之后也无法添加到Signing&Capabilities下面),如果不加该配置,极光推送无法成功;

AppDelegate.m文件的修改如下:

重点关注appKey,这个是极光后台的appKey,

然后是apsForProduction,如果是YES,表示是生产环境,如果是NO,表示是开发环境,需要注意,前端设置和后台设置需要保持一致,后台(platform.all())默认是生产环境

另外还需要注意一点,如果xcode工程和证书配置都没问题,那么要注意是不是第三方库重写了didRegisterForRemoteNotificationsWithDeviceToken方法,目前已知环信会有该问题,如果是这种情况,需要自己修改

/*** Copyright (c) 2015-present, Facebook, Inc.** This source code is licensed under the MIT license found in the* LICENSE file in the root directory of this source tree.*/#import "AppDelegate.h"#import <CodePush/CodePush.h>#import <React/RCTBundleURLProvider.h>#import <React/RCTRootView.h>#import <React/RCTBridge.h>#import <RCTJPushModule.h>#import <React/RCTLog.h>#ifdef NSFoundationVersionNumber_iOS_9_x_Max#import <UserNotifications/UserNotifications.h>#endif@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{//设置日志级别,release默认只打印error,这样设置之后js console日志也会打印//RCTSetLogThreshold(RCTLogLevelTrace);RCTSetLogThreshold(RCTLogLevelInfo-1);NSLog(@"jpush launchOptions");// JPush初始化配置//开发环境调试使用的证书(cn.com.whty.merchant)//  [JPUSHService setupWithOption:launchOptions appKey:@"d42ca563974184597fca2769"//      channel:@"dev" apsForProduction:NO];//生产环境发布使用的证书(cn.com.whty.merchantApp)apsForProduction;yes表示生产环境,no表示开发环境[JPUSHService setupWithOption:launchOptions appKey:@"d36889b3f357ffda4df224f8"channel:@"pro" apsForProduction:YES];// APNSJPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];if (@available(iOS 12.0, *)) {entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound|JPAuthorizationOptionProvidesAppNotificationSettings;}[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];[launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];// 自定义消息NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];[defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];// 地理围栏[JPUSHService registerLbsGeofenceDelegate:self withLaunchOptions:launchOptions];// ReactNative环境配置RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridgemoduleName:@"merchant_app"initialProperties:nil];NSLog(@"jpush launchOptions init end");rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];UIViewController *rootViewController = [UIViewController new];rootViewController.view = rootView;self.window.rootViewController = rootViewController;[self.window makeKeyAndVisible];return YES;}- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge{#if DEBUGreturn [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];#elsereturn [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];#endif}//************************************************JPush start************************************************//注册 APNS 成功并上报 DeviceToken- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {NSLog(@"jpush didRegisterForRemoteNotificationsWithDeviceToken deviceToken: %@" , deviceToken);[JPUSHService registerDeviceToken:deviceToken];}//注册 APNS失败- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSData *)deviceToken {NSLog(@"jpush didFailToRegisterForRemoteNotificationsWithError deviceToken: %@" , deviceToken);}//iOS 7 APNS- (void)application:(UIApplication *)application didReceiveRemoteNotification:  (NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {// iOS 10 以下 RequiredNSLog(@"jpush completionHandler iOS 7 APNS");[JPUSHService handleRemoteNotification:userInfo];[[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_ARRIVED_EVENT object:userInfo];completionHandler(UIBackgroundFetchResultNewData);}//iOS 10 前台收到消息- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center  willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {NSLog(@"jpush NotificationCenter iOS 10 APNS 前台收到消息");NSDictionary * userInfo = notification.request.content.userInfo;if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {// ApnsNSLog(@"jpush iOS 10 APNS 前台收到消息");[JPUSHService handleRemoteNotification:userInfo];[[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_ARRIVED_EVENT object:userInfo];}else {// 本地通知 todoNSLog(@"jpush iOS 10 本地通知 前台收到消息");[[NSNotificationCenter defaultCenter] postNotificationName:J_LOCAL_NOTIFICATION_ARRIVED_EVENT object:userInfo];}//需要执行这个方法,选择是否提醒用户,有 Badge、Sound、Alert 三种类型可以选择设置completionHandler(UNNotificationPresentationOptionAlert);}//iOS 10 消息事件回调- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler: (void (^)(void))completionHandler {NSLog(@"jpush NotificationCenter iOS 10 APNS 消息事件回调");NSDictionary * userInfo = response.notification.request.content.userInfo;if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {// ApnsNSLog(@"jpush iOS 10 APNS 消息事件回调");[JPUSHService handleRemoteNotification:userInfo];// 保障应用被杀死状态下,用户点击推送消息,打开app后可以收到点击通知事件[[RCTJPushEventQueue sharedInstance]._notificationQueue insertObject:userInfo atIndex:0];[[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_OPENED_EVENT object:userInfo];}else {// 本地通知NSLog(@"jpush iOS 10 本地通知 消息事件回调");// 保障应用被杀死状态下,用户点击推送消息,打开app后可以收到点击通知事件[[RCTJPushEventQueue sharedInstance]._localNotificationQueue insertObject:userInfo atIndex:0];[[NSNotificationCenter defaultCenter] postNotificationName:J_LOCAL_NOTIFICATION_OPENED_EVENT object:userInfo];}// 系统要求执行这个方法completionHandler();}//自定义消息- (void)networkDidReceiveMessage:(NSNotification *)notification {NSDictionary * userInfo = [notification userInfo];NSLog(@"jpush 自定义消息回调");[[NSNotificationCenter defaultCenter] postNotificationName:J_CUSTOM_NOTIFICATION_EVENT object:userInfo];}//************************************************JPush end************************************************@end

 三、客户端集成成功之后,可以先使用极光开发者的控制台测试极光推送,能正常收到消息,说明极光推送配置成功。

 

http://www.xdnf.cn/news/794251.html

相关文章:

  • AVR Mega16的熔丝位用法总结
  • 如何安装xvidcore
  • 《密码爆破漏洞详解》——黑客必修的入门操作( 建议收藏 )
  • 推荐两款在线日程(任务)管理的站点
  • 四色定理
  • 学英语相关网站
  • 5款伊思儷超媒體繁体游戏 简体中文补丁
  • 二、函数调用包含单个参数之整型-ECX寄存器,LEA指令
  • 记一次分表的实操(ShardingSphere)
  • 【VLAs篇】01:GROOT N1—面向通用人形机器人的开放基础模型
  • Win11/Win10 打不开 gpedit.msc 之 组策略编辑器安装
  • Pycharm的使用技巧总结
  • Rag技术----项目博客(六)
  • Linux 6.x源码解剖:从start_kernel到第一个用户进程
  • SIFT 算法原理详解
  • 深度学习入门Day2--鱼书学习(1)
  • DeepSeek眼中的文明印记:山海经
  • 便签软件哪个好用,最好用的免费便签软件介绍
  • 解锁电商新势能:商城系统自动 SaaS 多开功能深度解析
  • 【第三章】大模型预训练全解析:定义、数据处理、流程及多阶段训练逻辑
  • Ai大模型应用测试点分享
  • 远程终端登录和桌面访问(嵌入式开发)
  • Flowise 本地部署文档及 MCP 使用说明
  • 嵌入式学习 D32:系统编程--进程间通信IPC
  • 数字化时代养老机构运营实训室建设方案:养老机构运营沙盘实训模块设计
  • 直接插入排序
  • CppCon 2014 学习:The New Old Thing
  • invalid domain [10.230.90.11:2025] was specified for this cookie异常原因分析
  • 小黑一步步探索大模型应用:langchain中AgentExecutor的call方法初探demo(智能体调用)
  • OD 算法题 B卷【通过软盘拷贝文件】