Состояние обновления при успешном обновлении с помощью кода

Я использую push-push, чтобы обновить свое приложение, ориентированное на реакцию. Я не хочу загружать его в App Store каждый раз, когда делаю обновление, я хочу отправить его прямо на устройство пользователя.

Он работает нормально, приложение обновлено, но я пытаюсь показать уведомление, если обновление прошло успешно.

В документах они делают это следующим образом:

codePush.sync({ updateDialog: true },
  (status) => {
      switch (status) {
          case codePush.SyncStatus.DOWNLOADING_PACKAGE:
              // Show "downloading" modal
              break;
          case codePush.SyncStatus.INSTALLING_UPDATE:
              // Hide "downloading" modal
              break;
      }
  },
  ({ receivedBytes, totalBytes, }) => {
    /* Update download modal progress */
  }
);

Я пытаюсь обновить состояние, если обновление прошло успешно, и показать модальное окно с кнопкой, чтобы скрыть его при нажатии. Таким образом, мой код выглядит следующим образом:

constructor() {
        super();
        this.state = {
            modalVisible: false,
            status: ""
        }
    }

    componentDidMount() {
        let self = this;
        codePush.sync({
                updateDialog: true,
                installMode: codePush.InstallMode.IMMEDIATE
            }, (status) => {
                switch (status) {
                    case codePush.SyncStatus.UPDATE_INSTALLED:
                        self.setState({modalVisible: true});
                        break;
                }
            },
            ({receivedBytes, totalBytes,}) => {
                /* Update download modal progress */
                self.setState({status: "Downloaded " + receivedBytes + " of " + totalBytes});
            }
        );
    }

    renderUpdateNotificationModal(){
        return (
            <Modal
                animationType={"slide"}
                transparent={false}
                visible={this.state.modalVisible}
                onRequestClose={() => {alert("Modal has been closed.")}}
            >
                <View style={{marginTop: 22}}>
                    <View>
                        <Text>Updated</Text>
                        <TouchableHighlight onPress={() => {this.setState({modalVisible: false})}}>
                            <Text>OK</Text>
                        </TouchableHighlight>
                    </View>
                </View>
            </Modal>
        )
    }

    render() {
        return (
            <View style={styles.container}>
                {this.renderUpdateNotificationModal()}
                <Text style={styles.welcome}>
                    Welcome!
                </Text>
                <Text style={styles.instructions}>
                    To get started, edit index.ios.js
                </Text>
                <Text style={styles.instructions}>
                    Press Cmd+R to reload,{'\n'}
                    Cmd+D or shake for dev menu
                </Text>
                <Text style={{fontSize: 18, marginTop: 15, color: "blue", textAlign: "center"}}>{this.state.status}</Text>
            </View>
        );
    }

Но проблема в том, что модальное окно отображается в течение нескольких секунд, а затем исчезает без нажатия на кнопку.

Поскольку состояние установлено в значение true, а затем через несколько секунд в значение false в

case codePush.SyncStatus.UPDATE_INSTALLED:
     self.setState({modalVisible: true});
     break;

Есть идеи, как это решить?


person Boky    schedule 16.06.2017    source источник
comment
Есть ли какой-нибудь флеш-экран после установки обновления? Я думаю, ваше приложение было перезапущено   -  person Kawatare267    schedule 16.06.2017
comment
@ Jiro267 Нет. Модальное окно отображается, а затем через одну секунду оно исчезает, и я вижу обновленный экран. Экран не мигает.   -  person Boky    schedule 16.06.2017
comment
installMode: codePush.InstallMode.IMMEDIATE это должно вызывать принудительный перезапуск приложения в соответствии с github.com/Microsoft/react-native-code-push/blob/master/docs/. Вы уверены, что он не перезапускается и не инициализируется так быстро (приложение довольно минимально выше!), Что вы ошибочно принимаете это за модальное закрытие и сброс состояния? Кажется, указывает на это. Решение будет codePush.InstallMode.ON_NEXT_RESTART или codePush.InstallMode.ON_NEXT_RESUME   -  person G0dsquad    schedule 16.06.2017


Ответы (1)


У меня была такая же проблема при попытке использовать Codepush на странице загрузки. Моя проблема заключалась в том, что на следующем экране был показан updateDialog codePush. Поскольку codePush.sync является функцией Promise, вы можете использовать ее функцию «затем», она обеспечит выполнение ваших заданий в правильном порядке.

эта демонстрация может быть полезно, если вы хотите использовать CodePush. Вы можете соответствующим образом изменить состояние вашего компонента в codePushStatusDidChange ().

person Lord ST    schedule 24.07.2018