这里主要想解决的是安卓版本自定义服务器不生效的问题。
我们使用的版本信息如下:
"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的工作。
有两个方法可以解决问题:
- 更改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或者包有了更新,这里就要重新配置一下,比较麻烦。
- 修改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);
}
}
网友评论