UNPKG

jpush-rn

Version:

极光推送 JPush SDK 的 React Native 封装,支持 Android 和 iOS (Fork of jpush-react-native)

238 lines (173 loc) 7.74 kB
# JPush-RN 极光推送 `JPush` SDK 的 `React Native` 封装,支持 `Android``iOS`,Fork 自 [jpush-react-native](https://github.com/jpush/jpush-react-native)。 ---- 为啥自己维护一份呢?因为官方 `jpush-react-native` 项目做得比较早,各方面更新比较慢。最初我跟着 `jpush-react-native` 文档配置,很多东西没生效,最后去看官方 [Android SDK 集成](https://docs.jiguang.cn/jpush/client/Android/android_guide)和 [iOS SDK 集成](https://docs.jiguang.cn/jpush/client/iOS/ios_guide_new)文档才恍然大悟。我把这部分的配置说明写在本文档下方,希望对你有帮助。 如果有一点 Android 和 iOS 开发经验,建议也去看下官方的[客户端 SDK](https://docs.jiguang.cn/jpush/client/)文档,很多问题在里面都可以找到答案。 有疑问或者本项目存在问题,请在 [Issues](https://github.com/atypiape/jpush-rn/issues) 中反馈,非常感谢。 **备注:** - 对 Android 14 (API 34) 做了适配。 - 修复 iOS 报错:"JPushModule.setDebugMode(): Error while converting JavaScript argument 0 to Objective C type BOOL. Objective C type BOOL is unsupported." ## 1. 安装 依赖到 `JCore` SDK,所以 [jcore-rn](https://www.npmjs.com/package/jcore-rn) 也需要安装。 **NPM:** ```bash npm i jcore-rn jpush-rn ``` **YARN:** ```bash yarn add jcore-rn jpush-rn ``` ## 2. SDK 版本 ### 2.1. Android `Android` 使用 `mavenCentral` 自动集成 [JPush](https://mvnrepository.com/artifact/cn.jiguang.sdk/jpush) SDK,当前版本为 `5.7.0`### 2.2. iOS `iOS` 使用 `Cocoapods` 自动导入 [JPush](https://cocoapods.org/pods/JPush) SDK,当前版本为 `5.6.0`## 3. 配置 ### 3.1 Android #### 3.1.1 链接静态库 React Native 0.60 及以上版本是自动链接的,无需理会。如果你的项目是 `0.59` 及以下版本,请参考 [jpush-react-native](https://www.npmjs.com/package/jpush-react-native) 中的手动配置方式。 #### 3.1.2 添加 JPush 配置 _\(参考 https://docs.jiguang.cn/jpush/client/Android/android_guide)_ * 修改 `android/build.gradle`,添加以下内容: ```groovy android { defaultConfig { applicationId "yourApplicationId" // 在此替换你的应用包名 ... manifestPlaceholders = [ JPUSH_PKGNAME : applicationId, JPUSH_APPKEY: "yourAppKey", // 在此替换你的 APPKey JPUSH_CHANNEL: "yourChannel" // 在此替换你的 channel ] } } ``` * 修改 `android/app/src/main/AndroidManifest.xml`,添加以下内容: ```xml <!-- Required. For publish channel feature --> <!-- JPUSH_CHANNEL 是为了方便开发者统计 APK 分发渠道。--> <!-- 例如: --> <!-- 发到 Google Play 的 APK 可以设置为 google-play; --> <!-- 发到其他市场的 APK 可以设置为 xxx-market。 --> <meta-data android:name="JPUSH_CHANNEL" android:value="${JPUSH_CHANNEL}" /> <!-- Required. AppKey copied from Portal --> <meta-data android:name="JPUSH_APPKEY" android:value="${JPUSH_APPKEY}" /> ``` * 修改 `android/app/proguard-rules.pro`,添加以下内容: ```groovy -dontoptimize -dontpreverify -dontwarn cn.jpush.** -keep class cn.jpush.** { *; } -keep class * extends cn.jpush.android.service.JPushMessageReceiver { *; } -dontwarn cn.jiguang.** -keep class cn.jiguang.** { *; } ``` #### 3.1.3 重新编译项目 正常情况下,执行 `react-native run-android` 编译运行即可。 如果报错,可以尝试清除缓存,再重新编译: ```bash # 清除 Android 编译缓存 cd android ./gradlew clean rm -rf .gradle cd .. # 删除 node_modules 目录,重新安装依赖 rm -rf node_modules npm install # 或者 yarn install ``` ### 3.2 iOS #### 3.2.1 链接静态库 React Native 0.60 及以上版本,只需执行下面的命令即可。如果你的项目是 `0.59` 及以下版本,请参考 [jpush-react-native](https://www.npmjs.com/package/jpush-react-native) 中的手动配置方式。 ```bash cd ios pod install ``` 如果报错,可尝试执行命令: ```bash pod deintegrate ``` #### 3.2.2 添加 JPush 配置 _\(参考 https://docs.jiguang.cn/jpush/client/iOS/ios_guide_new)_ **引入头文件** 将以下代码添加到 `AppDelegate.m` 引用头文件的位置 ```objc // 引入 jpush-rn 模块头文件 #import <RCTJPushModule.h> #import "JPUSHService.h" // iOS10 注册 APNs 所需头文件 #ifdef NSFoundationVersionNumber_iOS_9_x_Max #import <UserNotifications/UserNotifications.h> #endif // 如果需要使用 idfa 功能,引入所需要的头文件(可选) // #import <AdSupport/AdSupport.h> ``` **添加初始化 APNs 代码** 将以下代码添加到 `AppDelegate.m` 文件的 `-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions` 中: ```objc // Required, 初始化 APNs JPUSHRegisterEntity *entity = [[JPUSHRegisterEntity alloc] init]; if (@available(iOS 12.0, *)) { entity.types = JPAuthorizationOptionAlert | JPAuthorizationOptionBadge | JPAuthorizationOptionSound | JPAuthorizationOptionProvidesAppNotificationSettings; } [JPUSHService registerForRemoteNotificationConfig:entity delegate:(id<JPUSHRegisterDelegate>)self]; ``` **注册 APNs 成功回调方法,并上报 DeviceToken** 将以下代码添加到 `AppDelegate.m` 文件中: ```objc - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { /// Required - 注册 DeviceToken [JPUSHService registerDeviceToken:deviceToken]; } ``` **添加处理 APNs 通知回调方法** 将以下代码添加到 `AppDelegate.m` 文件中: ```objc // iOS 12 Support - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center openSettingsForNotification:(UNNotification *)notification { if (notification && [notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { // 从通知界面直接进入应用 } else { // 从通知设置界面进入应用 } } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler: (void (^)(UIBackgroundFetchResult))completionHandler { // Required, iOS 7 Support [JPUSHService handleRemoteNotification:userInfo]; // 传递给 React Native [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_ARRIVED_EVENT object:userInfo]; completionHandler(UIBackgroundFetchResultNewData); } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { // Required, For systems with less than or equal to iOS 6 [JPUSHService handleRemoteNotification:userInfo]; } // 自定义消息 - (void)networkDidReceiveMessage:(NSNotification *)notification { NSDictionary *userInfo = [notification userInfo]; [[NSNotificationCenter defaultCenter] postNotificationName:J_CUSTOM_NOTIFICATION_EVENT object:userInfo]; } ``` **关于应用内消息** [官方文档](https://docs.jiguang.cn/jpush/client/iOS/ios_sdk#%E5%BA%94%E7%94%A8%E5%86%85%E6%B6%88%E6%81%AF)中有提到,应用内消息默认不展示,可通过[获取接口](https://docs.jiguang.cn/jpush/client/iOS/ios_api#%E8%8E%B7%E5%8F%96%E8%87%AA%E5%AE%9A%E4%B9%89%E6%B6%88%E6%81%AF%E6%8E%A8%E9%80%81%E5%86%85%E5%AE%B9)自行编码处理。 ## 4. 点击通知,打开 URL/DeepLink 如果想点击通知打开 URL 或 DeepLink,可以参考 `React Native` 官方文档的 [APIs - Linking](https://reactnative.dev/docs/linking) 部分。