iOS如何检查WiFi辅助功能是否已启用

8

我想确认WiFi助手是否已启用。当我连接到我的接入点获取一些数据时,如果我的连接质量比较差,我的移动数据就会被使用,这会影响我的接入点。有没有办法检查这个选项是否已启用?


你想检查WiFi是否已启用,对吗? - Jitendra Modi
不,我想检查设置->蜂窝移动数据->Wi-Fi辅助功能选项是否已启用。 - Flipper
1个回答

3

好的,我认为我可以帮忙一点。你需要检查SCNetworkReachabilityFlags,我想,这将是特定标志的组合。我未能找到支持哪些标志的组合表示您正在使用WI-FI和蜂窝数据的文档,我也未能找到允许您直接检查该设置的文档。

根据以往经验,苹果可能没有一种直接检查该设置的方式。

所以...这里有一点代码可以让我们开始吗?

public enum InternetStatus {
   case notReachable
   case reachableViaWWAN
   case reachableViaWiFi
   case wifiAssist
}

您可以在自己选择的扩展中定义一个变量。(也许是URLSession?)

static public var internetStatus: InternetStatus {

    var zeroAddress = sockaddr_in()
    zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size)
    zeroAddress.sin_family = sa_family_t(AF_INET)

    guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
        $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
            SCNetworkReachabilityCreateWithAddress(nil, $0)
        }
    }) else {
        return .notReachable
    }

    var flags: SCNetworkReachabilityFlags = []

    if flags.contains(.connectionOnDemand) {
        print("Connection On Demand")
    }

    if flags.contains(.connectionAutomatic) {
        print("Connection Automatic")
    }

    if flags.contains(.connectionOnTraffic) {
        print("Connection On Traffic")
    }

    if flags.contains(.connectionRequired) {
        print("Connection Required")
    }

    if flags.contains(.interventionRequired) {
        print("Intervention Required")
    }

    if flags.contains(.isDirect) {
        print("isDirect")
    }

    if flags.contains(.isLocalAddress) {
        print("Local Address")
    }

    if flags.contains(.isWWAN) {
        print("WWAN")
    }

    if flags.contains(.reachable) {
        print("Reachable")
    }

    if flags.contains(.transientConnection) {
        print("Transient Connection")
    }


    if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {
        return .notReachable
    }

    if flags.contains(.reachable) == false {
        // The target host is not reachable.
        return .notReachable
    }
    else if flags.contains(.isWWAN) == true {
        // WWAN connections are OK if the calling application is using the CFNetwork APIs.
        return .reachableViaWWAN
    }
    else if flags.contains(.connectionRequired) == false {
        // If the target host is reachable and no connection is required then we'll assume that you're on Wi-Fi...
        return .reachableViaWiFi
    }else if flags.contains(.connectionRequired) && flags.contains(.isWWAN) {
        // Not sure here, maybe Wi-Fi assist is currently being utilized? Will need to test.
        return .wifiAssist
    }else if (flags.contains(.connectionOnDemand) == true || flags.contains(.connectionOnTraffic) == true) && flags.contains(.interventionRequired) == false {
        // The connection is on-demand (or on-traffic) if the calling application is using the CFSocketStream or higher APIs and no [user] intervention is needed
        return .reachableViaWiFi
    }
    else {
        return .notReachable
    }
}

关键在于在已知Wi-Fi助手处于活动状态的环境下进行调试并观察标志。或者比我更聪明,直接知道它们是什么。如果有人指出或者我找到正确的标志组合,我会更新这个答案。


谢谢Jon,这很有帮助。我的团队中有人能够使用这个作为指南来实现一些东西。我希望苹果能够提供一些官方的指导。与此同时,我们已经提交了Radar问题... - Nicholas Hart
1
@NicholasHart 很高兴听到这个消息!你介意发一下代码,修改我的帖子,或者把修改发送给我,这样我们就可以将其变成完整的答案? - Jon Vogel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接