在iOS 12中無法獲取WiFi的SSID了?別慌!

QiShare發表於2018-09-19

級別: ★☆☆☆☆
標籤:「iOS 12」「SSID」「Access WiFi Information」「CNCopyCurrentNetworkInfo」
作者: Xs·H
審校: QiShare團隊

Apple於北京時間9月17日晚在官網釋出了Xcode 10正式版,QiShare團隊成員於9月18日中午統一升級以對現有專案做適配。期間,作者發現某專案使用Xcode 10編譯出的App在iOS 12中無法獲取WiFi的SSID。

敲黑板:獲取WiFi的SSID是智慧硬體App中配網模組的常用功能,各大廠商要針對iOS 12適配一波了(@huawei.com; @mi.com; @360.com; @jd.com; @baidu.com; @orvibo.com; @scinan.com; ...)。

獲取WiFi的SSID的方法如下:

+ (NSString *)wifiSSID {
    
    NSString *ssid = nil;
    NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
    for (NSString *ifnam in ifs) {
        NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
        if (info[@"SSID"]) {
            ssid = info[@"SSID"];
        }
    }
    return ssid;
}
複製程式碼

在iOS 12中,經斷點除錯發現info為nil。猜測是CNCopyCurrentNetworkInfo方法在iOS 12中有了變化。通過檢視官方文件,發現文件中增加了Important字樣的描述:

CNCopyCurrentNetworkInfo文件

Important To use this function in iOS 12 and later, enable the Access WiFi Information capability for your app in Xcode. When you enable this capability, Xcode automatically adds the Access WiFi Information entitlement to your entitlements file and App ID.
重要描述 在iOS 12+中使用此方法需要在Xcode中為應用授權獲取WiFi資訊的能力。授權後,Xcode會自動在App ID和應用的許可權列表中增加獲取WiFi資訊的許可權。

看到這裡,解決方案就有了:Xcode -> [Project Name] -> Targets -> [Target Name] -> Capabilities -> Access WiFi Information -> ON

解決方案步驟圖示
按照上述方案操作完畢後,會發現工程的.entitlements檔案中多了一對Key-Value

.entitlements檔案
至此,就能在iOS 12+中正常獲取到WiFi的SSID了。

關注我們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公眾號)

推薦文章:
iOS 記憶體洩漏排查方法及原因分析
Web安全漏洞之CSRF

相關文章