React Native with CodePush

CodePush是由微软提供的一款代码热更新工具,支持React Native和Cordova。本文介绍使用CodePush热部署React Native。

CodePush的使用流程我写了一篇Wiki。这篇博客中就不写流程了。

介绍

我们使用React Native时,模拟器中按一下cmd+D,界面直接刷新,开了Live Reload之后配合watchman更是生猛。其实这仅仅是源于localhost上的一个服务器,不断更新内容。但我们的项目 ,默认情况下JS文件会被打包我们的包中,显然它就失去了热部署能力。CodePush提供了这样一个平台,可以让应用在你希望的时候去拉取你想更新的包。

JS文件你可以通过热更新肆意妄为,对于assets允许修改的属性包含ImagesourceMapView.MakerimageProgressViewIOSprogressImagetrackImageTabBarIOS.ItemiconselectedIconToolbarAndroid(RN 0.21.0+)的actions[].iconlogooverflowIcon

目前CodePush支持Cordova和React Native。

快速集成

详见Wiki

踩坑记录

[iOS]设置CodePushDeploymentKey

要想着在iOS项目的Info.plist文件中,增加一个string类型的键CodePushDeploymentKey,值设置为你CodePush下发的DeploymentKey,可以通过code-push deployment ls <appName> -k来查看。

要注意对应部署环境必须对应打包产品的环境。比如默认的两个部署分别是Production和Staging,如果你打包产品部署出去的环境是Staging,那么不会更新Production上的部署。

当然在JS侧,也是可以override在Info.plist中的DeploymentKey的,方法是codePush.sync()中传参deploymentKey (String)

网络情况

由于某些众所周知的情况,会导致CodePush服务在中国大陆的非常不稳定,给CodePush的仓库提了Issue,官方回应这是已知问题,并且修复已经被提上日程,所以大家只能耐心等候官方的努力了。

具体的情况会是在发包的时候,upload progress停止,提示错误。

发包

执行$ code-push release-react AppName ios或是code-push release AppName folderName 1.0,提示错误,我目前遇到过两种:[Error] connect ETIMEDOUT 23.101.203.117:443[Error] getaddrinfo ENOTFOUND codepush-management.azurewebsites.net codepush-management.azurewebsites.net:443

热更新

另外就是在更新的时候,据我个人经验来看,用公司的网络,从一个包发出,到设备更新完成,大概会用1-2个小时。而且这其中,执行code-push deployment ls AppName时,显示Install Metrics会从No installs recordedActive: 0% (0 of 3) Total: 0 (3 pending),再之后才有active,Active: 33% (1 of 3) Total: 1 (2 pending)

codePush.sync()

这正是从服务器请求同步包的方法,你可以在任意适当的时候去调用。

方法原型:

1
codePush.sync(options: Object, syncStatusChangeCallback: function(syncStatus: Number), downloadProgressCallback: function(progress: DownloadProgress)): Promise<Number>;

包含三个参数,返回值是一个Promise。

第一个参数是具体的设置,包含以下几个键:

  • deploymentKey (String) 不用多说。
  • installMode (codePush.InstallMode) 可选值为 codePush.InstallMode.IMMEDIATEcodePush.InstallMode.ON_NEXT_RESTARTcodePush.InstallMode.ON_NEXT_RESUME。分别对应不同的更新时机。
  • mandatoryInstallMode (codePush.InstallMode) 可选值和上面的相同,区别在于这个选项是强制更新的更新模式。
  • minimumBackgroundDuration (Number) 只适用于ON_NEXT_RESUME至少应用在后台运行多少秒之后才进行更新,默认值为0,表示应用一启动就更新,不管后台运行多久。
  • updateDialog (UpdateDialogOptions) 升级弹出框。

具体可参见CodePushOptions