以前做Android原生的时候,用腾讯bugly实现热更新,发布补丁的时候,android界面是没有任何提示的,在应用被杀死后,下次启动就会改变样子。我以为这个react native codepush热更新还是这样子。没有任何提示界面,然后,我在接入codepush的时候,一直在想为什么要有对话框出现呢,出现要重新下载?短路,直到集成成功之后,发现,这个对话框并不影响什么反而给用户一个友好的提示。
资料参考:CodePush热更新详细接入教程这个真的很详细,前面主要参考此文。
使用 CodePush 热更新 React Native 项目,这篇文章也是清晰
1.根据第一篇文章集成 1-4点,这部分完全没得问题。相关截图
登录之后,注册app,分android 和ios
code-push app add xxx Android react-native
成功之后会返回
查询注册的app
code-push app list
CodePush管理App的相关命令:
code-push app add 在账号里面添加一个新的app
code-push app remove 或者 rm 在账号里移除一个app
code-push app rename 重命名一个存在app
code-push app list 或则 ls 列出账号下面的所有app
code-push app transfer 把app的所有权转移到另外一个账号
安装组件
npm install react-native-code-push --save
react-native link react-native-code-push
2.进行第5步,Android原生应用中配置CodePush
1).在loacl.properties中配置pushkey
code_push_key_production=vLKJpJGlwm9gPq1-tvB4Cbp50T3u8c157eb4-c840-4567-9319-4f2ef4a1159d
code_push_key_staging=ujJkBHtboIowoiCDY3Vhaeu2NBe58c157eb4-c840-4567-9319-4f2ef4a1159d
2).打开app的build.gradle,(在React Native 项目目录下 android/app/build.gradle)
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
android{
···
buildTypes {
debug{
minifyEnabled false //开启混淆
zipAlignEnabled false
shrinkResources false // 移除无用的resource文件
signingConfig signingConfigs.release
buildConfigField "String", "CODEPUSH_KEY", '"'+properties.getProperty("code_push_key_staging")+'"'
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
release {
minifyEnabled true//开启混淆
zipAlignEnabled true
shrinkResources true// 移除无用的resource文件
signingConfig signingConfigs.release
buildConfigField "String", "CODEPUSH_KEY", '"'+properties.getProperty("code_push_key_production")+'"'
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
}
debug测试测试版本staging,relase测试线上production版本
3)在MainApplication.java添加 CodePush
@Override
protected List getPackages() {
return Arrays.asList(
...
new CodePush(BuildConfig.CODEPUSH_KEY, getApplicationContext(), true),
...
);
}
默认的BuildConfig.CODEPUSH_KEY是staging环境的key。生产环境不用更换,测试过。=。=,会自动检测的。
现在,当运行或构建应用程序时,ReleaseStaging版本将自动配置为与Staging部署同步,并且Release版本将配置为与Production部署同步。
到此集成应该就集成好了。
比如,我们已经打包出去一个APP了,用户在用,那么用户在用的这个APP,最终是加载这个Bundle文件的。所有第一个版本,我们就需要打包Bundle文件到assert目录。
因为我是集成到现有android应用的。所有注意路径的复制
react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output app/src/main/assets/index.android.bundle --assets-dest app/src/main/res/
webstorm创建参考:
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/
成功之后会显示:
这样发出去的包算是第一个初始版本。用户下载之后,不好了,我们发现了bug,此时,code_push就派上用处了。首先,我们修复了bug,当然如果是android+Rreact Native混合开发是不能改动android中的activity等文件的,只能添加修改.js文件。修复好bug之后,就需要发布出去。这个命令是在当前项目的根目录下执行,也可以在ide的控制台下,也是当前项目的根目录
code-push release-react HelloRN android --t 1.0.0 --dev false --d Staging --des "这是第二个更新包" --m true
注意: CodePush默认是更新Staging 环境的,如果发布生产环境的更新包,需要指定--d参数:--d Production,如果发布的是强制更新包,需要加上 --m true强制更新
成功示意图
其他的一些参数命令,请在链接中去寻找。
发错了,版本回滚
查看版本
code-push deployment history HelloRN Staging
// 回滚
code-push rollback Production --targetRelease v1(有对应是v几)
图片就没有了。成功。
回滚成功之后就是这样子了。
回滚的时候到v几的版本,就会重新提示v几版本的提示