缘起
早些时候有使用React Native开发了第一版的App,后来又用Flutter重新开发了。Flutter的开发和用户体验确实比RN要好,我们的App其实一直没有使用,用的是小程序,功能的频繁变更,如果是App的话,可能用户手机上依旧安装的是老的版本,当然也可以通过版本控制来让用强制更新,从而可以避免老版本的问题。另外就是热更新,RN的最大优势就是热更新吧,如果不考虑热更新我肯定还是Flutter优先,RN的热更新主要以微软的CodePush,刚出来的时候免费的,目前已经变成AppCenter,需要付费了。另外React Native 中文网的Pushy,不过没有用过。后来偶然发现code-push-server这个开源的项目,最近才想到应该试下这个方案。
CodePush Server
这个项目的初衷是因为微软的CodePush在国内太慢了,另外官方的CodePush Server是没有开源的,只有React Native CodePush是开源的。理论上是可以通过React Native CodePush 反推出CodePush Server逻辑的,但是不知道CodePush Server的这个项目是怎么来的,不过能用就好。
不过这个项目在3年前就已经停止更新了,另外React Native CodePush则一直在更新,所以实际会有不少的问题。我用的是Docker搭建的CodePush Server服务,这个很简陋没有什么管理的界面,都是用React Native CodePush命令行来管理的。
依赖
package.json
中的依赖:"react-native-code-push": "~5.6.0"
,一定要使用小版本,因为5.7
以上的版本就会报错。
屏蔽自动生成
react-native-code-push
插件会自动在/android/app/build/generated/rncli/src/main/java/com/facebook/react/PackageList.java
文件中生成CodePush
的类型,但是如果使用CodePush Server的话,就需要手动的更改CodePush的Server路径,而不是微软的,需要的项目下生成react-native-config.js
,屏蔽自动生成。
1 | module.exports = { |
Gradle 配置
需要变更app/build.gradle
1 | apply from: "../../node_modules/react-native/react.gradle" |
常用命令
热更新是分平台,所以需要创建对应的安卓以及iOS的。
1 | code-push release-react [应用名称]-android android -d Production # 打包生产版本 |
运行程序,注意热更新也是分为测试和生产版本的。
1 | react-native run-android --variant=release # 生成release版本,默认是Debug版本 |
总结
整个算是跑通了,从业务角度来看,热更新确实很棒。但实际情况就是如果不是大厂,那只能自己搭建CodePush Serser的服务了,不过考虑到这个开源的项目以及很久没人在维护了,所以实际上留下一个巨大坑,后续维护的难度还是有的。