【发布时间】:2019-08-05 13:11:24
【问题描述】:
我正在尝试实施 AppCenter CodePush 来更新 Javascript 代码,而无需通过 App Store 审核流程。
我已按照此处提到的 iOS 和 Android 步骤来设置多部署环境: https://github.com/microsoft/react-native-code-push/blob/master/docs/multi-deployment-testing-ios.md https://github.com/microsoft/react-native-code-push/blob/master/docs/multi-deployment-testing-android.md
版本
"react-native": "0.59.10"
"react-native-code-push": "^5.6.1"
我在 Android 上尝试使用 react-native run-android --variant release,在 iOS 上我将我的 RUN 和 Archive 方案更改为 STAGING。但在这两种情况下,他们似乎都像[CodePush] Loading JS bundle from "assets://index.android.bundle" 那样获取我的捆绑包,而不是从 CodePush 存储库中获取。这是我看到的唯一输出(与 CodePush 相关)。
我像这样发布了 codePush 版本:appcenter codepush release-react -a name/appName-1 -d Staging。此命令成功,我在 iOS 和 Android 暂存环境中看到它具有正确的版本。
componentDidMount
componentDidMount() {
codePush.notifyApplicationReady();
...
codePush.sync({
updateDialog: true,
installMode: codePush.InstallMode.IMMEDIATE
});
}
导出应用
App = codePush({
checkFrequency: codePush.CheckFrequency.ON_APP_RESUME
})(App);
AppRegistry.registerComponent("myApp", () => App);
Info.plist
CodePushDeploymentKey: $(CODEPUSH_KEY)
android/app/build.gradle
buildTypes {
debug {
buildConfigField "String", "CODEPUSH_KEY", '""'
}
releaseStaging {
buildConfigField "String", "CODEPUSH_KEY", '"my_code"'
matchingFallbacks = ['release']
}
release {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
signingConfig signingConfigs.release
buildConfigField "String", "CODEPUSH_KEY", '"my_code"'
}
}
我的构建设置包含 codePush Release 和暂存代码。
我还尝试将 CodePush 暂存版本升级到生产,但这并没有解决我的问题。
appcenter codepush deployment list -a Name/MyApp 始终返回 0(1 待定)。
更新 在批准成功更新应用程序后,它会要求更新应用程序。但是当我重新启动应用程序时,它会回滚到以前的版本。
更新 2 AppDelgate.m 更改:
#import <CodePush/CodePush.h>
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
return [CodePush bundleURL];
#endif
MainApplication.java 更改:
import com.microsoft.codepush.react.CodePush;
@Override
protected String getJSBundleFile() {
return CodePush.getJSBundleFile();
}
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
..
new CodePush(BuildConfig.CODEPUSH_KEY, MainApplication.this, BuildConfig.DEBUG),
build.gradle 更改:
buildTypes {
debug {
buildConfigField "String", "CODEPUSH_KEY", '""'
}
releaseStaging {
buildConfigField "String", "CODEPUSH_KEY", '"<staging_key>"'
matchingFallbacks = ['release']
}
release {
..
buildConfigField "String", "CODEPUSH_KEY", '"<prod_key>"'
}
}
【问题讨论】:
-
更新后的应用是否有js错误?通常,如果更新的 js 包中出现致命错误,codepush 会自动角色回滚到以前的版本。
-
@Leo 不,我只是简单地在 Codepush 版本中添加了一些静态文本元素,以便理解和实现 Codepush 功能。
-
我已经看到 Codepush 将本地包与服务器包进行比较,如果没有差异,即使它从未下载过,它也不会再次下载包(对于第一个版本)。这是我见过的两个:[CodePush] 从“assets://index.android.bundle”加载 JS 包 [CodePush] 报告二进制更新 (
)。而对于更新后的回滚,appcenter 控制台中的回滚计数是否增加了。 -
@BharathKumar 关于 Codepush 比较 > 我也注意到了这一点。回滚问题很奇怪,因为回滚计数没有增加。但最终,我们设法解决了这个问题(请参阅下面的答案)。
标签: react-native react-navigation code-push react-native-code-push