React Native Android не поддерживает обновление codepush - PullRequest
0 голосов
/ 20 сентября 2019

Я следовал тому, что могу сказать, это правильные шаги для правильной настройки 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, чтобы обернуть мой основной компонент приложения, это правда?Для чего я пытался добавить этот метод в разных местах, где мое приложение запущено, и оно все еще не работает.

...