本文旨在对App热更新和CodePush做简单的介绍和概括,并对在绿侠快充App接入CodePush的过程中遇到的问题进行了归纳总结。具体的接入方式和步骤,以及需要使用的命令等具体问题,通过引入官方文档和其它优秀文章的方式以供学习和参考,本文不再赘述。
热更新如何工作
传统的App发布到应用市场的方式,需要经过应用市场的审核,如果审核不通过需要修改后再次提交应用市场,是否通过审核并不仅仅决定于代码的质量,如果不符合应用市场的规范也会被拒绝。审核时间往往要经过1到2天不等,时效性较差。如果发布后发现严重bug需要修正,还要经历一次审核过程,也无法回滚到上一版本,轻则影响用户的使用体验,重则会对公司造成损失。
使用React Native 开发的App, 可通过热更新的方式让用户更新App。开发者无需将更新内容打包成安装包(ipa或者apk)发布到应用市场,用React Native打包的安装包(ipa或者apk)时会产生bundle和一些资源文件(图片和json等), 开发者只需将bundle和资源文件所在目录(也可以只上传bundle文件)上传到热更新服务器,app检测到有更新时就会下载并安装bundle和资源文件。如果发现有严重bug,如果修复时间较长可暂时回滚到上一版本,如果很快解决掉bug,则可以立即再次上传到热更新服务器让用户安装更新。
CodePush简介
CodePush是微软提供的一套针对使用React Native开发的App进行热更新的成熟前后端解决方案。CodePush提供一个热更新云服务器,开发者可使用CodePush提供的code-push命令通过终端(terminal)将bundle和资源文件上传到云服务器,在App中使用CodePush提供的JavaScript Api检测、下载和安装与服务器上的更新。
CodePush 为用户提供了良好的多环境支持(Testing,Staging, Production), 开发者可先将安装包上传到Testing环境进行测试,测试通过后将安装包转移到Staging环境进行灰度测试, 最终确认无误后转入Production正式发布。
通过强大的CLI工具不仅可以将安装包上传到云服务器,还可以查看更新统计数据,如对应的app版本发布了多少个更新包, 每个更新包的下载和安装数量,更新内容描述等都可一目了然。
CodePush接入及发布
- 参考文档
React Native 项目整合 CodePush 完全指南
CodePush热更新详细接入教程
code-push常用命令
react-native-code-push进阶篇
react-native热更新之CodePush详细介绍及使用方法
CodePush 热更新之自定义更新弹框及下载进度 - 官方文档
IOS CodePush 安装
IOS CodePush 配置
IOS 原生中使用的 Object-C API
Android CodePush 安装
Android CodePush 配置
Android 原生中使用的 Java API
React Native API
发布更新
code-push cli
绿侠快充App接入CodePush问题总结:
- 绿侠快充ios的React Native是通过cocoapods集成到原生进行开发的,而不是使用react-native init方式创建的React Native项目,所以CodePush在ios端的接入方式也采用cocoapods集成到项目中。
注意:如果出现pod install以后找不到头文件的情况,请检查一下cocoapods的版本是否需要升级或者降级。
- react-native 打包后会产生bundle和assets文件, 可用code-push release命令将所在目录上传至云服务器
code-push release <应用名称> <Bundles和assets所在目录> <对应的应用版本> --deploymentName: 更新环境 --description: 更新描述 --mandatory: 是否强制更新
例如:
code-push release LXKCIOS ./RNSources 1.0.0 --deploymentName Staging --description "
测试"
Label图例注意:1.0.0是app的版本号而不是给上传的安装包指定版本号,指定该版本号的意思是指上传的安装包是针对版本为1.0.0的app进行更新,其他版本的app不会受到影响。安装包的版本号叫label,入下图红框中的内容所示,每上传一次更新,label会递增。
-
在ios中使用[CodePush bundleURL]获取资源文件地址,默认使用的文件名是main, 后缀是jsbundle。如果react-native bundle打包出来的文件名不是main, 请使用[CodePush bundleURLForResource:@"包名"]获取文件地址,如果后缀不是jsbundle, 请使用[CodePush bundleURLForResource:@"包名" withExtension: @"后缀"]。
-
react-native bundle打包出来后上传到云服务器的bundle文件名与原生中使用的文件名要保持一致,否则下载后会因为无法找到bundle文件而导致安装失败, 三个地方使用的文件名要保持一致。
打包:
react-native bundle --platform ios --dev false --entry-file react_native/index.js --bundle-output ios/index.jsbundle --assets-dest ios/RNAssets
上传:
code-push release APP-IOS ./index.jsbundle 1.0.0 --deploymentName Staging --description "
测试"
在原生代码中的使用:
NSURL *jsCodeLocation = [CodePush bundleURLForResource:@"index"];
文件名 index 也就是打包和上传的index.jsbundle 贯穿始终
-
要根据所使用的React Native版本来选择对应的CodePush版本,否则可能导致编译打包错误等各种难以处理的问题。
CodePush版本
-
五星级坑点*****, 如果使用手动检测更新,通俗来说就是用checkForUpdate检测更新而不是用sync检测更新时,记得在js的入口页面的componentDidMount中调用CodePush.notifyAppReady(),这么做的目的是告诉CodePush更新成功并删除pendingPackage。如果不调用的话,在app第一次重启时会看到更新的版本,但是再打开app时就会回滚到最初的版本。
7、ios中如果使用了cocoapods, 在打包Staging版本时需要将Pods工程下的Project --> Pods --> Build Settings --> Per-configuration Build Products Path --> Staging 修改为$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
网友评论