一、监听——网络连接状态变化自动调用回调

Swift版本

  1. 通过CocoaPods或者Carthage安装Reachability,地址: https://github.com/ashleymills/Reachability.swift

  2. 通过闭包测试reachability

    let reachability = Reachability()!
    reachability.whenReachable = { reachability in
        if reachability.connection == .wifi {
            print("Reachable via WiFi")
        } else {
            print("Reachable via Cellular")
    reachability.whenUnreachable = { _ in
        print("Not reachable")
        try reachability.startNotifier()
    } catch {
        print("Unable to start notifier")
    

    Objective-C版本

    1. 添加SystemConfigurationframework到项目中

    2. 添加Tony Million’s 版本的Reachability.hReachability.m到项目中,地址:https://github.com/tonymillion/Reachability

    3. 更新接口部分

      #import "Reachability.h"
      @interface MyViewController ()
          Reachability *_internetReachableFoo;
      
    4. .m文件中执行对应的方法

      // 检查我们是否有互联网连接
      - (void)testInternetConnection
          _internetReachableFoo = [Reachability reachabilityWithHostname:@"www.baidu.com"];
          // 网络可用
          _internetReachableFoo.reachableBlock = ^(Reachability*reach)
              //主线程更新UI
              dispatch_async(dispatch_get_main_queue(), ^{
                  NSLog(@"网络可用");
          // 网络不可用
          _internetReachableFoo.unreachableBlock = ^(Reachability*reach)
              //主线程更新UI
              dispatch_async(dispatch_get_main_queue(), ^{
                  NSLog(@"网络不可用");
          [_internetReachableFoo startNotifier];
      

      重要提示:Reachability类是项目中最常用的类之一,因此您可能会遇到与其他项目的命名冲突。如果发生这种情况,您将不得不重命名Reachability.hReachability.m为其他名称以便解决问题。

    二、主动获取——使用网络时调用方法判断

    1.使用Reachability版本

    1. 添加SystemConfigurationframework到项目中

    2. 添加Tony Million’s 版本的Reachability.hReachability.m到项目中,地址:https://github.com/tonymillion/Reachability

    3. 函数

    //Class.h
    #import "Reachability.h"
    #import <SystemConfiguration/SystemConfiguration.h>
    - (BOOL)connected;
    //Class.m
    - (BOOL)connected
        Reachability *reachability = [Reachability reachabilityForInternetConnection];
        NetworkStatus networkStatus = [reachability currentReachabilityStatus];
        return networkStatus != NotReachable;
    

    在需要判断网络连接状态的地方调用方法如下:

    if (![self connected]) {
        // Not connected
    } else {
        // Connected. Do some Internet stuff
    

    2.非Reachability版本

    1. 添加SystemConfigurationframework到项目中
    2. 导入头文件
    #import <sys/socket.h>
    #import <netinet/in.h>
    #import <SystemConfiguration/SystemConfiguration.h>
    
    +(BOOL)hasConnectivity {
        struct sockaddr_in zeroAddress;
        bzero(&zeroAddress, sizeof(zeroAddress));
        zeroAddress.sin_len = sizeof(zeroAddress);
        zeroAddress.sin_family = AF_INET;
        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);
        if (reachability != NULL) {
            //NetworkStatus retVal = NotReachable;
            SCNetworkReachabilityFlags flags;
            if (SCNetworkReachabilityGetFlags(reachability, &flags)) {
                if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
                    // If target host is not reachable
                    return NO;
                if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
                    // If target host is reachable and no connection is required
                    //  then we'll assume (for now) that your on Wi-Fi
                    return YES;
                if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
                     (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
                    // ... and the connection is on-demand (or on-traffic) if the
                    //     calling application is using the CFSocketStream or higher APIs.
                    if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
                        // ... and no [user] intervention is needed
                        return YES;
                if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
                    // ... but WWAN connections are OK if the calling application
                    //     is using the CFNetwork (CFSocketStream?) APIs.
                    return YES;
        return NO;
    

    https://github.com/zhzhl1993/MacOS-Development/tree/master/Demo/TestReachbility

    How to check for an active Internet connection on iOS or macOS?

    开发过程中,需要监听网络的连接状态,那么如何去监听呢?Swift版本通过CocoaPods或者Carthage安装Reachability,地址:https://github.com/ashleymills/Reachability.swift通过闭包测试reachabilitylet reachability = Reachability()!reachability.whe...
    mac code 128 npm ERR! An unknown git error occurred fatal: bad numeric config value ‘“false”‘ for ‘http.sslverify‘: invalid unit error: key does not contain a section: –-global could not lock config file /etc/gitconfig: Permission denied.
        // Create zero addy     struct sockaddr_in zeroAddress;     bzero(&amp;zeroAddress, sizeof(zeroAddress));     zeroAddress.sin_len = sizeof(zeroAddress);     ze...
    Reachability *r = [Reachability reachabilityWithHostName:@"www.apple.com"]; switch ([r currentReachabilityStatus]) { case NotReachable:// 没有网络连接 result=nil; break;
    mac app和ios 判断网络连接状态差不多,具体可以参考下面的帖子 https://www.cnblogs.com/wuqh-iOS/p/4720525.html 在这里需要强调的是,在10.10的系统上不能认为只要有kSCNetworkReachabilityFlagsReachable状态就认为有网,这是不对的。 经测试在10.10的系统上断网后,通过SCNetworkReachab...
    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layou...
    Linux 入门基础 注:文件(夹)权限/防火墙/开放端口 ----------------------------------------------------------------------------------------------- 第一课 Linux安装 1.使用VM Virtualbox 虚拟机(养成使用开源软件) 2.安装CentOS 6.3 X86(全称为:Communi...
    MAC地址是以太网MAC子层所使用的地址(数据链路层) IP地址是TCP/IP体系结构网际层所使用的地址 ARP协议属于TCP/IP体系结构的网际层,起作用是已只设备所分配到的IP地址,使用ARP协议可以通过该IP地址获取到设备的MAC地址 MAC地址 使用点对点信道的数据链路层不需要地址,因为只是两个对象,点对点就可以了 但是在广播域中,多个主机连接在一个广播通道上,要想实现两个主机之间的通信,则每个主句都必须有一个唯一的标识,即一个数据链路层地址; 在每个组件发送的
    在使用一个长连接的TCP时,如果TCP服务器端接收到TCP的客户端连接过来后,接着服务器端的TCP节点需要对这个客户端进行数据收发,收发时需要判断这个SOCKET是否可用用,判断方法有多种; 1.linux的5种方法,本人在使用modbus服务器端判断已经连接的设备或是gprs服务器对已经连接的GPRS设备判断,推荐使用方法2. 当recv()返回值小于等于0时,socket连...
    众所周知,我们在开发APP时,涉及网络连接的时候,都会想着提前判断一下当前的网络连接状态,如果没有网络,就不再请求url,省去不必要的步骤,所以,这个如何判断?其实很简单。 前提:工程添加:SystemConfiguration.framework framework 然后在需要判断的类中包含头文件: #import "Reachability.h" 【如果你使用的ASIH