117 lines
3.3 KiB
JavaScript
117 lines
3.3 KiB
JavaScript
|
import React, { Component } from 'react';
|
||
|
import { Platform, Alert, Linking, AppState } from 'react-native';
|
||
|
|
||
|
import {
|
||
|
isFirstTime,
|
||
|
isRolledBack,
|
||
|
checkUpdate,
|
||
|
downloadUpdate,
|
||
|
switchVersion,
|
||
|
switchVersionLater,
|
||
|
markSuccess,
|
||
|
downloadAndInstallApk,
|
||
|
} from './main';
|
||
|
|
||
|
import _updateConfig from '../../../update.json';
|
||
|
const { appKey } = _updateConfig[Platform.OS];
|
||
|
|
||
|
export function simpleUpdate(WrappedComponent) {
|
||
|
return __DEV__
|
||
|
? WrappedComponent
|
||
|
: class AppUpdate extends Component {
|
||
|
componentDidMount() {
|
||
|
if (isRolledBack) {
|
||
|
Alert.alert('抱歉', '刚刚更新遭遇错误,已为您恢复到更新前版本');
|
||
|
} else if (isFirstTime) {
|
||
|
markSuccess();
|
||
|
}
|
||
|
this.stateListener = AppState.addEventListener(
|
||
|
'change',
|
||
|
(nextAppState) => {
|
||
|
if (nextAppState === 'active') {
|
||
|
this.checkUpdate();
|
||
|
}
|
||
|
},
|
||
|
);
|
||
|
this.checkUpdate();
|
||
|
}
|
||
|
componentWillUnmount() {
|
||
|
this.stateListener.remove();
|
||
|
}
|
||
|
doUpdate = async (info) => {
|
||
|
try {
|
||
|
const hash = await downloadUpdate(info);
|
||
|
this.stateListener.remove();
|
||
|
Alert.alert('提示', '下载完毕,是否立即更新?', [
|
||
|
{
|
||
|
text: '以后再说',
|
||
|
style: 'cancel',
|
||
|
onPress: () => {
|
||
|
switchVersionLater(hash);
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
text: '立即更新',
|
||
|
style: 'default',
|
||
|
onPress: () => {
|
||
|
switchVersion(hash);
|
||
|
},
|
||
|
},
|
||
|
]);
|
||
|
} catch (err) {
|
||
|
Alert.alert('更新失败', err.message);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
checkUpdate = async () => {
|
||
|
let info;
|
||
|
try {
|
||
|
info = await checkUpdate(appKey);
|
||
|
} catch (err) {
|
||
|
Alert.alert('更新检查失败', err.message);
|
||
|
return;
|
||
|
}
|
||
|
if (info.expired) {
|
||
|
Alert.alert('提示', '您的应用版本已更新,点击确定下载安装新版本', [
|
||
|
{
|
||
|
text: '确定',
|
||
|
onPress: () => {
|
||
|
if (info.downloadUrl) {
|
||
|
if (
|
||
|
Platform.OS === 'android' &&
|
||
|
info.downloadUrl.endsWith('.apk')
|
||
|
) {
|
||
|
downloadAndInstallApk({
|
||
|
url: info.downloadUrl,
|
||
|
});
|
||
|
} else {
|
||
|
Linking.openURL(info.downloadUrl);
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
},
|
||
|
]);
|
||
|
} else {
|
||
|
Alert.alert(
|
||
|
'提示',
|
||
|
'检查到新的版本' + info.name + ',是否下载?\n' + info.description,
|
||
|
[
|
||
|
{ text: '否', style: 'cancel' },
|
||
|
{
|
||
|
text: '是',
|
||
|
style: 'default',
|
||
|
onPress: () => {
|
||
|
this.doUpdate(info);
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
render() {
|
||
|
return <WrappedComponent {...this.props} />;
|
||
|
}
|
||
|
};
|
||
|
}
|