2012-10-16 99 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 
}