React Native 0.60以上版本集成codepush

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

"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 getPackages() {
      @SuppressWarnings("UnnecessaryLocalVariable")
      List 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)