2016-12-16 60 views
5

我試圖檢查WiFi協助是否啓用。當我連接到接入點以獲取某些數據時,出現問題,而當我連接不良時,我的蜂窩數據會被使用,並會干擾我的接入點。有沒有辦法檢查這個選項是否被啓用?iOS檢查WiFi協助是否啓用

+0

你想檢查wifi已啓用或不正確? –

+0

不,我想檢查設置 - >蜂窩 - > WiFi協助是否啓用 – Flipper

回答

2

好吧,我想我可以幫助一點。您需要check SCNetworkReachabilityFlags,因爲我認爲這將是標誌的特定組合。我沒有找到支持多種標誌組合的文檔,說明您正在使用WI-FI和Cellular,我也沒有找到允許您直接檢查該設置的文檔。

基於以前的經驗蘋果可能沒有辦法直接檢查該設置。

所以...這是一個讓我們開始的小代碼?

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

感謝喬恩,這是有幫助的。我的團隊中有人能夠以此爲指導,開展工作。我希望蘋果對此提供一些官方指導。在此期間,雷達問題提交... –

+0

@NicholasHart很高興聽到!注意發佈代碼,編輯我的帖子,或發送給我編輯,以便我們可以完成這個完整的答案? –