React Native代码重启后推送回滚

Kev*_*ore 5 react-native code-push react-native-code-push react-navigation

我正在尝试实施 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() {
    codePush.notifyApplicationReady();
    ...
    codePush.sync({
      updateDialog: true,
      installMode: codePush.InstallMode.IMMEDIATE
    });
  }
Run Code Online (Sandbox Code Playgroud)

导出应用程序

App = codePush({
  checkFrequency: codePush.CheckFrequency.ON_APP_RESUME
})(App);

AppRegistry.registerComponent("myApp", () => App);
Run Code Online (Sandbox Code Playgroud)

信息表

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"'
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的构建设置包含 codePush Release 和暂存代码。

在此输入图像描述

我还尝试将 CodePush Staging 版本升级到生产版本,但这并没有解决我的问题。

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
Run Code Online (Sandbox Code Playgroud)

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),
Run Code Online (Sandbox Code Playgroud)

build.gradle 更改:

buildTypes {
  debug {
    buildConfigField "String", "CODEPUSH_KEY", '""'
  }

  releaseStaging {
    buildConfigField "String", "CODEPUSH_KEY", '"<staging_key>"'
    matchingFallbacks = ['release']
  }

  release {
    ..
    buildConfigField "String", "CODEPUSH_KEY", '"<prod_key>"'
  }
}
Run Code Online (Sandbox Code Playgroud)

Dou*_*ins 6

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

reload如果是这样,那么在 CodePush 看来,执行 a基本上就模拟了崩溃。

如果您在模拟器中运行,CodePush 的行为将与在未绑定到打包程序的真实设备上不同。测试它的最佳方法是进行构建并将该构建上传到商店以分发到您的测试池。

然后,您可以通过 Google Play 商店或 iOS 版 testflight 下载并安装您的版本,并在那里测试您的 CodePush 安装。


编辑:


经过一番交谈,并进行了以下代码更改后,我们的工作就开始了:

首先,创建一个选项对象,并在我们的 codePush 调用中使用它:

const options = { 
  updateDialog: true, 
  installMode: codePush.InstallMode.IMMEDIATE, 
  checkFrequency: codePush.CheckFrequency.ON_APP_RESUME 
}; 
Run Code Online (Sandbox Code Playgroud)

然后我们可以调用codePush同步,如下所示: codePush.sync(options);

最后,我们没有将 codePush 设置分配给App,而是将其全部移至一行:

AppRegistry.registerComponent("myApp", () => 
  codePush(options)(App) 
);
Run Code Online (Sandbox Code Playgroud)

作为一个 codePush 专家,我不知道选项部分是否是必需的,尽管我认为在不同点有不同的选项可能会导致不一致。

我确实认为打电话App = codePush(options)(App)造成了问题。

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