iPhone无线开启或closures?

在iOS框架内,如何检查Wifi收音机是否被用户启用? 请注意,我不关心通过Wifi的可达性,而是如果用户closures设备。 谢谢。

正如@magma在评论中提到的那样,您可能必须使用Reachability源代码。 到目前为止,根据我的经验和其他人的谈话,有没有布尔可以告诉你,如果用户已closures设置中的Wi-Fi。 通过检查设备是否可以访问互联网,您只需要推断并断定(假设)用户已closuresWi-Fi。

根据: http : //www.enigmaticape.com/blog/determine-wifi-enabled-ios-one-weird-trick

可以使用基于C的ifaddress结构从以下位置确定Wifi状态为ON / OFF:

ifaddrs.h和

净/ if.h中

[代码来源:未知。]

- (BOOL) isWiFiEnabled { NSCountedSet * cset = [NSCountedSet new]; struct ifaddrs *interfaces; if( ! getifaddrs(&interfaces) ) { for( struct ifaddrs *interface = interfaces; interface; interface = interface->ifa_next) { if ( (interface->ifa_flags & IFF_UP) == IFF_UP ) { [cset addObject:[NSString stringWithUTF8String:interface->ifa_name]]; } } } return [cset countForObject:@"awdl0"] > 1 ? YES : NO; } 

Swift 3版本(需要#include <ifaddrs.h>桥接头):

 func isWifiEnabled() -> Bool { var addresses = [String]() var ifaddr : UnsafeMutablePointer<ifaddrs>? guard getifaddrs(&ifaddr) == 0 else { return false } guard let firstAddr = ifaddr else { return false } for ptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) { addresses.append(String(cString: ptr.pointee.ifa_name)) } freeifaddrs(ifaddr) return addresses.contains("awdl0") } 

使用可达性是正确的方法。

您不能在应用程序中访问App Store中的直接设置。 这被认为是一个应用程序没有理由处理的私人用户领土。

但没有更多的解释,我真的不觉得需要找出设置。

这是应用程序永远不会感兴趣或担心的。 您有networking访问权限,或者您没有networking访问权限。 如果没有可用,那么它的原因并不重要。

你不要问“你没有福特?”这个问题 “你没有宝马?” 而是从一个好的应用程序devise中,你问“你有车吗?”

另外可选性与互联网无关。 它告诉你设备是否可以通过TCP / IPnetworking理论上可达。 这意味着一些networking通信是可用的。 然后你可以检查什么types(例如Wifi与3G / LTE)。 而这正是达到的目的。

如果您为了某种原因真的想要closures收音机,并且这是一种企业应用程序,您可以查看私有框架,导入它们并处理可能随时更改的未logging方法更新。

对于Wifi,它应该是: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/PrivateFrameworks/MobileWiFi.framework

iOS没有公开的API,告诉你Wi-Fi是打开还是closures。

但是,您可以使用SystemConfiguration框架中提供的公共API CNCopyCurrentNetworkInfo()获取有关当前Wi-Finetworking的信息。 这不会告诉你,如果Wi-Fi是打开或closures,而不是如果设备join到Wi-Finetworking。 也许这对你的目的已经足够了。

还要注意,这个API在Simulator中CNCopySupportedInterfaces() ,因为CNCopySupportedInterfaces()总是返回NULL。

 #include <SystemConfiguration/CaptiveNetwork.h> BOOL hasWiFiNetwork = NO; NSArray *interfaces = CFBridgingRelease(CNCopySupportedInterfaces()); for (NSString *interface in interfaces) { NSDictionary *networkInfo = CFBridgingRelease(CNCopyCurrentNetworkInfo((__bridge CFStringRef)(interface))); if (networkInfo != NULL) { hasWiFiNetwork = YES; break; } } 

PrivateFrameworks在sdk中不可用,也不适用于任何企业开发人员。

如果我们知道你想达到什么样的效果,我们可以提出一个替代解决scheme,但是从苹果公司如何与开发者接触,我并不认为这是可能的。

使用可达性,你可以肯定地知道如果wifi是开的,但知道如果wificlosures抛硬币。

Swift 2.3版本

 func isWifiEnabled() -> Bool { var addresses = [String]() var ifaddr : UnsafeMutablePointer<ifaddrs> = nil guard getifaddrs(&ifaddr) == 0 else { return false } var ptr = ifaddr while ptr != nil { defer { ptr = ptr.memory.ifa_next } addresses.append(String.fromCString(ptr.memory.ifa_name)!) } var counts:[String:Int] = [:] for item in addresses { counts[item] = (counts[item] ?? 0) + 1 } freeifaddrs(ifaddr) return counts["awdl0"] > 1 ? true : false }