【问题标题】:React Native codePush rollback after restartReact Native codePush 重启后回滚
【发布时间】: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


【解决方案1】:

你是在模拟器中测试这个吗?

如果是这样,做reload 基本上模拟了 CodePush 眼中的崩溃。

如果您在模拟器中运行,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) 会引起问题。

不管怎样,这两件事的结合解决了这个问题。

【讨论】:

  • 嗨!我已经在模拟器(在暂存和发布模式下运行它)测试了它,并创建了应用程序的发布版本(在 iOS 和 Android 上测试)。我将 updateDialog 更改为 false,几秒钟后,应用程序重新启动,我看到了 Codepush 版本的更改。但是在我重新启动并打开应用程序后,“Codepush 版本已消失”,我又回到了旧版本。
  • 你是使用AppCenter代码推送,还是单机代码推送?此外,为了确保我在同一页面上,发布版本意味着您将应用程序上传到 Play 商店或 TestFlight 并通过那里下载以进行测试。最后,您是否在 codepush 仪表板中看到“回滚”?
  • 还有一件事,您对 Android MainApplication.java 文件和 iOS AppDelagate.m 文件做了哪些更改?
  • 我刚刚用 MainApplication.java 和 AppDelegate.m 更改更新了我的问题。我正在使用 AppCenter Codepush(使用appcenter-cli),在我的 Codepush 仪表板中,我没有看到任何奇怪的回滚或安装(100% 推出)。
【解决方案2】:

我遇到了同样的问题,所以我只是在我的应用登录页面上写下了 codePush.notifyAppReady(),并确保在检查新更新之前完成此操作

componentDidMount(): void {
        codePush.notifyAppReady()
        this.checkUpdate();
}

checkUpdate = async () => {
    const updateData: RemotePackage | null = await codePush.checkForUpdate()
    if (updateData && !updateData.failedInstall) {
        //your code
        this.setState({
            isMandatory: updateData.isMandatory,
            whatsNew: updateData.description,
            showAppUpdateDialog: true
        })
    }
}

【讨论】:

    【解决方案3】:

    就我而言,我手动使用codePush.sync。在the docs of codepush 中,他们说:

    通知 CodePush 运行时新安装的更新应该被认为是成功的,因此不需要自动客户端回滚。必须在更新包的代码中的某处调用此函数。否则,当应用程序下次重新启动时,CodePush 运行时将假定安装的更新失败并回滚到以前的版本。存在此行为是为了帮助确保您的最终用户不会被损坏的更新阻止。

    他们建议在成功更新后使用notifyAppReady。但是,我找不到合适的地方来使用 react-navigation 调用它。相反,在导航组件的根目录中,创建了这个变量

    const codePushOptions = { checkFrequency: codePush.CheckFrequency.MANUAL };
    

    组件导出为

    export default codePush(codePushOptions)(App);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多