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允许修改的属性包含Image
的source
,MapView.Maker
的image
,ProgressViewIOS
的progressImage
和trackImage
,TabBarIOS.Item
的icon
和selectedIcon
,ToolbarAndroid
(RN 0.21.0+)的actions[].icon
、logo
、overflowIcon
。
目前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 recorded
到Active: 0% (0 of 3) Total: 0 (3 pending)
,再之后才有active,Active: 33% (1 of 3) Total: 1 (2 pending)
。
codePush.sync()
这正是从服务器请求同步包的方法,你可以在任意适当的时候去调用。
方法原型:
|
|
包含三个参数,返回值是一个Promise。
第一个参数是具体的设置,包含以下几个键:
- deploymentKey (String) 不用多说。
- installMode (codePush.InstallMode) 可选值为
codePush.InstallMode.IMMEDIATE
、codePush.InstallMode.ON_NEXT_RESTART
、codePush.InstallMode.ON_NEXT_RESUME
。分别对应不同的更新时机。 - mandatoryInstallMode (codePush.InstallMode) 可选值和上面的相同,区别在于这个选项是强制更新的更新模式。
- minimumBackgroundDuration (Number) 只适用于
ON_NEXT_RESUME
至少应用在后台运行多少秒之后才进行更新,默认值为0,表示应用一启动就更新,不管后台运行多久。 - updateDialog (UpdateDialogOptions) 升级弹出框。
具体可参见CodePushOptions。