Code-Push集成与使用(Android)
第一步
安装code-push包,并link到原生工程:
npm install --save react-native-code-push@latest
react-native link react-native-code-push
在app/build.gradle下添加
apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"
link命令默认RN项目的添加codepush代码是在MainApplaction下添加,如下:
360截图18770529192621.png如果是原生项目接入RN模块,你自定义入口Activity的时候可能是这样:
360截图1843070799119107.png这个时候需要添加codepush的相关代码,如图:
360截图167708048780118.png集成遇到的问题
报错1:
Could not find method enabled() for arguments [[]] on task ':app:bundleDebugJsAndAssets' of type org.gradle.api.tasks.Exec
原因:0.60以上版本导致的
解决办法:在apply from:前添加project.ext.react,如下:
project.ext.react = [
entryFile: "index.js",
enableHermes: false, // clean and rebuild if changing
]
apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"
这几行代码在创建0.60以上版本的时候默认会有,但是如果是原生项目接入RN模块可以就会忘记添加,这是默认导出的入口文件,改为你自己的。
第二步
在vscode窗口安装命令行工具:
npm install -g code-push-cli
窗口内常用命令
注册: code-push register
登录: code-push login
查看添加的app列表: code-push app list
添加android APP:code-push app add app名字 Android react-native,如:
code-push app add iOSRNHybridForAndroid Android react-native
查询一个程序的更新历史: code-push deployment history projectName Production
projectName是项目名字,最后一位参数如果是正式版本就使用Production,开发版本就使用Staging,例如:
code-push deployment history bwt-android Production
获取注册程序的密钥:code-push deployment ls AppName -k 例如:
AppName是你创建的app名字
code-push deployment ls bwt-android -k
发送更新包流程
第一步:将工程打包apk,release版本
1、 android studio 编译成apk,安装到手机上
2、 调试的时候可以生产离线bundle,命令
react-native bundle --platform 平台 --entry-file 启动文件 --bundle-output 打包js输出文件 --assets-dest 资源输出目录 --dev 是否调试
例如:
react-native bundle --entry-file index.js --bundle-output ./android/app/src/main/assets/index.android_notice.bundle --platform android --assets-dest ./android/app/src/main/res/ --dev false
第二步:code-push生成包并上传
打包发布有两种方式
第一种方式:
通过code-push release-react发布更新,这种方式将打包与发布两个命令合二为一,简化了操作流程,常用的就是这种方式,可以规避很多问题
简单的:code-push release-react <appName> <platform>
例如:
code-push release-react MyApp-iOS ios
code-push release-react MyApp-Android android
复杂的:
第一种:
code-push release-react MyApp-iOS ios --t 1.0.0 --dev false --d Production --des "1.优化操作流程" --m true
第二种:
code-push release-react bwt-android android --bundleName "record.jsbundle" --entryFile index_record.js --t 6.1.1 --d Production
code-push release-react 该命令可以配置更多的参数,如指定bundle名字,index入口名字等,命令窗口输入:code-push release-react 查看,如指定index入口:
//entryFile默认未index.js或者index.android.js
code-push release-react bwt-android android --d Staging --des "基准版本" --t 1.0.0 --entryFile index_record.js
第二种方式
通过code-push release发布更新,此种方式是先打包后发布,2个步骤,两个命令。
1、 打包bundle文件,命令:
单纯打包bundle,如果不打包资源,在更新成功后会加载不到图片资源,所以基本不用此命令
react-native bundle --platform android --entry-file index_message.js --bundle-output ./android/bundles/index.android_message.bundle --dev false
打包bundles + 图片资源
react-native bundle --platform android --entry-file index_message.js --bundle-output ./android/bundles/index.android_message.bundle --assets-dest ./android/bundles/ --dev false
注意路径的文件夹需要自己提前创建好,打包后的目录如下图:
截图2、 codePush发布命令:
code-push release <appName> <updateContentsPath> <targetBinaryVersion> [options]
例子:
code-push release bwt-android ./android/bundles 6.1.1 --deploymentName Production --description "1.测试消" --mandatory true
注意:
1、在发布的时候 指定的路径需要指定文件夹,不能指定到bundle,否则资源文件未上传在热更成功后会找不到图片
2、在窗口中输入code-push release命令可以看到详细说明,可以自定义配置。
3、版本号填写的应该是android工程的apk版本号,意思是指定在该版本上热更新,而不是热更的版本。
第三步 rn工程中添加codepush代码进行检查
1、导入包 import CodePush from 'react-native-code-push';
2、自己创建按钮或者在componentDidMount下添加代码:
//第一个参数是配置(默认{}也可以),第二个是更新包状态回调,第三个参数是更新包下载回调,第二和第三参数不填写也是可以的。
CodePush.sync(
{},
this.codePushStatusDidChange.bind(this),
this.codePushDownloadDidProgress.bind(this),
);
codePushStatusDidChange和codePushDownloadDidProgress是自己随便写的,需要查看详细回调的话可以传入。
调用codepush检查之后会下载更新包,然后重启程序,就能看到更新后的效果
问题
问题1:自搭服务器codepush更新检查时报错Network request failed
解决方法:自搭服务器是http的域名,但android8.0以上只支持https,所以需要降低android版本,tagetSdk改成25即可
网友评论