1. 在SystemConfiguration.famework中提供和联网相关的function, 可用来检查网络连接状态。

2. SC(SystemConfiguration)框架中关于测试连接网络状态相关的函数定义在SCNetworkReachability.h文件中,主要函数如下:

// 创建测试连接的引用
SCNetworkReachabilityRef SCNetworkReachabilityCreateWithAddress(CFAllocatorRef allocator, const struct sockaddr *address);
// 根据传入的地址测试连接, 第一参数可以为NULL或kCFAllocatorDefault, 第二参数为需要测试连接的IP地址,当为0.0.0.0时则可以查询本机的网络连接状态, 同时返回一个引用必须在用完后释放。
SCNetworkReachabilityRef SCNetworkReachabilityCreateWithName(CFAllocatorRef allocator, const char *nodename);
// 根据传入的网址测试连接,第二参数如"www.apple.com",其他与上同 
// 确定连接的状态
Boolean SCNetworkReachabilityGetFlags(SCNetworkReachability target, SCNetworkReachabilityFlags *flags);
// 用来获得测试连接的状态,第一参数为之前建立的测试连接引用,第二参数用来保存获得的状态,如果获得状态则返回TRUE, 否则返回FALSE

主要的数据类型如下:

SCNetworkReachabilityRef : 用来保存创建测试连接返回的引用

主要常量如下:

Network Reachability Flags:

Flags that indicate the reachability of a network node name or address, including whether a connction is required, and whether some user intervention might by required when eatablishing a connection.

标识(Flags)代表对一个域名(网络结点)或者地址(IP)的可连接性, 其包括是否需要一个网络连接以及在建立网络连接的过程中是否需要用户干预。

<span style="">kSCNetworkReachabilityFlagsIsWWAN </span>:
 
The specified node name or address can be reached via a cellular connection, such ad EDGE or GPRS.
 
通过EDGE(2G到3G的过渡技术方案,这里可以理解为3G)或者GPRS(2G)连接到指定域名或地址。<br><br>
<span style="">kSCNetworkReachabilityFlagsReachable</span> :<br>
The specified node name or address can be reached using the current network configuration.<br>
通过当前的网络配置可连接到指定的域名和地址。<br>
<span style="">kSCNetworkReachabilityFlagsTransientConnection</span> :<br>
The specified node name or address can be reached via a transient connection, such as PPP.<br>
通过一个短暂的(网络)连接可以到达指定的域名或地址,比如PPP(Point to Point Protocol)协议。<br>
<span style=""> kSCNetworkReachabilityFlagsConnectionRequired</span> : <br>
The specified node name or address can be reached using the current network configuration, but a connection must first be
established. If this flag is set, the kSCNetworkReachabilityFlagsConnectionOnTraffic flag, kSCNetworkReachabilityFlagsConnectionOnDemand flag, or kSCNetworkReachabilityFlagsIsWWAN flag is also typically set to indicate the type of connection required. If the user must manually make the connection, the kSCNetworkReachabilityFlagsInterventionRequired flag is also set.<br><br>可通过当前的网络配置连接到指定的域名或地址,但首先必须建立一个网络连接。如果此标识(kSCNetworkReachabilityFlagsConnectionRequired)被设定,那么标识kSCNetworkReachabilityFlagsConnectionOnTraffic, kSCNetworkReachabilityFlagsConnectionOnDemand或者kSCNetworkabilityFlagsIsWWAN通常应被设定为指定的网络连接要求类型。如果用户必须手动生成此连接, 那么kSCNetworkReachabilityFlagsInterventionRequired标识也应要设定。<br><br>
<span style="">kSCNetworkReachabilityFlagsConnectionOnTraffic</span> :
 
The specified node name or address can be reached using the current network configuration, but a connection must first be established.
Any traffic directed to the specified name or address will initiate the connection.<br><br>可通过当前网络配置连接到指定的域名或地址,但首先必须建立一个网络连接,任何到达指定域名或地址的连接都将始于此连接。<br><br>
<span style="">kSCNetworkReachabilityFlagsInterventionRequired</span> :
 
The specified node name or address can be reached using the current network configuration, but a connection must first be established.<br><br>可通过当前网络配置连接到指定的域名或地址,但首先必须建立一个网络连接。<br><br>
<span style="">kSCNetworkReachabilityFlagsConnectioniOnDemand</span> :
 
The specified node name or address can be reached using using the current network configuration, but a connection must first be established. <br>The connection will be established "On Demand" by the CFSocketStream programming interface (see CFStream Socket Additions for information on <br>this). Other functions will not establish the connection.<br><br>
可通过当前网络配置连接到指定的域名或地址,但首先必须建立一个网络连接。连接必须通过CFSocketSteam编程接口建立,其它函数将无法建立此连接。<br><br>
<span style="">kSCNetworkReachabilityFlagsIsLocalAddress</span> :
 
The specified node name or address is one that is associated with a network interface on the current system.<br><br>指定的域名或地址与当前系统的网络接口相关(即本地的网络地址)。<br><br>
<span style="">kSCNetworkReachabilityFlagsIsDirect</span> :
 
Network traffic to the specified node name or address will not go through a gateway, but is routed directly to one of the interface in the system.<br><br>网络流量将不通过网关,而会直接的导向系统中的接口。<br><br>

3. 代码示例:

+ (BOOL) connectedToNetwork
{
    // 创建零地址,0.0.0.0地址表示查询本机的网络连接状态
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;
    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;
    // Get connect flags
    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);
    // 如果不能获取连接标志,则不能连接网络,直接返回
    if (!didRetrieveFlags)
    {
         return NO;
    }
 
    // 根据获得的连接标志进行判断
    BOOL isReachable = flag & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
 
    return (isReachable && !needsConnection) ? YES : NO;
}

//-判断当前网络是否可用

+(BOOL) isNetworkEnabled

{

BOOL bEnabled = FALSE;

NSString *url = @"www.baidu.com";

SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(NULL, [url UTF8String]);

SCNetworkReachabilityFlags flags;

bEnabled = SCNetworkReachabilityGetFlags(ref, &flags);

CFRelease(ref);

if (bEnabled) {

//        kSCNetworkReachabilityFlagsReachable:能够连接网络

//        kSCNetworkReachabilityFlagsConnectionRequired:能够连接网络,但是首先得建立连接过程

//        kSCNetworkReachabilityFlagsIsWWAN:判断是否通过蜂窝网覆盖的连接,比如EDGE,GPRS或者目前的3G.主要是区别通过WiFi的连接。

BOOL flagsReachable = ((flags & kSCNetworkFlagsReachable) != 0);

BOOL connectionRequired = ((flags & kSCNetworkFlagsConnectionRequired) != 0);

BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;

bEnabled = ((flagsReachable && !connectionRequired) || nonWiFi) ? YES : NO;

}

return bEnabled;

}

Info.plist中对UIRequiresPersistentWifi, 可让程序持续保持无线网络的连接状态。

IOS(SystemConfiguration)框架中关于测试连接网络状态相关方法的更多相关文章

  1. Spring框架中 配置c3p0连接池 完成对数据库的访问

    开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...

  2. Spring框架中 配置c3p0连接池

    开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...

  3. SSM框架中数据库无法连接的问题

    首先是SSM框架中所有的配置都是没有问题的,而且项目在其他人的环境上也能正常访问数据库:那么最有可能的就是数据库版本的问题导致数据库连接不上,服务器给我的报错是: 15:37:25.902 [C3P0 ...

  4. VM虚拟机中Ubuntu无法连接网络

    之前Ubuntu是可以上网的,但是今天打开后发现上不了网了,经过一番折腾,弄好了,记录下. 方案一:将网络连接设置为自定义NAT VM ->设置-> 硬件->网络适配器 这么已修改就 ...

  5. iOS开发之XCode模拟器不能连接网络

    新装的Xcode7 编译程序 出现 #warning: 获取app配置信息失败: The resource could not be loaded because the App Transport ...

  6. Unit Test测试框架中的测试的执行顺序

    [ClassInitialize()] [ClassCleanup()] [TestInitialize()] [TestMethod] [TestCleanup()] 在执行一个或多个[TestMe ...

  7. 安卓中使用HttpURLConnection连接网络简单示例 --Android网络编程

    MainActivity.java: package thonlon.example.cn.httpurlconnectionpro; import android.os.Bundle;import ...

  8. 用ASP创建API。NET Core (Day2):在ASP中创建API。网络核心

    下载PDF article - 1.5 MB 下载source - 152.4 KB 下载source - 206.3 KB 下载source code from GitHub 表的内容 中间件路线图 ...

  9. 用BroadcastReceiver监听网络状态的变化

    在用户浏览网络信息时,如果网络突然断开,可以及时的提醒用户网络已断开.要实现这个功能,我们可以实现一个广播接收者来接收网络状态改变的广播,当由连接状态变为断开状态时,系统会发送一条广播,广播接收者接收 ...

随机推荐

  1. poj-----(2828)Buy Tickets(线段树单点更新)

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 12930   Accepted: 6412 Desc ...

  2. 318. Maximum Product of Word Lengths ——本质:英文单词中字符是否出现可以用26bit的整数表示

    Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...

  3. input固定定位后,当input框获取到焦点时,会离开手机软键盘的解决方法

    前些天做页面时候遇到这样一个问题,将input框用position:fixed固定定位在最底部的时候,当Input获取焦点的时候,input框离开了手机软键盘,而不是吸附在软键盘上,效果如下图: 找了 ...

  4. EFCode First 导航属性

    首先谈谈自己对EF的接触的过程吧,最先接触EF只是因为EF支持从数据库把关系扒下来,可以省掉自己写Select.Update.Insert这些SQL语句,而且修改非常方便,后来在使用的过程中发现导航属 ...

  5. cisco 路由配置

    Cisco路由配置基础 刚刚接触cisco路由配置,下面是学习的笔记,感觉命令还是多敲才能熟悉 一. 所处状态各类 router> 用户处于用户命令状态,可以查看网络和主机 router# 用户 ...

  6. CNAPS Code 查询(招商银行)

    招商银行的妹子实在太傻了,根本不知道什么是CNAPS Code.联行号,完全答非所问. 最后还是自己搞定了,如图: 最后再看看招行人员的英语水平,真是不知道什么是东西:

  7. TCP/IP 某些最常见的错误原因码 (errno)列表

    对于在基于 UNIX 的环境中的 TCP/IP 用户,下表列出了某些最常见的错误原因码 (errno).它不是完整的错误列表.可以在文件 /usr/include/sys/errno.h 中找到 Er ...

  8. Countries in War (POJ 3114) Tarjan缩点+最短路

    题目大意: 在一个有向图中,每两点间通信需要一定的时间,但同一个强连通分量里传递信息不用时间,给两点u,v求他们最小的通信时间.   解题过程: 1.首先把强连通分量缩点,然后遍历每一条边来更新两个强 ...

  9. NOIP2005 篝火晚会 解题报告

    佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们按照1,2,… ...

  10. visual studio 2013连接Oracle 11g并获取数据:(二:实现)

    1.VS中新建一个winform窗体 (1)一个按钮 (2)一个数据表格视图(在里面显示得到的数据表) 2.双击按钮进入代码 (1)添加 using System.Data.OracleClient; ...