扩展UIDevice来监测网络连接
#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 addressif (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 adapterreturn [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
?