Jasper Ji

始以竹篦子久知痛痒,后因一滴水渐至澎冲。

0%

学习CodePush Server的使用

缘起

早些时候有使用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
2
3
4
5
6
7
8
9
module.exports = {
dependencies: {
'react-native-code-push': {
platforms: {
android: null, // disable Android platform, other platforms will still autolink
},
},
},
};
Gradle 配置

需要变更app/build.gradle

1
2
apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle" // 新增此段
常用命令

热更新是分平台,所以需要创建对应的安卓以及iOS的。

1
code-push release-react [应用名称]-android android -d Production # 打包生产版本

运行程序,注意热更新也是分为测试和生产版本的。

1
react-native run-android --variant=release  # 生成release版本,默认是Debug版本

总结

整个算是跑通了,从业务角度来看,热更新确实很棒。但实际情况就是如果不是大厂,那只能自己搭建CodePush Serser的服务了,不过考虑到这个开源的项目以及很久没人在维护了,所以实际上留下一个巨大坑,后续维护的难度还是有的。