首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新启动后响应本机codePush回滚

重新启动后响应本机codePush回滚
EN

Stack Overflow用户
提问于 2019-08-05 13:11:24
回答 3查看 9.3K关注 0票数 5

我正在尝试实现AppCenter CodePush来更新Javascript代码,而不必经过App审查过程。

我遵循了这里提到的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"

我用react-native run-android --variant release在Android上试过,在iOS上,我将运行和存档方案更改为暂存。但在这两种情况下,它们似乎都像[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

代码语言:javascript
复制
componentDidMount() {
    codePush.notifyApplicationReady();
    ...
    codePush.sync({
      updateDialog: true,
      installMode: codePush.InstallMode.IMMEDIATE
    });
  }

导出应用程序

代码语言:javascript
复制
App = codePush({
  checkFrequency: codePush.CheckFrequency.ON_APP_RESUME
})(App);

AppRegistry.registerComponent("myApp", () => App);

Info.plist

CodePushDeploymentKey: $(CODEPUSH_KEY)

android/app/build.gradle

代码语言:javascript
复制
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发行版和暂存代码。

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

appcenter codepush deployment list -a Name/MyApp总是返回0 (1挂起)。

更新,它要求更新应用程序,批准后,它成功地更新应用程序。但是当我重新启动应用程序时,它会回滚到以前的版本。

更新2 AppDelgate.m更改:

代码语言:javascript
复制
#import <CodePush/CodePush.h>

#if DEBUG
  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
  return [CodePush bundleURL];
#endif

MainApplication.java更改:

代码语言:javascript
复制
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更改:

代码语言:javascript
复制
buildTypes {
  debug {
    buildConfigField "String", "CODEPUSH_KEY", '""'
  }

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

  release {
    ..
    buildConfigField "String", "CODEPUSH_KEY", '"<prod_key>"'
  }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-07 15:29:07

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

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

如果您在模拟器中运行,CodePush的行为将不同于在没有绑定到包程序的实际设备上的行为。测试它的最佳方法是进行构建并将构建上传到存储区,以便分发到您的测试池。

然后,您可以通过Google商店下载并安装您的构建,或者在iOS上测试您的CodePush安装。

编辑:

在聊天之后,并做了以下代码更改之后,我们开始工作了:

首先,创建一个options对象,并在codePush调用中使用它:

代码语言:javascript
复制
const options = { 
  updateDialog: true, 
  installMode: codePush.InstallMode.IMMEDIATE, 
  checkFrequency: codePush.CheckFrequency.ON_APP_RESUME 
}; 

然后我们可以按如下方式调用codePush同步:codePush.sync(options);

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

代码语言:javascript
复制
AppRegistry.registerComponent("myApp", () => 
  codePush(options)(App) 
);

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

我确实认为打电话给App = codePush(options)(App)会引起问题。

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

票数 6
EN

Stack Overflow用户

发布于 2020-10-27 10:48:01

我也遇到了同样的问题,所以我只在我的应用程序登陆页面上写下了codePush.notifyAppReady(),并且在检查新的更新之前确保您这样做。

代码语言:javascript
复制
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
        })
    }
}
票数 1
EN

Stack Overflow用户

发布于 2021-11-05 08:05:49

在我的例子中,我是手动使用codePush.sync的。在密码学博士,他们说:

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

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

代码语言:javascript
复制
const codePushOptions = { checkFrequency: codePush.CheckFrequency.MANUAL };

和组件输出为

代码语言:javascript
复制
export default codePush(codePushOptions)(App);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57359331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档