原来主分支作为上传应用商店的分支,开发分支就上传蒲公英的,随着开发节奏紧凑,时不时需要更新商店上的app,合并代码变的频繁,很容易出错,不得不考虑其他方式。
iOS:duplicate 一个新的target作为上传应用商店
问题:
duplicate target 后模拟器运行可通过,而archive报错“react/*.h”头文件找不到
解决方法:去manager scheme中查看新target与原target有什么不同,可发现在build下原工程有两个target(react 与项目工程target)而新target只有一个,按照原target添加即可,同时去掉parallelize Build的勾
完成以上配置后就可以修改 new target的相关打包信息,如bundle id,display name 等
如果有些代码在新target中不需要,则在新target中通过配置宏来判断是否编译某些代码。
如
iOS多target后,如果需要添加新的第三方包,link时有两种方式:
- react-native link will link all targets by default
- allow a --target="" flag for react-native link, so that each target can be linked via the cli
android :
在module :app下添加
// 多渠道/多环境 的不同配置
productFlavors {
dev {
// gradle 3.0.0 以上需要有这个
flavorDimensions "default"
applicationId "com.eproedc5"
resValue "string", "app_name", "EPRO"
buildConfigField "boolean", "STORE", "false"
manifestPlaceholders = [
JPUSH_PKGNAME: "com.ePROForPatient",
JPUSH_APPKEY : "084ee60926ddff720c36f8a4", //JPush 上注册的包名对应的 Appkey.
APP_CHANNEL : "developer-default", //暂时填写默认值即可.
]
}
store {
// gradle 3.0.0 以上需要有这个
flavorDimensions "default"
applicationId "com.ePROForPatient"
resValue "string", "app_name", "EPRO"
buildConfigField "boolean", "STORE", "true"
manifestPlaceholders = [
JPUSH_PKGNAME: "com.ePROForPatient",
JPUSH_APPKEY : "afab251db7375eaaee81faa2", //JPush 上注册的包名对应的 Appkey.
APP_CHANNEL : "developer-default", //暂时填写默认值即可.
]
}
}
Store环境不需要蒲公英检测
public static final boolean STORE = BuildConfig.STORE;
if (!STORE){
PgyCrashManager.register();
new PgyUpdateManager.Builder()
.register();
}
通过 ./gradlew assembleRelease 打包后可看到dev和store两个文件,按渠道上传相应的安装包即可。
iOS通过宏,Android通过buildconfig可以把当前是什么渠道传给js端,做一些判断。如是否需要环境选择的控件,是否记住账号密码等。
BOOL bIsAppStore = true;
#ifndef APPSTORE
bIsAppStore = false;
#endif
然后
initialProperties:@{@"bIsAppStore":@(bIsAppStore)}];
iOS:
android 需要重写createReactActivityDelegate
@Override
protected ReactActivityDelegate createReactActivityDelegate(){
return new MyReactDelegate(this,getMainComponentName());
}
class MyReactDelegate extends ReactActivityDelegate{
public MyReactDelegate(ReactActivity activity, @Nullable String mainComponentName) {
super(activity, mainComponentName);
}
@javax.annotation.Nullable
@Override
protected Bundle getLaunchOptions(){
Bundle bundle = new Bundle();
bundle.putBoolean("bIsAppStore",STORE);
return bundle;
}
}
调试:
ios 选择相应的target即可直接运行调试
Android:需要选择app对应的build variant ,
如下图选择devDebug则buildconfig中的STORE就是false