2012-10-16 66 views
4

在iOS框架内,如何检查Wifi收音机是否由用户启用?请注意,我对通过Wifi的可达性没有兴趣,但是如果用户关闭了设备。谢谢。iPhone Wifi开启还是关闭?

+0

你用户特别的意思吗? – Ravi

+0

请参阅:http://stackoverflow.com/questions/1448411/how-to-check-for-local-wi-fi-not-just-cellular-connection-using-iphone-sdk – magma

+1

Ravi和Magma,我有一个应用程序,并且我需要在代码中检查用户是否关闭了Wifi设备,或者它是否保留。纠正我,如果我错了,但从我的理解可达性给出的信息,你是否可以通过Wifi接口上网,而不是关于其开/关状态。 – x89a10

回答

5

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

+1

这是不幸的是,谢谢。 – x89a10

3

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

您无法访问应用程序中直接进入App Store的直接设置。 这被认为是应用程序根本没有理由处理的私人用户区域。

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

这不是应用程序应该感兴趣或担心的事情。您有网络访问权限,或者您没有网络访问权限。如果没有可用的,那么它的原因并不重要。

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

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

如果您出于某种原因想要关闭收音机,并且它适用于某种企业应用程序,那么您可以查看私有框架,导入它们并处理其未记录的方法随任何更新而改变。

支持WiFi应该是:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/PrivateFrameworks/MobileWiFi.framework

+0

当你说“没有理由...在所有...”时,请小心,你的应用可能要有礼貌,只有在无线上传时才上传分析信息,并且不会占用用户的配额(并非世界上每个人都有无限的计划)。您可能不希望通过单元网络下载500 MB的可选游戏数据,或者像Apple的AppStore应用程序,拒绝通过单元连接以特定大小下载应用程序。 – prewett

+2

另一种您可能关心WiFi开启或关闭(并且与外部实体无关)的情况是在多点对等连接环境中,其中打开WiFi开启是可选的,但可以显着改善用户体验。 –

+1

想知道WiFi是否开启或关闭的另一个原因是您正在监控地理区域。无线网络打开时,进入/退出事件更加及时和准确。在小区域没有wifi的情况下,该区域可能完全错过,并且不会产生任何事件。在Wifi关闭的情况下,您可以选择直接使用GPS来检测该区域。 – BitByteDog

1

PrivateFrameworks不提供SDK也不是提供给任何企业开发。

如果我们知道你想要达到我对无线电广播功率状态的认识,我们可能会提出一种替代解决方案,但是从苹果如何与他们向开发者公开的内容看,我不认为这直接成为可能。

使用可达性,你可以确定知道wifi是否打开,但知道wifi是否关闭抛硬币。

8

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

无线状态可以被确定使用基于C的结构ifaddress从为ON/OFF:

ifaddrs.h,和

净/ if.h中

[编号原始码:unknown。]

- (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; 
} 

斯威夫特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

这个工作!它基于以下网站的出色分析:http://www.enigmaticape.com/blog/determine-wifi-enabled-ios-one-weird-trick – mbeaty

+6

注意:在我的iPhone 4s(iOS 8.3)上,这不幸总是返回NO - 不管Wi-Fi的状态如何。 – Leverin

+0

记得在完成它们时在接口上调用freeifaddrs。 – aust

3

的iOS没有公开的API,它告诉你,如果Wi-Fi开启或关闭。

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

另请注意,此API在模拟器中不起作用,因为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; 
    } 
} 
1

雨燕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 
} 

雨燕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 
}