美文网首页
ReactNative jPush集成的坑

ReactNative jPush集成的坑

作者: SunnyEver0 | 来源:发表于2018-06-19 17:36 被阅读31次

    ReactNative jPush集成的坑

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

    • 确保推送的配置(AppID,AppKey,AppSecret)正确
      登录三个平台相应的开发者网站获取这三个配置的信息。一般就放在管理控制台中,然后选择推送服务,里面会有相应的推送信息,这三个应用配置很重要,如果配置出错,极光后台的日志会打印显示REGISTER FAILED
    小米推送相关信息.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集成的坑

          本文链接:https://www.haomeiwen.com/subject/kbajeftx.html