检测用户是不是连接到互联网?

Posted

技术标签:

【中文标题】检测用户是不是连接到互联网?【英文标题】:Detect if the user is connected to the internet?检测用户是否连接到互联网? 【发布时间】:2018-12-27 07:19:07 【问题描述】:

我想将用户路由到某个屏幕,以防他没有连接到互联网。

我只是无法检测他是否已连接。

我试过这段代码,但没有用:

async componentWillMount()

   if (!await NetInfo.isConnected)
   
      this.props.navigation.navigate('Saved');
   

有什么经过测试的解决方案可以推荐吗?

【问题讨论】:

Detect network connection in React Redux app - if offline, hide component from user的可能重复 @vahdet 你确定链接问题使用的浏览器 API 在 react-native 中可用吗? 在评论时,react 在标签中。不过,在某些情况下不删除可能对任何人都有帮助。谢谢! 这是一篇有趣的文章medium.com/@kulor/…,介绍了为什么 NetInfo 不是最好的方法。它解释说,当用户连接到付费墙后面的 WiFi 时,NetInfo 会报告用户已连接。文章提出了一个解决方案。 【参考方案1】:

试试await NetInfo.isConnected.fetch()

参考:https://facebook.github.io/react-native/docs/netinfo.html#isconnected

【讨论】:

等待:D,您的回答被接受,但有问题手机可能有来自 WIFI 的互联网连接或移动数据,您的解决方案适用于 WIFI,但如果手机是从 DATA 连接的“等待 NetInfo .isConnected.fetch()" 返回 false; @27mdmo7sn 可能与android 上的ACCESS_NETWORK_STATE 权限有关。【参考方案2】:

您可以使用NetInfo 进行检查。 为此,您必须像这样添加connectionChange 事件监听器

componentDidMount() 
        NetInfo.isConnected.addEventListener('connectionChange', this.handleConnectionChange.bind(this));
        NetInfo.isConnected.fetch().done(
            (isConnected) =>  this.setState( isConnected: isConnected ); 
        );

然后移除componentWillUnmount中的事件监听器

componentWillUnmount() 
        NetInfo.isConnected.removeEventListener('connectionChange', this.handleConnectionChange);
    

最后是连接更改的处理程序方法。我将状态存储在设备本地存储中,您可以随心所欲。

handleConnectionChange = (isConnected) => 
        if (isConnected) 
            //ToastAndroid.show('Data sync in process...', ToastAndroid.SHORT);
            AsyncStorage.getItem('offlineData')
                .then((json) => JSON.parse(json))
                .then((data) => 
                    console.log(JSON.stringify(data));
                );
        
        else  ToastAndroid.show('You are offline.', ToastAndroid.SHORT); 

        this.setState( isConnected: isConnected );
    

别忘了在react-native 中添加NetInfo :)

【讨论】:

【参考方案3】:

另一种解决方案(不使用 isConnected 属性)是直接使用从事件处理程序返回的对象,如下所示:

componentDidMount() 
  NetInfo.addEventListener('connectionChange', this.handleNetworkChange);


componentWillUnmount() 
  NetInfo.removeEventListener('connectionChange', this.handleNetworkChange);


handleNetworkChange = (info) => 
    if (info.type === 'none') 
      this.props.navigation.navigate('Saved');
    
;

根据 NetInfo 文档:

connectionChange 事件在网络状态改变时触发。事件处理程序的参数是一个带有键的对象:

type:一个 ConnectionType(上面列出的)

effectiveType:一个 EffectiveConnectionType(上面列出的)

连接类型可以是以下之一:无、wifi、蜂窝、未知。

理想情况下,您可以将此信息存储到您的 redux 存储中,并将侦听器存储到根组件。

我们在使用 isConnected 时遇到了一个奇怪的错误,类似于您提到的@Gabriel Bleu,但对我们而言,NetInfo.isConnected.fetch() 仅在 Android 设备在一段时间不活动后唤醒时才返回 false。我们使用了它为用户显示离线警告,因此警告永远不会离开。我在 Spencer Carli 的课程中​​找到了这个解决方案,它似乎效果更好,但根据您的需要,您可能希望将 isConnected 与上述代码结合使用。

【讨论】:

【参考方案4】:

这是检查onlineoffline 的一个很好的示例,甚至您也可以获得连接更改信息。 Source

NetInfo.isConnected.fetch().then(isConnected => 
  console.log('First, is ' + (isConnected ? 'online' : 'offline'));
);
function handleFirstConnectivityChange(isConnected) 
  console.log('Then, is ' + (isConnected ? 'online' : 'offline'));
  NetInfo.isConnected.removeEventListener(
     'connectionChange',
     handleFirstConnectivityChange
  );

NetInfo.isConnected.addEventListener(
  'connectionChange',
  handleFirstConnectivityChange
);

【讨论】:

【参考方案5】:

您的代码目前存在两个问题。

    在较新版本的 react 生命周期方法 componentWillMount 已弃用。 较新版本的 react-native 已将 NetInfo 模块从核心中提取出来。请改用@react-native-community/netinfo。

为了实现所需的行为,您应该这样做。

import NetInfo from "@react-native-community/netinfo";

class CheckConnection extends Component 

    componentDidMount() 
        
        NetInfo.fetch().then(state => 
            handleConnectionState(state)
        ); 
        
    
        
    handleConnectionState(state) 
        console.log("Connection type", state.type);
        console.log("Is connected?", state.isConnected);
        ... your code to handle the lack of connection
        
    


【讨论】:

以上是关于检测用户是不是连接到互联网?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测系统是不是连接到 ad hoc 或基础设施 wifi?

Alamofire - 检测互联网连接

检测Android上是不是有可用的互联网连接[重复]

如何检测互联网连接[重复]

检查可执行文件是不是可以尝试连接到互联网

检查是不是连接到 WiFi(即使没有互联网)或移动数据