美文网首页
React Native 0.60以上版本集成codepush

React Native 0.60以上版本集成codepush

作者: Evan_Zhang_AU | 来源:发表于2019-11-15 10:13 被阅读0次

    这里主要想解决的是安卓版本自定义服务器不生效的问题。
    我们使用的版本信息如下:

    "react-native": "^0.61.4",
    "react-native-code-push": "^5.7.0",
    

    react native升级到0.60后,增加了auto link的功能,但是之前在MainApplication中手动添加代码packages.add(CODEPUSH_KEY, BuildConfig.DEBUG,mServerUrl));却会报错,原因是在进入getPackages()之前,rn已经帮我们做好了packages.add的工作。
    有两个方法可以解决问题:

    1. 更改react-native-code-push的package.json
      auto link其实是在npm包的package.json中写了packages.add的代码:
    "rnpm": {
        "android": {
          "packageInstance": "new CodePush(getResources().getString(R.string.reactNativeCodePush_androidDeploymentKey), getApplicationContext(), BuildConfig.DEBUG)"
        },
        "ios": {
          "sharedLibraries": [
            "libz"
          ]
        }
    

    可以看出,微软在这里没有使用带url的构造函数,我们可以在构造函数最后增加一个mServerUrl的参数,我在strings.xml中定义了reactNativeCodePush_androidServerURL的值,把packageInstance改成如下即可:

    new CodePush(getResources().getString(R.string.reactNativeCodePush_androidDeploymentKey), getApplicationContext(), BuildConfig.DEBUG,getResources().getString(R.string.reactNativeCodePush_androidServerURL))
    

    不过缺点也很明显,一旦删除了node_modules或者包有了更新,这里就要重新配置一下,比较麻烦。

    1. 修改getPackages()代码
      既然rn帮我们自动添加了packages.add的代码,那我们从里面找到对应code push的包,修改里面的serverUrl不就可以了吗。很遗憾,rn没有提供修改的功能,所以我们可以找到对应的包,先删除,然后再添加。MainApplication代码如下:
    public class MainApplication extends Application implements ReactApplication {
    
      private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
        @Override
        public boolean getUseDeveloperSupport() {
          return BuildConfig.DEBUG;
        }
    
        @Override
        protected List<ReactPackage> getPackages() {
          @SuppressWarnings("UnnecessaryLocalVariable")
          List<ReactPackage> packages = new PackageList(this).getPackages();
          // 先移除auto link的code push包,再手动添加
          for(ReactPackage rp:packages){
            if(rp instanceof CodePush){
              packages.remove(rp);
              break;
            }
          }
          packages.add(new CodePush(BuildConfig.CODEPUSH_KEY, getApplicationContext(), BuildConfig.DEBUG,getResources().getString(R.string.reactNativeCodePush_androidServerURL)));
          return packages;
    
        }
    
        @Override
        protected String getJSMainModuleName() {
          return "index";
        }
    
        @Override
        protected String getJSBundleFile() {
          return CodePush.getJSBundleFile();
        }
      };
    
      @Override
      public ReactNativeHost getReactNativeHost() {
        return mReactNativeHost;
      }
    
      @Override
      public void onCreate() {
        super.onCreate();
        SoLoader.init(this, /* native exopackage */ false);
      }
    }
    

    相关文章

      网友评论

          本文标题:React Native 0.60以上版本集成codepush

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