引用 SystemConfiguration.framework
#import "SystemConfiguration/SystemConfiguration.h"
#include "netdb.h"
- (BOOL) connectedToNetwork
{
// 創建零地址,0.0.0.0的地址表示查詢本機的網絡連接狀態
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
/**
* SCNetworkReachabilityRef: 用來保存創建測試連接返回的引用
*
* SCNetworkReachabilityCreateWithAddress: 根據傳入的地址測試連接.
* 第一個參數可以為NULL或kCFAllocatorDefault
* 第二個參數為需要測試連接的IP地址,當為0.0.0.0時則可以查詢本機的網絡連接狀態.
* 同時返回一個引用必須在用完後釋放.
* PS: SCNetworkReachabilityCreateWithName: 這個是根據傳入的網址測試連接,
* 第二個參數比如為"www.2cto.com",其他和上一個一樣.
*
* SCNetworkReachabilityGetFlags: 這個函數用來獲得測試連接的狀態,
* 第一個參數為之前建立的測試連接的引用,
* 第二個參數用來保存獲得的狀態,
* 如果能獲得狀態則返回TRUE,否則返回FALSE
*
*/
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
printf("Error. Could not recover network reachability flagsn");
return NO;
}
/**
* kSCNetworkReachabilityFlagsReachable: 能夠連接網絡
* kSCNetworkReachabilityFlagsConnectionRequired: 能夠連接網絡,但是首先得建立連接過程
* kSCNetworkReachabilityFlagsIsWWAN: 判斷是否通過蜂窩網覆蓋的連接,
* 比如EDGE,GPRS或者目前的3G.主要是區別通過WiFi的連接.
*
*/
BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
return (isReachable && !needsConnection) ? YES : NO;
}