I’m running into the same problem. I have the following code, as per this website under manual updates.
The app idles indefinitely after Loader.js run Updates.checkForUpdateAsync()
. The app will mount <AppNavigator/>
because of this problem and users will never see the app.
AppEntry.js
import React from "react";
import { StyleSheet, View } from "react-native";
import { Provider } from "react-redux";
import store from "./redux/store";
import AppNavigator from "./navigation/AppNavigator";
import Loader from "./shared/Loader"; // see file definition further down comment
export default class App extends React.Component {
state = {
isLoadingComplete: false,
};
render() {
return (
<Provider store={store}>
<React.Fragment>
{!this.state.isLoadingComplete && (
<Loader
onFinish={this._handleFinishLoading}
onError={this._handleLoadingError}
/>
)}
{this.state.isLoadingComplete && (
<AppNavigator />
)}
</React.Fragment>
</Provider>
);
}
_handleLoadingError = (error) => {
console.warn(error);
};
_handleFinishLoading = () => {
this.setState({ isLoadingComplete: true });
};
}
Loading.js
import Expo, { Updates } from "expo";
import React from "react";
import { connect } from "react-redux";
import {
StyleSheet,
View,
Dimensions,
ActivityIndicator,
Text,
} from "react-native";
import Dispatchers from "../redux/dispatchers";
var { width, height } = Dimensions.get("window");
const styles = StyleSheet.create({
container: {
width,
height,
flex: 1,
backgroundColor: "#000",
paddingTop: 100,
},
text: {
color: "#fff",
textAlign: "center",
marginBottom: 10,
},
});
class Loader extends React.Component {
componentDidMount = () => {
try {
const update = await Updates.checkForUpdateAsync();
if (update.isAvailable) {
await Updates.fetchUpdateAsync();
// ... notify user of update ...
Updates.reloadFromCache();
}
// continues back to AppEntry.js since at this point the latest version has been downloaded
this.props.onFinish();
} catch (e) {
// handle or log error
}
};
render() {
// if (!this.props.initialLoadComplete ){
return (
<View style={styles.container}>
<Text style={styles.text}>Loading</Text>
<ActivityIndicator color={"#fff"} size='large' />
</View>
);
// }
}
}
export default connect((state) => ({}), Dispatchers)(Loader);
app.json
{
"expo": {
"name": "____",
"description": "Adriaan Balt",
"slug": "snack-___",
"privacy": "unlisted",
"sdkVersion": "35.0.0",
"version": "1.0.0",
"orientation": "portrait",
"primaryColor": "#000000",
"icon": "./assets/expo-icon.png",
"packagerOpts": {
"assetExts": ["ttf", "mp4", "otf", "xml", "json", "png"]
},
"ios": {
"buildNumber": "1.0.0",
"supportsTablet": true,
"bundleIdentifier": "com.__.__",
},
"platforms": ["ios"],
"updates": {
"enabled": true,
"checkAutomatically": "ON_ERROR_RECOVERY",
"fallbackToCacheTimeout": 0
}
}
}