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

來源:互聯網
上載者:User

標籤:回調   template   步驟   控制   ice   sts   hotspot   join   進程   

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 許可權

  首先要先寫封郵件給 [email protected] ,問蘋果要開發 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

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.