ReactNative jPush集成的坑
最近项目需要适配小米、华为、魅族三方的推送,在集成的时候遇到了很多坑,目前将曾经遇到的坑整理一下,今后方便其它同学们集成。在集成之前应该仔细阅读jPush官方文档,特别是API的相关变更,建议抽一个jPushHelper中间层以适应jPush接口的变化。
- 确保推送的配置(
AppID,AppKey,AppSecret
)正确
登录三个平台相应的开发者网站获取这三个配置的信息。一般就放在管理控制台中,然后选择推送服务,里面会有相应的推送信息,这三个应用配置很重要,如果配置出错,极光后台的日志会打印显示REGISTER FAILED
。
- 确保jPush插件所带的jPush库与build.gradle中引入的推送库版本号一致。不一致有可能会导致收不到推送。
- 华为集成的坑
在集成华为推送后,华为上就会优先走华为的推送渠道。根据文档我们需要自己处理推送的消息体,传回给JS层。在这个时候遇到了很多问题。
1.如果获取消息体
只需在onCreate
中取出保存在intent
中的消息体,并处理成自己想要的格式。
if( getIntent().getData()) {
String pushInfo = getIntent().getData().toString();
}
2.消息体如果回传给JS端
获取reactContext
,并调用emit
方法监听回调给JS端,
public static void sendEvent(ReactContext reactContext, String eventName, WritableMap params) {
// eventName:监听事件名称 params:回调参数(推荐使用WritableMap)
ReactContext reactContext = getReactInstanceManager().getCurrentReactContext();
reactContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(eventName, params);
}
3.消息体如果回传时报错
当emit时,发现应用一直闪退,打印日志开出,此时的reactContext
为null,需要等待reactContext
初始完毕后,方可发送监听回调。所以需要暴露一个ReactMethod
给JS端,当这个方法执行时,发送广播给MainActivity
再执行推送点击的回调。
/**
* 当RN端加载完毕发送广播通知原声端
*
*/
@ReactMethod
public void loadingFinished() {
Log.e(TAG,"广播发送成功");
Intent intent = new Intent();
intent.setAction("com.loadingFinished"); //设置Action
intent.putExtra("msg", "接收动态注册广播成功!"); //添加附加信息
context.sendBroadcast(intent);
}
MainActivity
部分代码:
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.loadingFinished") && pushInfoString != null) { //动作检测
WritableMap map = Arguments.createMap();
map.putString("extras", getPushExtraString(pushInfoString));
sendPushInfoToJs(map);
}
}
};
- 其它的坑
1.部分华为手机需要开启自启动权限
才能在后台推送成功(华为系统做了限制,如果不是受信任的信用,不会再后台开启相应应用)有些系统较老的即使开启也不能在后台收到推送,好坑。。。
2.魅族推送有时会有一定延迟,大概相隔3-5min
才会收到推送(虽说事件不长,但要调试的时候要等一会就挺烦心的= =)
3.调用jPushModule
的setAlias
之前需确保推送当前是开启的,假如推送关闭会报errorCode:6012
(在JPush服务stop状态下设置了tag或alias或手机号码 )
4.在3的基础下,假如第一次想清除之前App的alias
,则需要确保新的alias
注册成功后才能调用stop push
。
网友评论