react-native - React Native codePush 重启后回滚
问题描述
我正在尝试实施 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 暂存环境中看到它具有正确的版本。
组件DidMount
componentDidMount() {
codePush.notifyApplicationReady();
...
codePush.sync({
updateDialog: true,
installMode: codePush.InstallMode.IMMEDIATE
});
}
导出应用
App = codePush({
checkFrequency: codePush.CheckFrequency.ON_APP_RESUME
})(App);
AppRegistry.registerComponent("myApp", () => App);
信息列表
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 挂起)。
UPDATE 它要求更新应用程序,在批准它成功更新应用程序后。但是当我重新启动应用程序时,它会回滚到以前的版本。
更新 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>"'
}
}
解决方案
你在模拟器中测试这个吗?
如果是这样,在 CodePush 的眼中,做一个reload
基本上模拟了崩溃。
如果您在模拟器中运行,CodePush 的行为将与在未绑定到打包程序的真实设备上的行为不同。测试它的最佳方法是进行构建并将该构建上传到商店以分发到您的测试池。
然后,您可以通过 Google Play 商店或 iOS 的 testflight 下载并安装您的构建,并在那里测试您的 CodePush 安装。
编辑:
经过聊天,并进行了以下代码更改,我们得到了工作:
首先,创建一个选项对象,并在我们的 codePush 调用中使用它:
const options = {
updateDialog: true,
installMode: codePush.InstallMode.IMMEDIATE,
checkFrequency: codePush.CheckFrequency.ON_APP_RESUME
};
然后我们可以调用codePush同步如下:
codePush.sync(options);
最后,我们没有将 codePush 设置分配给App
,而是将其全部移至一行:
AppRegistry.registerComponent("myApp", () =>
codePush(options)(App)
);
不是 codePush 专家,我不知道是否需要选项部分,尽管我认为在不同点有不同的选项可能会导致不一致。
我确实认为打电话App = codePush(options)(App)
引起了问题。
不管怎样,这两件事的结合解决了这个问题。
推荐阅读
- javascript - JS 在现代脚本编辑器 Web 部件中不起作用
- assembly - Raspberry pi 4 (scanf) 中的汇编代码分段错误
- c# - 如何检测 Hangfire 中的连接池问题?
- bash - 当目标字符串包含引号时 [[ ]] 中的字符串比较失败
- java - 在功能上组合相同对象的列表
- python - 部分字符串过滤熊猫
- keras - Keras model.fit():“元组”对象没有属性“形状”
- css - 我有一个作为模态的 div,如何防止在它后面的 div 中滚动?
- javascript - 在没有 JQuery 的 Ajax 中提交表单
- flutter - XFile中图像和视频的区别