一次搭建私有code-push服务,进行RN热更新之旅
链接:
code-push-server 热更新服务
https://github.com/lisong/code-push-server
code-push-web 热更新后台管理UI(没有更新,有bug)
https://github.com/lisong/code-push-web
react-native-code-push
https://github.com/lisong/react-native-code-push (code-push-server作者改写的)
https://github.com/Microsoft/react-native-code-push (微软)
参考
=========================
正确使用code-push热更新
- 苹果App允许使用热更新Apple's developer agreement, 为了不影响用户体验,规定必须使用静默更新。 Google Play不能使用静默更新,必须弹框告知用户App有更新。中国的android市场必须采用静默更新(如果弹框提示,App会被“请上传最新版本的二进制应用包”原因驳回)。
- react-native 不同平台bundle包不一样,在使用code-push-server的时候必须创建不同的应用来区分(eg. CodePushDemo-ios 和 CodePushDemo-android)
- react-native-code-push只更新资源文件,不会更新java和Objective C,所以npm升级依赖包版本的时候,如果依赖包使用的本地化实现, 这时候必须更改应用版本号(ios修改Info.plist中的CFBundleShortVersionString, android修改build.gradle中的versionName), 然后重新编译app发布到应用商店。
- 推荐使用code-push release-react 命令发布应用,该命令合并了打包和发布命令(eg. code-push release-react CodePushDemo-ios ios -d Production)
- 每次向App Store提交新的版本时,也应该基于该提交版本同时向code-push-server发布一个初始版本。(因为后面每次向code-push-server发布版本时,code-puse-server都会和初始版本比较,生成补丁版本)
一、搭建服务
系统:Ubuntu
所需环境:node , npm,mysql
1.安装mysql
sudo apt-get install mysql-server
apt-get isntall mysql-client
sudo apt-get install libmysqlclient-dev
安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使用如下命令来检查是否安装成功:
sudo netstat -tap | grep mysql
通过上述命令检查之后,如果看到有mysql 的socket处于 listen 状态则表示安装成功。
登陆mysql数据库可以通过如下命令:
mysql -u root -p
-u 表示选择登陆的用户名, -p 表示登陆的用户密码,上面命令输入之后会提示输入密码,此时输入密码就可以登录到mysql。
mysql 8.x有一个bug,登录mysql,后执行下面的命令
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourRootPassword';
FLUSH PRIVILEGES;
百度mysql的启动、停止,重启,修改密码命令。加入开机启动。
2.安装pm2
sudo npm i -g pm2
3.安装code-push-server
git clone https://github.com/lisong/code-push-server.git
cd code-push-server
npm install
4.初始化数据库
进入源码目录,执行
./bin/db init --dbhost "your mysql host" --dbport "your mysql port" --dbuser "your mysql user" --dbpassword "your mysql password"
5.编辑config/config.js
local.storageDir ---------- 存储热更新增量包的文件夹绝对路径,确保文件夹存在且有读写权限
local.downloadUrl --------- 当前主机ip
common.dataDir --------- 增量文件计算文件的文件夹绝对路径,确保文件夹存在且有读写权限
common.codePushWebUrl ----------- web管理页面url
jwt.tokenSecret ----------- token生成,推荐使用 https://www.grc.com/passwords.htm 获取(63 random alpha-numeric characters (a-z, A-Z, 0-9)),替换INSERT_RANDOM_TOKEN_KEY
db ------------ 数据库设置 username,password,host,port 改成自己的
6.创建process.json
{
"apps": [
{
"name": "code-push-server",
"max_memory_restart": "300M",
"script": "/code-push-server源码文件夹绝对路径/bin/www",
"instances": "max",
"exec_mode": "cluster",
"env": {
"NODE_ENV": "production",
"PORT": 3000,
"CONFIG_FILE": "/code-push-server源码文件夹绝对路径/config/config.js"
}
}
]
}
注释:instances //开启实例数量,max为cpu核数 exec_mode: //集群模式,最大提升网站并发
7.启动停止重启服务
pm2 start/stop/restart process.json
8.测试是否成功启动
curl -I http://YOUR_CODE_PUSH_SERVER_IP:3000/
return httpCode 200 OK
二、创建热更新app
1.安装code-push-cli
npm install code-push-cli@latest -g
2.登录web获取token
code-push login http://YOU_SERVICE_IP:3000
3.改管理员密码(默认:账号:admin 密码:123456)
curl -X PATCH -H "Authorization: Bearer 在页面获取的TOKEN" -H "Accept: application/json" -H "Content-Type:application/json" -d '{"oldPassword":"123456","newPassword":"新密码"}' http://YOU_SERVICE_IP:3000/users/password
4.分平台创建热更新app,参考其他文章;
三、移动端集成react-native-code-push
1.安装 react-native-code-push
npm install --save react-native-code-push@latest
react-native link react-native-code-push
注意:是否替换成code-push-server作者github仓库的版本还没研究
2.集成
参考其他文章
3.使用
js入口需要热更新的部分代码App,需要包裹在CodePush下
CodePush({ checkFrequency: CodePush.CheckFrequency.ON_APP_RESUME })(App)
componentWillMount(){
CodePush.disallowRestart();
}
componentDidMount(){
CodePush.allowRestart();
//其他代码,检查更新
}