iPhone Wifi开启还是关闭?

时间:2012-10-16 01:04:32

标签: iphone ios wifi

在iOS框架中,如何检查用户是否启用了Wifi无线电?请注意,我对通过Wifi的可达性不感兴趣,而是用户关闭了设备。谢谢。

6 个答案:

答案 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是否关闭投掷硬币。