`
jsntghf
  • 浏览: 2533276 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Reachability

    博客分类:
  • iOS
阅读更多

附件中的代码是在官方的Reachability 2.2版的基础上增加了以下几个方法:

 

+ (NSString *) stringFromAddress:(const struct sockaddr *)address{
	if (address && address->sa_family == AF_INET) {
		const struct sockaddr_in* sin = (struct sockaddr_in *)address;
		return [NSString stringWithFormat:@"%@:%d",[NSString stringWithUTF8String:inet_ntoa(sin->sin_addr)],ntohs(sin->sin_port)];
	}
	return nil;
}

+ (BOOL) addressFromString:(NSString *)IPAddress address:(struct sockaddr_in *)address{
	if (!IPAddress || [IPAddress length]) {
		return NO;
	}
	
	memset((char *)address,sizeof(struct sockaddr_in),0);
	address->sin_family = AF_INET;
	address->sin_len = sizeof(struct sockaddr_in);
	
	int conversionResult = inet_aton([IPAddress UTF8String],&address->sin_addr);
	if (conversionResult == 0) {
		NSAssert1(conversionResult != 1,@"Failed to convert the IP Address string into a sockaddr_in:%@",IPAddress);
		return NO;
	}
	return YES;
}

+ (NSString *) hostname{
	char baseHostName[256];
	int success = gethostname(baseHostName,255);
	if (success != 0 ) {
		return nil;
	}
	baseHostName[255] = '\0';
#if !TARGET_IPHONE_SIMULATOR
	return [NSString stringWithFormat:@"%s.local",baseHostName];
#else
	return [NSString stringWithFormat:@"%s",baseHostName];
#endif
}

+ (NSString *) getIPAddressForHost:(NSString *)theHost{
	struct hostent *host = gethostbyname([theHost UTF8String]);
	if (!host) {
		herror("resolv");
		return NULL;
	}
	struct in_addr **list = (struct in_addr **)host->h_addr_list;
	return [NSString stringWithCString:inet_ntoa(*list[0]) encoding:NSUTF8StringEncoding];
}

+ (NSString *) localIPAddress{
	struct hostent *host = gethostbyname([[self hostname] UTF8String]);
	if (!host) {
		herror("resolv");
		return nil;
	}
	
	struct in_addr **list = (struct in_addr **)host->h_addr_list;
	return [NSString stringWithCString:inet_ntoa(*list[0]) encoding:NSUTF8StringEncoding];
}

+ (NSString *) localWiFiIPAddress{
	BOOL success;
	struct ifaddrs * addrs;
	const struct ifaddrs * cursor;
	success = getifaddrs(&addrs) == 0;
	if (success) {
		cursor = addrs;
		while (cursor != NULL) {
			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"]){
					return [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)];
				}
			}
			cursor = cursor->ifa_next;
		}
		freeifaddrs(addrs);
	}
	return nil;
}

+ (BOOL) hostAvailable:(NSString *)theHost{
	NSString *addressString = [self getIPAddressForHost:theHost];
	if (!addressString) {
		printf("Error recovering IP address from host name\n");
		return NO;
	}
	struct sockaddr_in address;
	BOOL gotAddress = [self addressFromString:addressString address:&address];
	
	if (!gotAddress) {
		printf("Error recovering sockaddr address from %s\n",[addressString UTF8String]);
		return NO;
	}
	
	SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&address);
	SCNetworkReachabilityFlags flags;
	BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
	CFRelease(defaultRouteReachability);
	if (!didRetrieveFlags) {
		printf("Error Could not recover network reachablility flags\n");
		return NO;
	}
	
	BOOL isReachable = flags & kSCNetworkFlagsReachable;
	return isReachable ? YES:NO;
}

 

分享到:
评论

相关推荐

    ios Reachability

    Reachability是苹果官方提供的一款用于检测iOS设备网络状态的示例代码库,它极大地简化了开发者在应用中检查网络连通性的过程。这个DEMO包含了详细的实现方式和使用示例,帮助开发者理解如何在自己的应用中集成网络...

    Reachability 网络判断库文件

    Reachability 是一个在iOS和macOS开发中广泛使用的开源库,由Tony Million 创建,用于检测设备的网络连通状态和网络类型。这个库基于Apple的SystemConfiguration框架,它提供了简单易用的接口来帮助开发者判断应用...

    Reachability使用说明<转载>

    Reachability是iOS开发中一个非常重要的工具,它用于检测设备的网络可达性,例如Wi-Fi、蜂窝数据等网络状态的变化。这个工具是由斯坦福大学的Scotty Loveless开发的,并且在iOS开发者社区中广泛使用。这篇博客文章...

    Reachability 网络状态的使用和封装,更加方便使用

    Reachability 是 iOS 开发中一个重要的工具类,用于检测设备的网络状态,包括无网络、WiFi、蜂窝数据等。这个工具最初由 Tony Million 设计并实现,现在已经被广泛使用在许多 iOS 应用中。在本文中,我们将深入探讨 ...

    iOS中使用 Reachability 检测网络

    Reachability是Apple提供的一款工具,用于检测设备的网络可达性,即是否可以连接到互联网。这篇博客文章将深入探讨如何在iOS项目中使用Reachability来监控网络状态,并提供相关的源码分析。 一、 Reachability简介 ...

    Reachability网络状态

    Reachability是iOS开发中用于检测网络连接状态的一个重要工具,由Tony Million开发并维护,它提供了简单的方法来判断设备当前的网络连通性。在iOS 11及更高版本中,由于苹果对用户隐私的加强保护,不再推荐使用Key-...

    swift-Reachability.swift使用Swift写的第三方网络检测类

    Reachability.swift 是一款由Ashley Mills开发的著名第三方库,专为Swift编程语言设计,用于检测iOS、macOS、tvOS以及watchOS等Apple平台上的网络可达性。这个库简化了开发者判断当前设备网络状态的过程,包括是否...

    Reachability.zip

    Reachability是iOS开发中一个非常重要的概念,它用于检测设备的网络可达性,即设备是否能够连接到互联网以及通过何种方式连接。这个功能在开发任何需要网络通信的应用时都至关重要,因为它可以帮助应用根据网络状态...

    swift-Reach一个现代Reachability网络库

    **Swift-Reach:现代Reachability网络库详解** Swift-Reach 是一个专为Swift编程语言设计的现代化网络可达性库,它的主要目标是帮助开发者轻松地检测iOS、macOS、tvOS或watchOS应用的网络状态。这个库是基于Apple的...

    iOS_Reachability

    Reachability 是 iOS 开发中一个重要的知识点,用于检测设备当前的网络状态,包括是否连接到互联网,以及连接的类型(例如蜂窝数据还是 Wi-Fi)。这个例子是苹果官方提供的,对于开发者来说,是一个非常有价值的参考...

    Reachability.swift:使用 Swift 闭包实现的网络状态检查库,可以取代 Apple 的 Reachability 库.zip

    Reachability.swift:使用 Swift 闭包实现的网络状态检查库,可以取代 Apple 的 Reachability 库.zip,Replacement for Apple's Reachability re-written in Swift with closures

    IOS ReachAbility

    IOS 网络编程 ReachAbility头文件和源文件,用于判定网络的连接情况

    iOS 网络检查 Reachability

    Reachability是Apple提供的一个库,用于检测设备当前的网络可达性,包括Wi-Fi、蜂窝数据以及互联网是否可达。这个库可以帮助开发者及时响应网络状态的变化,比如在网络断开时提示用户或者暂停网络依赖的操作。 首先...

Global site tag (gtag.js) - Google Analytics