Как проверить наличие интернет-соединения в приложении Expo React Native?

У меня есть приложение Expo, использующее Управляемый рабочий процесс. Приложение должно проверить, доступно ли подключение к Интернету.

  • Я не могу import { NetInfo } from 'react-native', потому что это устарело.
  • Я не могу использовать Реагировать-родное-сообщество/реагировать-родной-netinfo, потому что он использует собственные библиотеки, а вы не можете сделать это с управляемым приложением Expo.
  • Я мог бы извлечь, чтобы использовать вышеперечисленное, но не похоже, что мне нужно делать это только для того, чтобы проверить, есть ли подключение к Интернету.
  • Я не могу использовать navigator.onLine, потому что эта глобальная переменная недоступна.
  • Я мог бы сделать тривиальный HTTP-запрос к Google, своему собственному серверу или чему-то еще и посмотреть, получу ли я ответ, но это проверяет только соединение с одним сайтом, а также требует времени и использует пропускную способность.

Что я должен делать?

Я не понимаю. Почему я должен вынимать его, чтобы использовать модуль netinfo, когда я использую Expo?

hong developer 19.06.2019 16:32

@hongdevelop Вы не можете добавлять свои собственные модули или использовать react-native link с управляемым проектом Expo. docs.expo.io/versions/latest/introduction/faq/…

Dan B. 19.06.2019 16:47

Модуль netinfo можно использовать без добавления модулей.

hong developer 19.06.2019 16:53

@hongdevelop Какой модуль NetInfo? Тот, который устарел?

Dan B. 19.06.2019 17:20

NetInfo реактивного натива

hong developer 19.06.2019 18:01

Вы также можете использовать netinfo в expo, потому что вы можете использовать базовый модуль react-native в expo.

hong developer 19.06.2019 18:02

@hongdevelop Это тот, который устарел.

Dan B. 19.06.2019 20:51
Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
9
7
9 958
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Используйте NetInfo из react-native.

Да, он устарел, потому что они планируют удалить его в следующей версии react-native в пользу версии для сообщества. Тем не менее, он полностью функционален и его все еще можно использовать, просто не забудьте проверить наличие критических изменений, когда будут выпущены следующие версии Expo SDK.

Вполне вероятно, что Expo включит его в свой управляемый рабочий процесс, когда react-native удалит его, или предоставит альтернативу, которая не потребует извлечения из Expo.

Очень сложно определить, есть ли у устройства интернет или нет stackoverflow.com/a/189443/7602110, просто по неудачным запросам XHR вы можете сказать, что у вас есть интернет, но это не так надежно. Вы хотели бы проверить некоторые надежные веб-сайты, такие как google.com, у меня есть обходной путь, но я на самом деле не рекомендую его, решать вам.

Вы можете использовать метод Linking.canOpenUrl() из самого React Native, который вернет объект Promise. Когда определяется, можно ли обработать данный URL-адрес, обещание разрешается, и первым параметром является то, можно ли его открыть.

Затем добавьте запрос, и если статус ответа будет 200, у вас должен быть интернет.

import React, { Component } from 'react';
import { Button, Text, View, StyleSheet, Linking } from 'react-native';

export default class App extends Component {
  state = {
    connection: false,
    url: 'https://google.com',
  };

  checkInternt = () => {
    Linking.canOpenURL(this.state.url).then(connection => {
      if (!connection) {
        this.setState({ connection: false });
      } else {
        fetch(this.state.url).then(res =>
          this.setState({ connection: res.status !== 200 ? false : true })
        );
      }
    });
  };

  componentDidMount() {
    this.checkInternt();
  }

  handlePress = () => {
    this.setState({
      url:
        this.state.url === 'https://google.com'
          ? 'http://someweirdurlthatdoesntwork.com'
          : 'https://google.com',
    });
    this.checkInternt();
  };

  render() {
    return (
      <View style = {styles.container}>
        <Text>
          Connection:
          <Text style = {{ color: this.state.connection ? 'green' : 'red' }}>
            {`   ${this.state.connection}`}
          </Text>
        </Text>
        <Text>{this.state.url.replace(/\https?:///g, '')}</Text>
        <Button onPress = {this.handlePress} title = "Change server url" />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'space-around',
    alignItems: 'center',
  },
});

Проверьте перекус: закуска.expo.io/@abranhe/check-internet

Expo SDK 34 уже включает NetInfo API.

Вы можете проверить их документацию для SDK 34 здесь https://docs.expo.io/versions/v34.0.0/sdk/netinfo

Вот ссылка на документацию для Последняя версия

Другие вопросы по теме