扩充UIDevice来监测网络连接
扩展UIDevice来监测网络连接
《The iPhone Developer's Cookbook》
没什么好说的,直接上代码:
1、UIDevice+Reachability.h:
#import <UIKit/UIKit.h> @interface UIDevice (Reachability) + (BOOL) networkAvailable; + (BOOL) activeWLAN; + (BOOL) activeWWAN; @end
2、UIDevice+Reachability.m:
#import <SystemConfiguration/SystemConfiguration.h> #include <arpa/inet.h> #include <netdb.h> #include <net/if.h> #include <ifaddrs.h> #import "UIDevice-Reachability.h" @implementation UIDevice (Reachability) SCNetworkConnectionFlags connectionFlags; + (NSString *) localWiFiIPAddress { BOOL success; struct ifaddrs * addrs; const struct ifaddrs * cursor; success = getifaddrs(&addrs) == 0; if (success) { cursor = addrs; while (cursor != NULL) { // the second test keeps from picking up the loopback address if (cursor->ifa_addr->sa_family == AF_INET && (cursor->ifa_flags & IFF_LOOPBACK) == 0) { NSString *name = [NSString stringWithUTF8String:cursor->ifa_name]; if ([name isEqualToString:@"en0"]) // Wi-Fi adapter return [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)]; } cursor = cursor->ifa_next; } freeifaddrs(addrs); } return nil; } #pragma mark Checking Connections + (void) pingReachabilityInternal { BOOL ignoresAdHocWiFi = NO; struct sockaddr_in ipAddress; bzero(&ipAddress, sizeof(ipAddress)); ipAddress.sin_len = sizeof(ipAddress); ipAddress.sin_family = AF_INET; ipAddress.sin_addr.s_addr = htonl(ignoresAdHocWiFi ? INADDR_ANY : IN_LINKLOCALNETNUM); // Recover reachability flags SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (struct sockaddr *)&ipAddress); BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &connectionFlags); CFRelease(defaultRouteReachability); if (!didRetrieveFlags) printf("Error. Could not recover network reachability flags\n"); } + (BOOL) networkAvailable { [self pingReachabilityInternal]; BOOL isReachable = ((connectionFlags & kSCNetworkFlagsReachable) != 0); BOOL needsConnection = ((connectionFlags & kSCNetworkFlagsConnectionRequired) != 0); return (isReachable && !needsConnection) ? YES : NO; } + (BOOL) activeWWAN { if (![self networkAvailable]) return NO; return ((connectionFlags & kSCNetworkReachabilityFlagsIsWWAN) != 0); } + (BOOL) activeWLAN { return ([UIDevice localWiFiIPAddress] != nil); } @end