关于RN APP如何增量更新的文章满大街都是,RN的官网也有,具体我没试过,所以就不多说了。
但是目前就我留意到的情况来说,市场上很大一部分APP并不是使用增量更新,而是直接非常彻底的全量更新,于是我尝试去实现以下。
实现步骤其实非常简单,不考虑复杂情况的话,大概流程就是:
请求接口对比版本,如果比当前版本高的话,就直接下载接口里面返回来的apk下载链接,最后把新的版本持久化保存,每次打开APP的时候都偷偷对比一下,如此循环,当然还有很多细节,例如判断是否wifi环境,如果是wifi环境的话可以偷偷后台下载,下载完成之后再弹出安装,或者是下次再打开APP的时候告诉用户已经早就下载好了可以直接安装了,等等这些细节;
安卓更新可以直接调原生的下载程序下载,而IOS的没法子了,直接一个Linking跳转到app store让用户自己点击下载得了。
下载我使用的是 react-native-fetch-blob 这个第三方组件,专门用来上传和下载文件和图片的,具体怎么安装和使用,去组件的官网自己看。
下面是简单实现的代码:
componentDidMount() {
// APP启动的时候弹出更新提示框
if (Platform.OS === 'android') {
Alert.alert(
'温馨提示',
'又推出新版本了~',
[
{ text: '暂不更新', onPress: () => { } },
{ text: '立即更新', onPress: () => this.updateAPP() }
]
);
}
}
/**
* APP 更新,下载后自动切换到安装程序进行安装,android 6.0 亲测没问题(todo: 该下载组件在 android 7.0 解析下载的APK出错,无法安装)
* issue: https://github.com/wkh237/react-native-fetch-blob/issues/394
*/
updateAPP = (): void => {
if (Platform.OS === 'android') {
// android 更新直接下载并自动安装
console.warn('更新');
const android = RNFetchBlob.android;
RNFetchBlob.config({
addAndroidDownloads: {
// 调起原生下载管理
useDownloadManager: true,
// 你想要设置的下载的安装包保存的名字
title: 'xxx.apk',
// 下载时候顶部通知栏的描述
description: '下载完成之后将会自动安装',
// 下载的文件格式
mime: 'application/vnd.android.package-archive',
// 下载完成之后扫描下载的文件
mediaScannable: true,
// 通知栏显示下载情况
notification: true,
// 文件下载的同时缓存起来,提高操作效率
fileCache: true
}
})
.fetch('GET', `下载的APK地址.apk`)
.progress((received: any, total: any) => {
// todo:貌似下载进度无法响应
console.warn('下载进度:' + Math.floor(received / total * 100) + '%')
})
.then((res: any) => {
// 下载完成之后自动切换到安装管理程序
android.actionViewIntent(res.path(), 'application/vnd.android.package-archive');
})
.catch((err: any) => {
console.warn('下载失败');
console.warn(err);
});
} else {
// ios 更新,点击跳转到 APP_STORE 对应的 APP 页面
Linking.canOpenURL('https://itunes.apple.com/cn/app/你已上架的app对应的appid').then((supported: boolean) => {
// 检测是否安装了对应的应用
if (!supported) {
console.warn('找不到对应的应用');
} else {
return Linking.openURL(LINKING.APP_STORE);
}
}).catch((err: any) => {
console.error('跳转到APP_STORE失败,失败原因:', err);
});
}
};