React Native CodePush实践小结
前言CodePush是微软提供的一套可用于React Native和Cordova的热更新服务,国内也有类似的服务Pushy,从关注度和使用人数来说,CodePush完胜于Pushy(截至目前,CodePush在Github上Star数2900+,Pushy Star数600+,毕竟大公司的产品更让开发者心里有底,但CodePush是否真的绝对比Pushy要好不做评价) CodePush 安装与注册1.安装 CodePush CLI使用命令 ps.都在开发React Native了,npm安装就无需赘言了吧。 2.注册CodePush 账号CodePush终端安装完成后就可以使用
授权完成后,CodePush会显示你的Access Key,复制输入到终端即可完成注册并登陆。
在CodePush服务器中创建App在终端输入
code-push app add AppDemo-iOS code-push相关常见命令如下: Usage: code-push app <command> 命令: add 创建一个新的App remove 删除App rm 删除App rename 重命名已经存在App list 列出与你账户关联的所有App ls 列出与你账户关联的所有App transfer 将一个App的所有权转让给另一个帐户 CodePush集成这里跟进使用端分Android集成和iOS集成,但二者都有共通的部分
接下来的步骤,AndroidiOS有所不同,因此分开来说。 Android端集成
buildTypes { debug{ //省略了其他配置 buildConfigField "String","CODEPUSH_KEY",'""' } releaseStaging { buildConfigField "String",'"此处填写Staging key"' } release { //省略了其他配置 buildConfigField "String",'"此处填写Production key"' } }
protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(),new RCTSwipeRefreshLayoutPackage(),new VectorIconsPackage(),new CodePush(BuildConfig.CODEPUSH_KEY,MainApplication.this,BuildConfig.DEBUG)// Add/change this line. ); } 3.修改VersionName 至此,CodePush在Android端的集成工作已经完成了。 iOS端集成
3.打开 Info.plist文件,在CodePushDeploymentKey中输入$(CODEPUSH_KEY),并修改Bundle versions为三位,如下图
至此,iOS端集成也完成了。 使用react-native-code-psuh进行热更新该配置的都已经配置完了,接下来就是使用了。 更新时机一般常见的应用内更新时机分为两种,一种是打开APP就检查更新,一种是放在设置界面让用户主动检查更新并安装。
codePush.sync({ updateDialog: { appendReleaseDescription: true,descriptionPrefix:'nn更新内容:n',title:'更新',mandatoryUpdateMessage:'',mandatoryContinueButtonLabel:'更新',},mandatoryInstallMode:codePush.InstallMode.IMMEDIATE,deploymentKey: CODE_PUSH_PRODUCTION_KEY,}); 上面的配置在检查更新时会弹出提示对话框, mandatoryxxx表示强制更新,appendReleaseDescription表示在发布更新时的描述会显示到更新对话框上让用户可见 来个更加接近实际应用的:在用户点击检查更新按钮后进行检查,如果有更新则弹出提示框让用户选择是否更新,如果用户点击立即更新按钮,则会进行安装包的下载(实际上这时候应该显示下载进度,这里省略了)下载完成后会立即重启并生效(也可配置稍后重启) codePush.checkForUpdate(deploymentKey).then((update) => { if (!update) { Alert.alert("提示","已是最新版本--",[ { text: "Ok",onPress: () => { console.log("点了OK"); } } ]); } else { codePush.sync({ deploymentKey: deploymentKey,updateDialog: { optionalIgnoreButtonLabel: '稍后',optionalInstallButtonLabel: '立即更新',optionalUpdateMessage: '有新版本了,是否更新?',title: '更新提示' },installMode: codePush.InstallMode.IMMEDIATE,(status) => { switch (status) { case codePush.SyncStatus.DOWNLOADING_PACKAGE: console.log("DOWNLOADING_PACKAGE"); break; case codePush.SyncStatus.INSTALLING_UPDATE: console.log(" INSTALLING_UPDATE"); break; } },(progress) => { console.log(progress.receivedBytes + " of " + progress.totalBytes + " received."); } ); } } 更新是否强制如果是强制更新需要在发布的时候指定,发布命令中配置 更新是否要求即时在更新配置中通过指定installMode来决定安装完成的重启时机,亦即更新生效时机
发布codepush更新包codepush的更新包发布其实很简单。在终端输入命令 code-push release-react <Appname> <Platform> --t <本更新包面向的旧版本号> --des <本次更新说明> CodePush默认是更新 Staging 环境的,如果发布生产环境的更新包,需要指定--d参数: 示例: code-push release-react Flow800-Android android --t 2.0.0 --dev false --d Production --des "1.全新页面n2.上线流量商城n3.已知bug修复" --m ture 常用部署命令如下: Usage: code-push deployment <command> 命令: add 在已存在的App中创建一个部署 clear 清除与部署相关的发布历史记录 remove 在App中删除一个部署 rm 在App中删除一个部署 rename 重命名一个已存在的部署 list 列出App中的所有部署 ls 列出App中的所有部署 history 列出一个部署的发布历史记录 h 列出一个部署的发布历史记录 至此,一个完整的发布,检查,安装流程已经基本描述完了。下面来看下更新的效果:
实践经验小结
也可以直接打Android离线包,这样子就不需要理会Debug Server的影响
react-native bundle --entry-file index.ios.js --bundle-output ./bundle/ios/main.jsbundle --platform ios --assets-dest ./bundle/ios --dev false
3.发布更新包时,切记--t参数指定的是本次更新包的目标版本号,而不是本次更新包的版本号 4.如果不是在根组件的componentDidMount()方法通过codePush.sync()方法进行更新检查与安装,比如像我在设置中通过一个检查更新按钮,这时候就需要十分小心了。必须在根组件的componentDidMount()方法中添加 5.一个App通常不会是一个人开发,因此codePush添加合作者是很常见的。通过 Usage: code-push collaborator <command> 命令: add 对指定的项目添加一个新的合作者 remove 删除指定的项目中的合作者 rm 删除指定的项目中的合作者 list 列出指定项目中的所有合作者 ls 列出指定项目中的所有合作者 示例: code-push collaborator add AppDemo foo@bar.com 添加一个合作者foo@bar.com到AppDemo这个App中 6.最后说一下CodePush的缺陷,因为是国外服务器,所以有时候下载速度并不是很理想。此外CodePush现在是免费服务,以后会不会收费还是个未知数。因此已经有人提出了自建codePush服务器,可见于此:code-push-server 更多常见问题及API使用方法请参见以下资料 参考资料微软官方ReactNative CodePush文档 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |