Я следовал тому, что могу сказать, это правильные шаги для правильной настройки codepush, но приложение iOs - единственное, которое, кажется, обновляет приложение и сохраняет его.Android, кажется, перезагружается, а затем перезапускается, и обновление, похоже, не применяется.Вот настройки, которые у меня есть на данный момент для реакции-натива и Android
index.js
import {AppRegistry, NativeModules} from 'react-native';
import Main from './Main';
import {name as appName} from './app.json';
AppRegistry.registerComponent(appName, () => Main);
Main.js
import { StyleProvider } from "native-base";
import { Provider } from 'react-redux';
import App from './components/App';
import store from './store';
import getTheme from './native-base-theme/components';
import material from './native-base-theme/variables/material';
import codePush from "react-native-code-push";
import { PortalProvider } from 'react-native-portal'
let codePushOptions = { checkFrequency: codePush.CheckFrequency.MANUAL };
class Main extends Component {
render() {
return (
<Provider store={store}>
<StyleProvider style={getTheme(material)}>
<PortalProvider>
<App />
</PortalProvider>
</StyleProvider>
</Provider>
)
}
}
export default codePush(codePushOptions)(Main);
Внутри App
Я рендерингMenu
, который фактически обрабатывает поиск нового обновления и уведомляет пользователя
Menu
componentWillMount() {
codePush.disallowRestart();
if (process.env.NODE_ENV === 'production') {
Sentry.init({
dsn: "***"
})
codePush.getUpdateMetadata().then((update) => {
if (update) {
Sentry.setRelease(`${version}-codepush:${update.label}`);
}
});
}
}
...
componentDidMount() {
...
this._checkForUpdate()
}
...
_checkForUpdates = () => {
if (this.props.installingUpdate) {
this.props.dispatch(installingUpdate(false))
this.props.dispatch(updateReady(false))
setTimeout(() => {
this.props.dispatch(openSnackBar({
message: "The pending update was installed"
}))
}, 40);
} else {
codePush.checkForUpdate().then(res => {
if (res) {
res.download().then(this._handleUpdateAvailable)
}
})
}
}
_handleUpdateAvailable = localPackage => {
localPackage.install(codePush.InstallMode.IMMEDIATE).then(this._handleUpdateInstalled)
}
_handleUpdateInstalled = res => {
this.props.dispatch(updateReady(true))
}
_installUpdate = () => {
try {
this.props.dispatch(installingUpdate(true))
setTimeout(() => {
const reduxStore = store.getState()
AsyncStorage.setItem('appState', JSON.stringify(reduxStore));
codePush.allowRestart();
// codePush.restartApp()
}, 40);
} catch(e) {
console.log(e)
}
}
Все это приведет к загрузке обновления в фоновом режиме и, когда он будет готов, отобразит «Обновление»."кнопка в меню, которая при нажатии вызывает _installUpdate
Я сохраняю текущее хранилище Redux, чтобы после завершения перезапуска применить хранилище приставок к приложению так, как будто ничего не произошло дляконечный пользователь.
В реальных файлах Android у меня есть точная настройка, в которой говорится, что она нужна, я могу добавить, если необходимо, но я не верю, что это так.
Я был подТакое впечатление, что мне не нужно звонить notifyAppReady()
, потому что я использую HOC
, чтобы обернуть мой основной компонент приложения, это правда?Для чего я пытался добавить этот метод в разных местах, где мое приложение запущено, и оно все еще не работает.