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项目的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(options: Object, syncStatusChangeCallback: function(syncStatus: Number), downloadProgressCallback: function(progress: DownloadProgress)): Promise<Number>;
包含三个参数,返回值是一个Promise。
第一个参数是具体的设置,包含以下几个键:
codePush.InstallMode.IMMEDIATE
、 codePush.InstallMode.ON_NEXT_RESTART
、 codePush.InstallMode.ON_NEXT_RESUME
。分别对应不同的更新时机。 ON_NEXT_RESUME
至少应用在后台运行多少秒之后才进行更新,默认值为0,表示应用一启动就更新,不管后台运行多久。 具体可参见 CodePushOptions 。