Wifi 定位原理及 iOS Wifi 列表獲取


Wifi 定位原理及 iOS Wifi 列表獲取

  對於大家來說,Wifi 應該是一個很熟悉的詞了,我們每天都可能在使用 Wifi 熱點。Wifi 除了能給我們提供熱點之外同時還有定位的作用, 現在移動設備的對用戶的隱私保護是越來越嚴格了,就如定位功能,必須要經過設備用戶的授權才能使用 Location 給這台設備定位。這些嚴格的隱私政策對用戶起到到保護作用,但對開發人員卻是一種阻礙,在產品強需求的情況下用戶是會授權的,如地圖類應用,但是另外一些沒有對定位強需求的產品,用戶可能就不會給你授權了,這是我們可以考慮下 Wifi 定位了。

Wifi 定位原理

  當我們使用手機掃面 Wifi 的時候,其實就可以定位到這台手機的位置信息了。每個 Wifi 路由開啟后,都會不停的往四周發射信號,我們把 Wifi 路由想象成太陽以某種頻度不停的往周圍發射電磁波,電磁波會因距離的削弱,同時也會因為物體阻擋而削弱。例子就是我們在離 Wifi 路由器同樣遠的位置,有些地方信號強度高有些地方信號強度低。路由同時也叫 Wifi 熱點(或者 Wifi AP:Access Point)。每一個 Wifi 路由器都會有一個 BSSID,很多人都管這個 BSSID 叫 MAC 地址(其實 BSSID 並不是 MAC 地址),BSSID 設定了一般就不會在變也不會重復,也就意味着是全球唯一的,這是路由制造的規則,既然有規則那么就會有不遵守規則的人,文章結尾會介紹不遵守規則的人是如何害人害己的。

  剛才提到的 BSSID,在 Wifi 路由器的發射中是可以檢測到的,同時 Wifi 路由信號還伴隨着,SSID(路由器的名稱:如XX的Wifi)、signalStrength(手機接收到Wifi的信號強度)及其它信息。看到這里你應該知道如何使用Wifi定位的了,條件:唯一不變的BSSID 和 手機到路由器的信號強度。思路:Wifi 信號是有范圍的,我們假設這個范圍就是10米為半徑的一個圓(實際情況根據Wifi路由廠商和路由器周圍環境而定),我們去采集一些Wifi熱點回來,某家水果店的 Wifi、某家餐館的 Wifi 等等,我們自己去采集的我們肯定知道他們的具體位置,及剛才提到的 Wifi 中的信息:BSSID、SSID、signalStrength,再把他們存入數據庫,采集的人可以很多:專業采集人員、出租車司機、快遞員等等,他們經常穿梭於大街小巷,其實我們每個人都是Wifi數據庫的采集人員,我們的手機廠商每天都在默默的采集着我們的位置信息,iPhone手機系統設置里就可以看到你今天去哪了,你的Wifi連接過哪些設備也是知道的。時間越久Wifi數據庫信息越豐富,最終會發現每個BSSID會對應多個SSID和signalStrength,因為SSID是可以修改的,signalStrength是由於在這個Wifi熱點的周圍不同位置采集的,所以信號強度也不同。采集的信號強度越多,給BSSID也就是這個Wifi熱點的定位就越精准。

  現在如果我去一個陌生的地方,我打開手機掃描周圍的 Wifi 剛好掃描到了一個或幾個,我把這個 Wifi 信息(BSSID)傳給服務器,服務器通過這個 BSSID 去數據庫查找,就能直接匹配到對應的位置,返回給我。如果匹配不到則表示這里沒人來采集過 Wifi 信息,或者是這個 Wifi 熱點是最近布置的,采集人員還沒來得及采集。服務器可以把這些未采集到的先分類后期統一規划。

  Wifi 定位整體功能是需要服務端來配合的,也就表示必須要有網絡環境才行。其實移動端(手機、Pad等)也可以獨立完成,不過對技術和設備硬件要求會高很多,全球的 Wifi 熱點是一個很龐大的數據量,需要經過高精度的無損壓縮后放在內存很大的手機里才行,或許多年以后可以實現吧(即使技術上能實現了,對於產品和研發來說收益、風險、和工作量又是一場PK)

iOS 申請獲取 Wifi 列表權限

  知道了原理有啥用呢,能實現么?好吧現在就遇到問題了,移動設備如今主要是 Andorid 和 iOS, Android 上可以直接掃描 Wifi 列表獲取相關信息,自己去網上找找, 所以說會原理不一定會技術實現,我也就只能講講 iOS 的技術實現了。 
  iOS 上獲取 Wifi 列表其實也有很大限制,在 iOS 9 以前是不能獲取Wifi列表的,只能獲取當前連接的 Wifi 信息,也就表示只有連接了 Wifi 才能定位,剛才文章說到的場景是,我在一個陌生的原理,拿出手機掃描 Wifi ,也就是我並沒連接那里的 Wifi(我不知道密碼我怎么連啊)。Apple 在 iOS 9 以后,提供了獲取Wifi列表的API,但是獲取Wifi列表是有門檻的,主要步驟有:

  • 1、向 Apple 申請開發 Network Extension 權限
  • 2、申請包含 Network Extension 的描述文件
  • 3、配置 Info.plist
  • 4、配置 entitlements
  • 5、iOS 獲取 Wifi 列表代碼實現
  • 6、獲取Wifi列表回調

1、向 Apple 申請開發 Network Extension 權限

  首先要先寫封郵件給 networkextension@apple.com ,問蘋果要開發 Network Extension 的權限。 
蘋果收到郵件后會自動回復郵件,在 https://developer.apple.com/contact/network-extension/ 里面填寫申請表格,內容包括:

Organization:               

Company / Product URL:             

What's your product's target market? What's your company's primary function? Describe your application and how it will use the Network Extension framework. What type of entitlement are you requesting? 。。。 

申請后大概兩周左右能收到 Aplle的 確認信,如:

Hi, 

Thanks for your interest in the Network Extension APIs. We added a new template containing the Network Extension entitlements to your team. 。。。。 

2、申請包含 Network Extension 的描述文件

選擇包含 Network Extension 的描述文件,后點擊下載,下載完成雙擊描述文件。

3、配置 Info.plist

Xcode Info.plist 里 Required background modes 添加 一個 network-authentication(item)

4、配置 entitlements

Demo.entitlements(Demo是項目名稱) 里添加 Key-Value: com.apple.developer.networking.HotspotHelper -> YES

5、iOS 獲取 Wifi 列表代碼實現

導入頭文件

#import <NetworkExtension/NetworkExtension.h> 

代碼實現

- (void)getWifiList { if (![[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {return;} dispatch_queue_t queue = dispatch_queue_create("com.leopardpan.HotspotHelper", 0); [NEHotspotHelper registerWithOptions:nil queue:queue handler: ^(NEHotspotHelperCommand * cmd) { if(cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) { for (NEHotspotNetwork* network in cmd.networkList) { NSLog(@"network.SSID = %@",network.SSID); } } }]; } 

kNEHotspotHelperCommandTypeFilterScanList: 表示掃描到 Wifi 列表信息。

NEHotspotNetwork 里有如下信息:

  • SSID:Wifi 名稱
  • BSSID:站點的 MAC 地址
  • signalStrength: Wifi信號強度,該值在0.0-1.0之間
  • secure:網絡是否安全 (不需要密碼的 Wifi,該值為 false)
  • autoJoined: 設備是否自動連接該 Wifi,目前測試自動連接以前連過的 Wifi 的也為 false 。
  • justJoined:網絡是否剛剛加入
  • chosenHelper:HotspotHelper是否為網絡的所選助手

官方文檔連接

6、獲取Wifi列表回調

當你把上面的代碼寫完,並成功運行項目后,發現並沒有Wifi列表的回調。因為你還沒刷新Wifi列表,你需要:

  • 打開手機系統設置 -> WLAN -> 系統 Wifi 列表加載出來時,上面代碼部分才會回調,才能獲取到 Wifi 列表。

這個時候你就能看到控制台源源不斷的Log。

注意事項

  • 1、獲取Wifi列表功能由於是需要申請后台權限,所以能后台激活App(應用程序),而且激活后App的進程能存活幾個小時。
  • 2、整個獲取Wifi列表不需要App用戶授權,也就是在App用戶無感知下獲取設備的Wifi列表信息,使用時請正當使用。
  • 3、Wifi列表獲取 NetworkExtension 是 iOS 9以后才出的,目前 iOS 9 已經覆蓋很廣了。

下面付一張來自 TalkingData 對iOS操作系統的統計報表,時間:2017-01-03

 

參考資源:NEHotspotHelper NetworkExtension API iOS9.0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM