2016-12-16 7 views
5

Я пытаюсь проверить, включена ли поддержка WiFi. У меня возникла проблема, когда я подключен к точке доступа, чтобы получить некоторые данные, и когда у меня плохое соединение, я использую данные сотовой связи и перебирается с моей точкой доступа. Есть ли способ проверить, включен ли этот параметр?iOS Проверьте, включена ли поддержка WiFi

+0

Вы хотите проверить, есть разрешение Wi-Fi или нет? –

+0

Нет, я хочу проверить, включена ли опция в Настройках -> Сотовая -> Поддержка WiFi Assist – Flipper

ответ

2

Хорошо, я думаю, что могу немного помочь. Вам нужно check SCNetworkReachabilityFlags, для чего я думаю, была бы конкретная комбинация флагов. Мне не удалось найти документацию, которая поддерживает, какая комбинация флагов указывает на то, что вы используете WI-FI и Cellular, я также не смог найти документацию, которая позволяет вам напрямую проверить эту настройку.

Основываясь на предыдущем опыте, Apple, вероятно, не имеет возможности проверить эту настройку напрямую.

Итак ... Вот немного кода, чтобы мы начали?

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 помощь является активным и соблюдать флаги. Или будь умнее меня и просто знаешь, кто они. Я уточню этот ответ, если кто-то отметит, или я выясню правильную комбинацию флагов.

+0

Спасибо, Jon, это было полезно. Кто-то из моей команды смог получить что-то, используя это как руководство. Надеюсь, Apple предоставит некоторые официальные рекомендации по этому вопросу. В то же время, вопрос о радаре ... –

+0

@NicholasHart Рад слышать! Позаботьтесь о публикации кода, отредактируйте мое сообщение или отправьте мне изменения, чтобы мы могли сделать это полным ответом? –