這里主要想解決的是安卓版本自定義服務(wù)器不生效的問題糯钙。
我們使用的版本信息如下:
"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已經(jīng)幫我們做好了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的構(gòu)造函數(shù)唾琼,我們可以在構(gòu)造函數(shù)最后增加一個mServerUrl的參數(shù),我在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的代碼芜茵,那我們從里面找到對應(yīng)code push的包,修改里面的serverUrl不就可以了嗎倡蝙。很遺憾九串,rn沒有提供修改的功能,所以我們可以找到對應(yīng)的包寺鸥,先刪除猪钮,然后再添加。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);
}
}