1、判断当前网络
完整代码如下:
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault,(const struct sockaddr*) &zeroAddress);
SCNetworkReachabilityFlags flags;
//判断当前网络是否可达
SCNetworkReachabilityGetFlags(ref, &flags);
CFRelease(ref);//释放ref
BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable));
if (isReachable)
{
NSLog(@"当前有网络");
//判断是否是蜂窝网络
BOOL isWifi = ((flags & kSCNetworkReachabilityFlagsIsWWAN));
if (isWifi)
{
NSLog(@"蜂窝网络");
}
else
{
NSLog(@"Wifi网络");
}
}
else
{
NSLog(@"当前无网络");
}
我们要使用的是系统的SCNetworkReachability类,直接引用头问价会报file not found,引这个类所在的框架<SystemConfiguration/SystemConfiguration.h>。使用sockaddr_in结构体,需要引入头文件<netinet/in.h>
在SCNetworkReachability类中找到这个函数,可以返回网络是否可达的bool值。
Boolean
SCNetworkReachabilityGetFlags (
SCNetworkReachabilityRef target,
SCNetworkReachabilityFlags *flags
) API_AVAILABLE(macos(10.3), ios(2.0));
这个方法需要传两个参数,SCNetworkReachabilityRef类型的target和SCNetworkReachabilityFlags类型的flags,注意这里的 * 和SCNetworkReachabilityFlags的类型,SCNetworkReachabilityFlags是个OPTION,加 * 是要取到falgs的地址。
第一个参数:SCNetworkReachabilityRef类型的target
再去SCNetworkReachability中找创建SCNetworkReachabilityRef的方法,找到这个函数可以返回一个SCNetworkReachabilityRef类型的变量。
SCNetworkReachabilityRef __nullable
SCNetworkReachabilityCreateWithName (
CFAllocatorRef __nullable allocator,
const char *nodename
) API_AVAILABLE(macos(10.3), ios(2.0));
这个函数又需要传两个参数,一个CFAllocatorRef类型的allocator,可为空;另一个是const char类型的nodename。
看了下第一个参数的类型CFAllocatorRef,typedef const struct CF_BRIDGED_TYPE(id) __CFAllocator * CFAllocatorRef;
系统提供了一些供选择的参数:kCFAllocatorDefault、kCFAllocatorSystemDefault等,既然可为空,又提供了我们就先用默认的kCFAllocatorDefault试试。
第二个参数const char 类型的域名。传入域名,然后UTF8就可以了。
SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [@"" UTF8String]);
还找到两个个函数也可以返回SCNetworkReachabilityRef,我们用这个:
SCNetworkReachabilityRef __nullable
SCNetworkReachabilityCreateWithAddress (
CFAllocatorRef __nullable allocator,
const struct sockaddr *address
) API_AVAILABLE(macos(10.3), ios(2.0));
因为我们是判断互联网连接,并未传入域名,用这个函数即可。在Reachability里,判断一般互联网连接也是用的这个函数。
直接copy过来了,创建了一个struct sockaddr_in类型的zeroAddress
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
使用sockaddr_in,会报错,需要引入头文件#import <netinet/in.h>
SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault,(const struct sockaddr*) &zeroAddress);
第二个参数:SCNetworkReachabilityFlags类型的flags
看了下这个好弄,这个是个OPTION类型的,而且获取当前网络是否可达的函数SCNetworkReachabilityGetFlags里需要传入一个SCNetworkReachabilityFlags的地址,这个就好弄了,直接申明一个falgs,falgs取地址:
SCNetworkReachabilityFlags flags;