Dynamic Update For React Native


热更新的可行性

对于 React Native 开发的 App 来讲,其内容包含两个方面:

我们假设应用程序的入口 (entry) 脚本是 index.ios.js,那么,通过这个入口文件,Packager 可以将所有的脚本文件、静态资源打包成一个 bundle,然后应用程序 下载本地或远端的这个打包后的 bundle 文件来启动。那么,可想而知,如果我们将每次修改后并打包的新的 bundle 文件托管到远端 server,设定一个策略: 每当 App 终端用户重启应用时,我们就检查远端 server 是否有一个新版本的 bundle 包,如果有,则提示用户检测到更新,询问是否更新,并且可以将每次的 release note 通过远端 server 返回一并显示给用户,并告知更新的内容。所以,一旦你理解了热更新的基本原理,几乎可以向你的终端用户在任何时间推送任何信息。

Code Push

它是 Microsoft 在 git hub 上托管的一个开源项目,专注于处理 App 动态更新,对 React Native 有很好的支持。如果你已经有一个完成的 React Native 的应用,并且 你知道热更新的重要性,那么你可以依照 Code Pushget start 章节 快速的 follow 一遍,你会发现它如此的简单迷人。

仿佛你要做的就是下面这样:



import { AppRegistry } from 'react-native'
import Cache from 'react-native-cache-store'
import Root from '../components/router/_index'
import Services from '../services/_index'
import codePush from 'react-native-code-push'

export default class BootStrapper {
  static init() {
    Cache.flush()
  }

  static launch() {
    const app = codePush(BootStrapper.getCodePushOption())(Root)
    AppRegistry.registerComponent('CNewApp', () => app)
  }

  static start() {
    Promise.resolve()
      .then(() => {
        return BootStrapper.init()
      })
      .then(() => {
        BootStrapper.launch()
      })
      .catch(error => {
        console.log(error)
      })
  }

  static getCodePushOption() {
    return {
      updateDialog: {
        appendReleaseDescription: true,
        descriptionPrefix: 'Release Note: ',
        mandatoryContinueButtonLabel: '好',
        title: '更新',
        optionalUpdateMessage: '发现可用更新,是否立即更新?\r\n',
        mandatoryUpdateMessage: '发现可用更新,建议立即更新。\r\n',
        optionalIgnoreButtonLabel: '不了,谢谢',
        optionalInstallButtonLabel: '安装更新'
      },
      installMode: codePush.InstallMode.IMMEDIATE
    }
  }
}

我假设你足够的聪明,已经很好的完成了官方的 follow。接下来,我想分享我使用 code push 的进行release 的一个大致流程。我以我上一篇 中的 FilmNight App 为例。

首先,App 的生存环境有三种: 它们分别从以下三个位置下载bundle文件:

我已经在code push托管了一个名叫 FilmNight 的 IOS App,每当我修改了本地的任何文件,我会执行以下命令先将其 release 到 Staging 环境:


code-push release-react FilmNight ios  --description "release to
 Staging env first."
    

接下来通过以下命令检查更新是否已经成功上传到 code push server:


code-push deployment ls FilmNight

然后,在我之前已经安装过一个 Staging 版本的 IOS 设备上进行验证测试;而真正的用户所安装的版本一定是 Production,所以,当你 release to Staging 时, Production 的用户并不会收到一个更新的推送。当你在 Staging 测试通过后,可以通过以下命令,将这个 Staging 的版本 Promote (提升) 到 Production:


  code-push promote FilmNight Staging Production
  
接下来,你可以用上一步骤中所用到的相同命令 check production 的版本是否已经提升。

当我们打开已经装有 Production 版本的 FilmNight App 时,将会立即收到一个弹窗提示有可用的更新,并且我将更新说明也放在了提示信息里(这是可选的), 当用户选择安装后,会立即从 code push server 下载 Production 版本的更新包,当更新完成后会自动重启应用。而在 code push server 端也会记录 Install 的次数。

其他

code push 的内容远不止这些,比如它还有许多的更新策略可选,甚至你可以组合:比如完全静默更新、弹窗更新等等;其推送更新也可以限定范围,比如只推送 50%的用户等等。你可以从 Code Push 获取最新的相关信息。

(打赏)

If you want to pay for this
I will list your account name here.
HA HA!