在iOS框架中,如何检查用户是否启用了Wifi无线电?请注意,我对通过Wifi的可达性不感兴趣,而是用户关闭了设备。谢谢。
答案 0 :(得分:8)
基于:http://www.enigmaticape.com/blog/determine-wifi-enabled-ios-one-weird-trick
使用基于C的ifaddress struct来确定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")
}
答案 1 :(得分:5)
如@magma的评论中所述,您可能必须使用Reachability源代码。 到目前为止,根据我的经验和其他人一直在谈论的内容,没有布尔值可以告诉您用户是否在“设置”中关闭了Wi-Fi。通过检查设备是否可以访问互联网,您只需推断并推断(假设)用户已关闭Wi-Fi。
答案 2 :(得分:4)
使用可达性是正确的方法。
您无法访问App Store中应该存在的应用程序中的直接设置。 这被认为是应用程序根本无法处理的私人用户区域。
但是如果没有更多解释,我真的不需要找出设置。
这不是应用程序应该感兴趣或担心的。您具有网络访问权限,或者您没有网络访问权限。如果没有,那么它的原因无关紧要。
你不会问一个像#34;你没有福特的问题吗?&#34; &#34;你没有宝马吗?&#34;。而不是一个好的应用程序设计,你会问&#34;你有车吗?&#34;
Raechability也与互联网无关。它通过TCP / IP网络告诉您设备是否在理论上可达。这意味着可以进行一些网络通信。然后你可以检查什么类型(例如Wifi与3G / LTE)。而这正是“可达性”的用途。
如果您打开无线电并且它是一种企业应用程序,那么你真的想要失败的原因是什么?你可以查看私有框架,导入它们并处理它们的未记录方法。随着任何更新而改变。
对于Wifi,它应该是:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/PrivateFrameworks/MobileWiFi.framework
答案 3 :(得分:4)
iOS没有公开的API可以告诉您Wi-Fi是打开还是关闭。
但是,您可以使用SystemConfiguration框架中提供的公共API CNCopyCurrentNetworkInfo()
来获取有关当前Wi-Fi网络的信息。这不会不告诉您Wi-Fi是打开还是关闭,而是设备是否加入Wi-Fi网络。也许这足以满足您的目的。
另请注意,此API在Simulator中不起作用,因为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;
}
}
答案 4 :(得分:3)
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
}
Swift 4.0版
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))
}
var counts:[String:Int] = [:]
for item in addresses {
counts[item] = (counts[item] ?? 0) + 1
}
freeifaddrs(ifaddr)
guard let count = counts["awdl0"] else { return false }
return count > 1
}
答案 5 :(得分:1)
私有框架在sdk中不可用,任何企业开发人员都无法使用。
如果我们知道你想要实现什么,我知道wifi无线电功率状态,我们可以建议一个替代解决方案,但从苹果如何与他们向开发人员揭露的东西,我不认为这直接成为可能。
使用可达性,你可以确定wifi是否开启,但要知道wifi是否关闭投掷硬币。