React Native JPush消息推送集成
写在前面
这是第一次利用马克飞象和印象笔记记录实际开发中的经验总结。回首过去几年的工作,在工作的经验的文字记录方面着实欠缺了很多,希望以后能将这个习惯保持下去。
正文
我之前一直从事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类型的支持
- 但是在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