React Native Android JPush消息推送集成

来源:互联网 发布:php网站模板下载不了 编辑:程序博客网 时间:2024/06/05 03:36

React Native JPush消息推送集成

  • React Native JPush消息推送集成
    • 写在前面
    • 正文
    • 集成步骤
      • JPush注册账号以及创建一个应用
      • 开始集成
      • 混淆配置
      • 在代码中的配置
      • 运行你的应用检查JPush是否正常工作
  • 上面的都不是重点下面的才是重点
    • 开发过程中遇到的坑的总结
      • 关于React Native的ndk配置
      • 通知图标的自定义

写在前面

这是第一次利用马克飞象和印象笔记记录实际开发中的经验总结。回首过去几年的工作,在工作的经验的文字记录方面着实欠缺了很多,希望以后能将这个习惯保持下去。

正文

我之前一直从事Android原生应用的开发,前几个月公司有个新产品,决定使用React Native这种跨平台方式进行开发,也算是一个尝试。RN的这个项目由一位有RN开发经验的前端开发人员和一位IOS开发人员进行开发,因为我手里还有其他项目,所以没有一开始就参与到RN的开发当中去。因为其中一位同事是IOS的,所以开发过程中的测试一直是以IOS为主,当项目差不多要出来0.1版本的时候,Android版第三方SDK的集成还需要我这个Android原生开发去做,借此机会,我也就参与到RN的项目中了。

此次主要是RN项目两个第三方SDK(云信和JPush)中的JPush集成的经验总结,相对于集成云信,JPush的集成过程相对来说要简单得太多,总的来说基本上都是按照JPush官网Android SDK集成指南去做的,但是还是有一些坑值得记录一下。

集成步骤

JPush注册账号以及创建一个应用

注册账号这个好像没有什么好说的,登录极光官网点击右上角的注册按钮,接下来你就能看到下图所示的页面,输入常用邮箱和能记得住的密码。可能还需要开发者认证什么的,我去看了一下,我的账户应该是没有进行开发者认证,但是推送集成并不影响。
这里写图片描述

登录之后,通过右上角进入控制台
这里写图片描述

这个是我的个人的极光账号,如果是为公司开发项目,切记让经理去申请一个公司的账号,要不然都以后交接就很麻烦了。
如图我已经创建了几个应用用于测试了。新创建应用点击右上角的创建应用按钮。
这里写图片描述

在新打开的界面中输入你的app名称,如果我没记错的话,可以随便输个,和你要集成的app真实名称不一样也行,图标传不传看心情。
这里写图片描述

创建完毕之后,就可以拿到AppKey和Master Secret了,下面集成配置的时候需要用到
这里写图片描述

开始集成

集成推荐使用jcenter自动集成,这样子会少很多事,正如官网所说:
这里写图片描述
jcenter会帮我们做很多事情,而不需要我们动手,下面很多都是照搬官网的。

  • 如果开发者需要修改组件属性,可以在本地的 AndroidManifest 中定义同名的组件并配置想要的属性,然后用 xmlns:tools 来控制本地组件覆盖 jcenter 上的组件。示例:
  • 这个我没有需求用到
<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.android.tests.flavorlib.app"    xmlns:tools="http://schemas.android.com/tools">    <application        android:icon="@drawable/icon"        android:name="com.example.jpushdemo.ExampleApplication"        android:label="@string/app_name" >        <service android:name="cn.jpush.android.service.PushService"            android:process=":multiprocess"            tools:node="replace" >            ……        </service>    ……  </application>  ……</manifest>
  • 确认android studio的 Project 根目录的主 gradle 中配置了jcenter支持。(新建project默认配置就支持)
buildscript {    repositories {        jcenter()    }    ......}allprojects {    repositories {        jcenter()    }}
  • 在 module 的 gradle 中添加依赖和AndroidManifest的替换变量。
  • 值得一说的是,JPush注册应用的时候并没有用到包名,applicationId这个属性是一般构建项目就默认自动带的,如果没有的话请自行按照你的应用的包名填写。
  • 另外对于RN的项目,在ndk添加cpu类型的时候还有一些坑
android {    ......    defaultConfig {        applicationId "com.xxx.xxx" //JPush上注册的包名.        ......        ndk {            //选择要添加的对应cpu类型的.so库。             abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'             // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'        }        manifestPlaceholders = [            JPUSH_PKGNAME : applicationId,            JPUSH_APPKEY : "你的appkey", //JPush上注册的包名对应的appkey.            JPUSH_CHANNEL : "自定义渠道名称", //用户渠道统计的渠道名称        ]        ......    }    ......}dependencies {    ......    compile 'cn.jiguang.sdk:jpush:3.0.5'  // 此处以JPush 3.0.5 版本为例。    compile 'cn.jiguang.sdk:jcore:1.1.2'  // 此处以JCore 1.1.2 版本为例。    ......}
  • 最后一点,需要注意在Project根目录中的gradle.properties文件添加
android.useDeprecatedNdk=true

混淆配置

这个很重要,每集成一个第三方sdk,切记要配置混淆,要不然到后面正式release的时候出错,可能半天也找不到问题在哪里

-dontoptimize-dontpreverify-dontwarn cn.jpush.**-keep class cn.jpush.** { *; }-dontwarn cn.jiguang.**-keep class cn.jiguang.** { *; }#==================gson && protobuf==========================-dontwarn com.google.**-keep class com.google.gson.** {*;}-keep class com.google.protobuf.** {*;}

在代码中的配置

  • 在自定义的MyAppliCation.java的onCreate()添加初始化的代码
public class MyApplication extends Application {@Override    public void onCreate() {        super.onCreate();        JPushInterface.setDebugMode(true);        JPushInterface.init(this);    }}

运行你的应用,检查JPush是否正常工作

  • 过滤日志,检查在应用启动后JPush是否正常 工作,如果正常的话,会输出如下日志

        [JPushInterface] action:init    .......    [PushService] Login succeed!
  • 而如果日志太多的话,可以使用ctrl+f对输出的日志进行搜索
    这里写图片描述
  • 记得过滤日志为Show only selected application,同时将调试的应用选成你的,如果输出没有问题的话,就可以尝试测试推送了

上面的都不是重点,下面的才是重点

开发过程中遇到的“坑”的总结

关于React Native的ndk配置

  • React Native项目创建过程中,会自动生成相应的Android的project,开发RN的Android版,也都是使用这个project,下图是RN项目工程的示例
    这里写图片描述
  • 对于RN的Android版本的开发,实际上就是直接使用Android Studio打开图中的Android目录作为project。
  • RN自动生成的Android项目,已经在app下的build.gradle中做了很多配置了,其中的ndk配置是这样的:
android {    compileSdkVersion 23    buildToolsVersion "23.0.1"    defaultConfig {        applicationId "com.awesomeproject"        minSdkVersion 16        targetSdkVersion 22        versionCode 1        versionName "1.0"        ndk {            abiFilters "armeabi-v7a", "x86"        }    }    splits {        abi {            reset()            enable enableSeparateBuildPerCPUArchitecture            universalApk false  // If true, also generate a universal APK            include "armeabi-v7a", "x86"        }    }    buildTypes {        release {            minifyEnabled enableProguardInReleaseBuilds            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"        }    }    // applicationVariants are e.g. debug, release    applicationVariants.all { variant ->        variant.outputs.each { output ->            // For each separate APK per architecture, set a unique version code as described here:            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits            def versionCodes = ["armeabi-v7a":1, "x86":2]            def abi = output.getFilter(OutputFile.ABI)            if (abi != null) {  // null for the universal-debug, universal-release variants                output.versionCodeOverride =                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode            }        }    }}
  • 虽然和标题不相符,但是在这里还是要提一下,buildToolsVersion版本React Native中文官网建议必须使用23.0.1,但是经过我亲测,23.0.3也可以使用,但是25.0.0以上的就不要想了,会有一堆解决不掉的错误,我也不明白为什么
    这里写图片描述
  • 回到正文,如上面贴出来的RN自动生成的project中的app的build.gradle的ndk配置了”armeabi-v7a”, “x86”,但是JPush官网的集成指南中有三种,同时还有其他更多的cpu类型的支持
    Alt text
  • 但是在RN的项目中,如果多配制那怕一种cpu类型,都会造成在运行的时候报错,我尝试着花费了不少时间去搜索解决方案,然并卵。因为按照之前的开发经验,一般都是配置第三方sdk建议的cpu类型,因为RN的问题,无法再这样做了。同时也因为我手头的测试机有限,对于cpu类型配置不全会造成什么影响还不得而知。

通知图标的自定义

  • 在集成完成之后,终于可以愉快滴进行推送测试了,但是发现推送的图标却还是Android机器人,有些不美观。
  • 按照官网的说明,JPush应该会自动使用的应用的图标最为通知栏推送的图标,但是实际运行下来发现并没有。我猜想可能是因为我的应用图标目录使用的是mipmap造成的,于是我新建了drawable-hdpi和drawable-xhdpi两个目录,按照JPush的要求,修改了图片的名称,下面这句是官网的说明:

        说明:若没有res/drawable-xxxx/jpush_notification_icon这个资源默认使用应用图标作为通知icon,在5.0以上系统将应用图标作为statusbar icon可能显示不正常,用户可定义没有阴影和渐变色的icon替换这个文件,文件名不要变
  • 于是乎我就按照官网将名称修改为了jpush_notification_icon,但是重新运行程序发现没有用,卸载重新安装还是没有用。

  • 机智的我警觉这里面应该是有坑的,于是我百度了一下,在yuanlvmao的博客–关于极光推送通知栏无法正确显示应用图标 找到了答案,这里写图片描述,你没有看错,就是要重启一下手机就好了,于是乎我照做了,通知的图标终于正常显示了
    这里写图片描述

全文毕。。。。

2017-07-03 3:04