ReactNative jPush集成的坑

ReactNative jPush集成的坑

最近项目需要适配小米、华为、魅族三方的推送,在集成的时候遇到了很多坑,目前将曾经遇到的坑整理一下,今后方便其它同学们集成。在集成之前应该仔细阅读jPush官方文档,特别是API的相关变更,建议抽一个jPushHelper中间层以适应jPush接口的变化。

  • 确保推送的配置(AppID,AppKey,AppSecret)正确
    登录三个平台相应的开发者网站获取这三个配置的信息。一般就放在管理控制台中,然后选择推送服务,里面会有相应的推送信息,这三个应用配置很重要,如果配置出错,极光后台的日志会打印显示REGISTER FAILED
ReactNative jPush集成的坑_第1张图片
小米推送相关信息.jpg
  • 确保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.调用jPushModulesetAlias之前需确保推送当前是开启的,假如推送关闭会报errorCode:6012(在JPush服务stop状态下设置了tag或alias或手机号码 )
    4.在3的基础下,假如第一次想清除之前App的alias,则需要确保新的alias注册成功后才能调用stop push

你可能感兴趣的:(ReactNative jPush集成的坑)