React Native之通知栏消息提示(android)

一,需求分析与概述

1.1,推送作为手机应用的基本功能,是手机应用的重要部分,如果自己实现一套推送系统费时费力,所以大部分的应用都会选择使用第三方的推送服务,如极光推送。

1.2,jpush-react-native是极光推送官方开发的 React Native 版本插件,可以快速集成推送功能。现在最新版本的 JPush SDK 分离了 JPush 及 JCore,让开发者可以分开集成 JMessage 及 JPush(以前 JMessage 包含了 JPush)。

API:

  1. #初始化JPush 必须先初始化才能执行其他操作(only android)
  2. initPush
  3.  
  4. getInfo
  5.  
  6. #执行该方法后,无法接收到通知
  7. stopPush
  8.  
  9. #stopPush后,执行该方法,可接收通知(only android)
  10. resumePush
  11.  
  12. #参数是func,func的参数是registrationId
  13. getRegistrationID
  14.  
  15. #设置标签
  16. setTags
  17.  
  18. #添加标签
  19. addTags
  20.  
  21. #删除标签
  22. deleteTags
  23.  
  24. #检查标签的状态
  25. checkTagBindState
  26.  
  27. #清除所有标签
  28. cleanTags
  29.  
  30. #设置别名
  31. setAlias
  32.  
  33. #删除别名
  34. deleteAlias
  35.  
  36. #获取别名
  37. getAlias
  38.  
  39. #通知栏样式:Basic
  40. setStyleBasic
  41.  
  42. #通知栏样式:Custom
  43. setStyleCustom

1.3,推送通知可以及时地提醒用户.

二,极光推送注册与集成

2.1,注册

首先,登录极光官网系统,如果还没有账号可以注册一个,登录成功我们就可以创建和管理我们的应用了。

2.2,集成(android)

第一步:安装

打开终端,进入项目根目录文件夹下,执行以下命令:

  1. npm install jpush-react-native --save
  2. jpush-react-native 1.4. 版本以后需要同时安装 jcore-react-native
  3. npm install jcore-react-native --save

第二步:配置

自动关联配置

  1. # 针对性的link,避免之前手动配置的其它插件重复配置造成报错
  2. react-native link jpush-react-native
  3. react-native link jcore-react-native

执行完 link 项目后可能会出现报错,这没关系,需要手动配置一下 build.gradle 文件。如自动配置没有成功或没有完善,可根据手动配置检查

手动配置

(1),检查 android 项目下的 settings.gradle 配置有没有包含以下内容(project/android/settings.gradle):

  1. include ':jcore-react-native'
  2. project(':jcore-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/jcore-react-native/android')
  3.  
  4. include ':jpush-react-native'
  5. project(':jpush-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/jpush-react-native/android')

(2),project/android/app/build.gradle:

  1. android {
  2. ...
  3. defaultConfig {
  4. applicationId "yourApplicationId" // 此处改成你在极光官网上申请应用时填写的包名
  5. ...
  6. manifestPlaceholders = [
  7. JPUSH_APPKEY: "yourAppKey", //在此替换你极光官网上申请的 APPKey
  8. APP_CHANNEL: "developer-default" //应用渠道号, 默认即可
  9. ]
  10. }
  11. }
  12. ...
  13. dependencies {
  14. compile project(':jpush-react-native') // 添加 jpush 依赖
  15. compile project(':jcore-react-native') // 添加 jcore 依赖
  16. compile fileTree(dir: "libs", include: ["*.jar"])
  17. compile "com.android.support:appcompat-v7:23.0.1"
  18. compile "com.facebook.react:react-native:+" // From node_modules
  19. }

(3),检查一下 app 下的 AndroidManifest 配置,有没有增加 <meta-data> 部分。 project/android/app/src/main/AndroidManifest.xml:

  1. <application
  2. ...
  3. <!-- Required . Enable it you can get statistics data with channel -->
  4. <meta-data android:name="JPUSH_CHANNEL" android:value="${APP_CHANNEL}"/>
  5. <meta-data android:name="JPUSH_APPKEY" android:value="${JPUSH_APPKEY}"/>
  6.  
  7. </application>

(4),打开 project/android/app/src/main/java/com/项目名/下的 MainApplication.java 文件,然后加入 JPushPackage

  1. ...
  2.  
  3. import com.rt2zz.reactnativecontacts.ReactNativeContacts;
  4. import cn.jpush.reactnativejpush.JPushPackage;
  5.  
  6. ...
  7.  
  8. public class MainApplication extends Application implements ReactApplication {
  9. // 设置为 true 将不会弹出 toast
  10. private boolean SHUTDOWN_TOAST = false;
  11. // 设置为 true 将不会打印 log
  12. private boolean SHUTDOWN_LOG = false;
  13. private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
  14. @Override
  15. public boolean getUseDeveloperSupport() {
  16. return BuildConfig.DEBUG;
  17. }
  18.  
  19. @Override
  20. protected List<ReactPackage> getPackages() {
  21. return Arrays.<ReactPackage>asList(
  22. new MainReactPackage(),
  23. new JPushPackage(SHUTDOWN_TOAST, SHUTDOWN_LOG)
  24. );
  25. }
  26.  
  27. ...
  28.  
  29. }

(5),打开 project/android/app/src/main/java/com/项目名/下的MainActivity.java 文件,然后加入 如下代码:

  1. ...
  2.  
  3. import android.os.Bundle;
  4. import com.facebook.react.ReactActivity;
  5. import cn.jpush.android.api.JPushInterface;
  6.  
  7. public class MainActivity extends ReactActivity {
  8.  
  9. ...
  10.  
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. JPushInterface.init(this);
  15. }
  16.  
  17. @Override
  18. protected void onPause() {
  19. super.onPause();
  20. JPushInterface.onPause(this);
  21. }
  22.  
  23. @Override
  24. protected void onResume() {
  25. super.onResume();
  26. JPushInterface.onResume(this);
  27. }
  28.  
  29. @Override
  30. protected void onDestroy() {
  31. super.onDestroy();
  32. }
  33. }

(6),打开  project/android/app/src/main/下的AndroidManifest.xml 文件,然后添加访问通知的权限:

  1. <!--添加通知权限,${ApplicationID}替换成你的applicationID!-->
  2. <premission
  3. android:name="${ApplicationID}.permission.JPUSH_MESSAGE"
  4. android:protectionLevel="signature"/>

这样就基本完成了所有的配置。接下来就可以在 JS 中调用插件提供的 API 了。

三,使用与实现

3.1,使用

(1),在js中 1 import React, { PureComponent } from 'react';

  1. import {
  2. Linking,
  3. Alert
  4. } from 'react-native';
  5. import JPushModule from 'jpush-react-native'
  6.  
  7. ...
  8.  
  9. componentDidMount() {
  10. /****************************通知 start **************************************************/
  11. if (Platform.OS === 'android') {
  12. JPushModule.initPush()
  13. // 新版本必需写回调函数
  14. JPushModule.notifyJSDidLoad(resultCode => {
  15. if (resultCode === 0) {
  16. }
  17. })
  18. } else {
  19. JPushModule.setupPush()
  20. }
  21. // 接收自定义消息
  22. this.receiveCustomMsgListener = map => {
  23. this.setState({
  24. pushMsg: map.content
  25. })
  26. console.log('extras: ' + map.extras)
  27. }
  28.  
  29. // 接收自定义消息JPushModule.addReceiveCustomMsgListener(this.receiveCustomMsgListener)
  30. this.receiveNotificationListener = map => {
  31. console.log('alertContent: ' + map.alertContent)
  32. console.log('extras: ' + map.extras)
  33. }
  34. // 接收推送通知
  35. JPushModule.addReceiveNotificationListener(this.receiveNotificationListener)
  36. // 打开通知
  37. this.openNotificationListener = map => {
  38. // console.log('Opening notification!')
  39. // console.log('map.extra: ' + map.extras)
  40. let webUrl= JSON.parse(map.extras).webUrl
  41. let url = webUrl.replace(new RegExp("\/", 'g'), "/")
  42. Linking.canOpenURL(url).then(supported => {
  43. if (!supported) {
  44. Alert.alert('您的系统不支持打开浏览器!')
  45. } else {
  46. return Linking.openURL(url);
  47. }
  48. }).catch(err => { });
  49.  
  50. }
  51. JPushModule.addReceiveOpenNotificationListener(this.openNotificationListener)
  52.  
  53. // this.getRegistrationIdListener = registrationId => {
  54. // console.log('Device register succeed, registrationId ' + registrationId)
  55. // }
  56. // JPushModule.addGetRegistrationIdListener(this.getRegistrationIdListener)
  57. /****************************通知 end **************************************************/
  58.  
  59. }
  60. componentWillUnmount() {
  61. JPushModule.removeReceiveCustomMsgListener(this.receiveCustomMsgListener)
  62. JPushModule.removeReceiveNotificationListener(this.receiveNotificationListener)
  63. JPushModule.removeReceiveOpenNotificationListener(this.openNotificationListener)
  64. // JPushModule.removeGetRegistrationIdListener(this.getRegistrationIdListener)
  65. // console.log('Will clear all notifications')
  66. // JPushModule.clearAllNotifications()
  67. }
  68.  
  69. }
  70.  
  71. ...

(2),在极光官网上推送

3.2,实现的效果

问题:

1,真机没接收到通知

解决:打开node_modules/jpush_react-native/android/src/AndroidManifest.xml,将所有的${applicationId}替换成你的包名。或将project/android/src/AndroidManifest.xml,的${applicationId}替换成你的包名。

  1. ...
  2.  
  3. <application
  4. android:name=".MainApplication"
  5. android:allowBackup="true"
  6. android:icon="@drawable/ic_launcher"
  7. android:label="@string/app_name"
  8. android:theme="@style/AppTheme">
  9. <activity
  10. android:name=".MainActivity"
  11. android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
  12. android:label="@string/app_name">
  13. <intent-filter>
  14. <action android:name="android.intent.action.MAIN" />
  15. <category android:name="android.intent.category.LAUNCHER" />
  16. </intent-filter>
  17. </activity>
  18.  
  19. ...
  20.  
  21. <!-- Required . Enable it you can get statistics data with channel -->
  22. <meta-data android:name="JPUSH_CHANNEL" android:value="${APP_CHANNEL}"/>
  23. <meta-data android:name="JPUSH_APPKEY" android:value="${JPUSH_APPKEY}"/>
  24.  
  25. </application>

.MainApplication和.MainActivity前添加包名

React Native之通知栏消息提示(android)的更多相关文章

  1. React Native之通知栏消息提示(ios)

    React Native之通知栏消息提示(ios) 一,需求分析与概述 详情请查看:React Native之通知栏消息提示(android) 二,极光推送注册与集成 2.1,注册 详情请查看:Rea ...

  2. WEB通知和React Native之即时通讯(iOS Android)

    WEB通知和React Native之即时通讯(iOS Android) 一,需求分析 1.1,允许服务器主动发送信息给客户端,客户端能监听到并且能接收. 1.2,为了方便同一个系统内的用户可以指定某 ...

  3. React Native之微信分享(iOS Android)

    React Native之微信分享(iOS Android) 在使用React Native开发项目的时候,基本都会使用到微信好友或者微信朋友圈分享功能吧,那么今天我就带大家实现以下RN微信好友以及朋 ...

  4. React Native之(支持iOS与Android)自定义单选按钮(RadioGroup,RadioButton)

    React Native之(支持iOS与Android)自定义单选按钮(RadioGroup,RadioButton) 一,需求与简单介绍 在开发项目时发现RN没有给提供RadioButton和Rad ...

  5. React Native 真机调试(iOS / Android)

    React Native 真机调试(iOS / Android) https://reactnative.dev/docs/running-on-device https://developer.ap ...

  6. 30天React Native从零到IOS/Android双平台发布总结

    前言 本人有近十年的技术背景,除了APP开发之外对后端.前端等都比较熟悉,近期做一个APP项目需要IOS.Android两个平台都需要,只能硬着头皮上.其实很早就想开发APP也很早就接触Android ...

  7. React Native 组建之IOS和Android通用抽屉

    /** * Sample React Native App * https://github.com/facebook/react-native * @flow *npm:https://www.np ...

  8. react native报错处理com.android.build.api.transform.TransformException: com.android.builder.dexing.DexArchiveBuilderException: com.android.builder.dexing.DexArchiveBuilderException: Failed to process

    背景:最近准备在使用react-native开发的app中接入友盟,来进行用户行为统计,分享,授权登录等操作. 在使用的过程中,遇到了一些错误信息,在此记录一下. 在修改android目录下的buil ...

  9. React Native踩坑之启动android模拟器失败

    报错 Could not install the app on the device, read the error above for details.Make sure you have an A ...

随机推荐

  1. AOP的底层实现:JDK动态代理与Cglib动态代理

    转载自 https://www.cnblogs.com/ltfxy/p/9872870.html SpringAOP底层的实现原理: JDK动态代理:只能对实现了接口的类产生代理.(实现接口默认JDK ...

  2. Angular之模态弹窗ui-bootstrap-modal及轻量级弹窗ngDialog

    ui-bootstrap 中模态 官网 angular-ui-bootstrap   对于ui-bootstrap集成大量指令如折叠ui.bootstrap.accordion.时间插件ui.boot ...

  3. python 反射、md5加密

    一.issubclass,type,isinstance 1.issubclass :判断xx类是否是yyy类型(包括子类),用于类之间的判定 class GrandF: pass class Fat ...

  4. 5.05-requests_cookies2

    import requests # 请求数据url member_url = 'https://www.yaozh.com/member/' headers = { 'User-Agent': 'Mo ...

  5. 关于 chrome canary X64 在 win7 64bit 下面缺少openvr_api.dll的解决方法

    在github上下载openvr_api.dll放到chrome的安装目录下就可以. 其实放到系统目录下最好,以后其他程序要使用的时候也能使用的到. https://github.com/ValveS ...

  6. y7000笔记本 darknet-yolo安装与测试(Ubuntu18.04+Cuda9.0+Cudnn7.1)

    环境配置看上一贴 https://www.cnblogs.com/clemente/p/10386479.html 1 安装darknet 1-1 克隆darknet repo git clone h ...

  7. 【转】TCP和SOCKET关系

    socket是TCP/IP协议的API   TCP是数据的介质,Socket是TCP的介质. 查了一下RFC文档,Socket是RFC147,更新时间是1971年.TCP是RFC793,更新时间是19 ...

  8. JavaScript输入表单数据正则验证规则

    emailNameReg: /^(([a-zA-Z0-9]+\w*((\.\w+)|(-\w+))*[\.-]?[a-zA-Z0-9]+)|([a-zA-Z0-9]))$/, //匹配邮箱名称 ema ...

  9. log4net配置文件

    <?xml version="1.0" encoding="utf-8"?> <configuration> <configSec ...

  10. 【原创】三招搞死你的IE11,可重现代码下载(IE Crash keyframes iframe)!

    前言 很多人都知道我们在做FineUI控件库,而且我们也做了超过 9 年的时间,在和浏览器无数次的交往中,也发现了多个浏览器自身的BUG,并公开出来方便大家查阅: 分享IE7一个神奇的BUG(不是封闭 ...