天天看點

[譯]iOS 開發中使用 Swift 進行 iBeacons 互動指南

<b>本文講的是[譯]iOS 開發中使用 Swift 進行 iBeacons 互動指南,</b>

<b></b>

#iOS 開發中使用 Swift 進行 iBeacons 互動指南

##iBeacons 是什麼

iBeacons 是一類使用 iBeacon 協定持續向周圍發送自身辨別資訊的低功耗藍牙裝置。它們總是被放置在實體世界中(通常為室内)人們感興趣的一些地方。當裝置移動到一定範圍内時,手機應用會收到推送并作出相應的響應。

你也許讀過一些文章聲稱 iBeacons 是一種室内 GPS 信号不穩定時,取代 GPS 進行室内定位的解決方案。雖然這個的說法絕大部分是正确的,但是不能肯定的認為 iBeacons 是一個 GPS 完美的替代方案。他們在操作的模型和位置感覺的準确性上比起傳統的 GPS 有着相當大的差別。即便如此,帶着一點創造性,你依然可以使用 iBeacons 做一些相當酷的事情。

在我們了解 iBeacons 如何工作之前,讨論一下它的使用方法也許有些必要。現在有多種多樣的 iBeacons 應用,我喜歡把他們分成兩大類:1. 推送感覺場景的資訊 2.定位追蹤。

當使用者移動到他們感興趣的區域時,iBeacons 可以用來給他們推送資訊。博物館就是一個典型的例子,設想在每一個展品的位置放置一個 iBeacons 裝置,當使用者走近展品的時候,手機應用自動展示看到展品的更多資訊會有多棒! 這就需要手機應用偵聽發射器來了解有哪些發射器接近哪些展品,通過這樣的比對,發射器将定位使用者在博物館中的位置并讓應用做出合理的響應。

作為推送感覺場景的資訊概念的擴充,你也可以使用 iBeacons 作為一種追蹤使用者的方式。設想在一個博物館或者雜貨店的建築中遍布 iBeacons ,随着使用者的移動,由他們通過發射器的順序,你可以偵測出他們的移動軌迹。這允許你追蹤使用者的行蹤,并且總結出最普遍的行進路線和行進模式。

如果你過去開發過低功耗藍牙裝置,你也許熟悉藍牙廣播包的概念。iBeacons 本質上隻是一個發送廣播包的低功耗藍牙裝置。當廣播包廣播出去,其廣播包中包含三個值:一個 UUID、一個 主要值和一個次要值。這三個數字組合起來定義一個 iBeacon 裝置的唯一辨別并且它是可以由使用者進行配置的。

将 UUID 連同主要值以及次要值組合起來是一個很好地尋址方案。設想如果像沃爾瑪這樣的零售商在所有的商店裡配置 iBeacons 裝置,他們或許選擇一個唯一的 UUID 來指代沃爾瑪并且沃爾瑪中的所有 iBeacons 都會使用這個 UUID(這使得 UUID 變得不再特殊,但是好像這是 iBeacons 中很常見的尋址方式).之後他們可以使用 iBeacons 的主要值來指代商店的編号和次要值去差別商店所在的不同的部門或區域。

iBeacons 的命名是因為蘋果定義的 iBeacons 協定(比如廣播出去的那些廣播資料的形式),但是,他們并不是蘋果生産或出售的。

下邊是一些關于 Estimote 和 Radius Networks 兩家生産商 iBeacons 的圖檔。

[譯]iOS 開發中使用 Swift 進行 iBeacons 互動指南

Estimote iBeacons

[譯]iOS 開發中使用 Swift 進行 iBeacons 互動指南

Radius Networks iBeacons.可拆卸式頂部能讓你更簡單地更換電池。

Radius Networks 的裝置很好用因為你可以随意的打開和關閉并且可以友善地更換電池。 Estimote 的裝置的電池使用壽命更久,但是當電量用完之後更換起來很麻煩,而且想關閉一個正在廣播中的 Estimote 裝置可不那麼簡單。

###可配置性

當你購買了 iBeacons ,制造商通常會提供一個手機應用來幫助你對它進行相關的設定。你可以在應用中對 iBeacons 的 UUID 以及主要值和次要值進行設定,調整他們廣播的速率和藍牙廣播的強度。一些裝置上并不提供手機應用或者其他便捷的方式來配置他們生産的 iBeacons 。 如果沒有什麼特别的理由,我推薦你不要購買這些廠商的 iBeacons 。

下邊是 Estimote 和 Radius Networks 兩個廠商的 iBeacons 配置應用中的一些截圖。

[譯]iOS 開發中使用 Swift 進行 iBeacons 互動指南
[譯]iOS 開發中使用 Swift 進行 iBeacons 互動指南

在 Estimote 廠商的應用中,你可以在截圖中看到調整裝置的廣播比率和藍牙廣播強度的設定。

[譯]iOS 開發中使用 Swift 進行 iBeacons 互動指南
[譯]iOS 開發中使用 Swift 進行 iBeacons 互動指南

除了手機應用外,廠商之間的 iBeacons 還有如下的差別。當在選擇 iBeacons 時,你應該去考慮如下的因素,因為廠商間趨向于在這些友善有所差別:

裝置的電池壽命

裝置的電池是否可更換

信号的最大、最小範圍

裝置是否有關閉的功能,至少是能否讓他們停止廣播

對其他協定的是否支援(比如 Eddystone)

SDK 功能的完善性(如果一個存在你正打算使用的功能)

我們已經讨論了 iBeacons 是什麼,如何工作并且比較了不同廠商的差別。現在讓我們來看下一下 iOS 程式設計中和他們進行互動的模闆。

iBeacons 的所有功能都是有 iOS 中的 CoreLocation 庫提供,由于 iBeacons 其實是藍牙裝置,這個封裝其實非常有趣。開發者無需了解抽象的庫内部本質上其實是藍牙裝置的信号發射器。

在你的應用中使用 iBeacons ,使用者必須允許通路位置權限。你可以通過在 <code>Info.plist</code> 檔案中添加指定鍵值來提示使用者準許權限。<code>NSLocationWhenInUseUsageDescription</code> 關鍵詞将在應用處于前台時提示使用者打開他們的位置權限。如果你的應用需要在處于背景時接收 iBeacons 位置的推送,需要使用 <code>NSLocationAlwaysUsageDescription</code> 關鍵詞進行替代。

設定好這些鍵值之後,你還需要在應用喚起時,在你的 CLLocationManager 執行個體中調用 requestWhenInUseAuthorization() 方法或者 requestAlwaysAuthorization() 方法。

接收 iBeacon 的通知有兩種模型 :監聽 和 範圍,他們之間有着很大的差別。你應該依據項目的需求,使用其中的一個或者全部都進行使用。

監聽是兩種模型中比較簡單的一個,它可以在你的應用進入或者離開的一個區域的時候進行提醒。為了監聽這些事件,需要執行個體化 <code>CLLocationManager</code> 類并且實作 <code>didEnterRegion</code> 和 <code>didExitRegion</code> 這兩個代理方法。我的使用經驗是退出事件可能會在你離開一個區域後推遲大概 30 秒後才會執行。但是進入一個區域的事件基本上在進入一個區域時馬上就會觸發,基本上是沒有延遲的。如果你一開始是就是在一個區域中的,那麼直到你離開這個區域之前不會收到任何的事件回調。

下邊的是設定監聽一個區域的代碼。

Swift

在設定了監聽之後,你可以通過實作下邊的兩個代理方法來監聽進入和離開區域的回調 :

這還有兩個很有用的 <code>CLLocationManagerDelegate</code> 的代理方法 :<code>didStartMonitoringForRegion</code> 方法來确認監聽被正常啟動了,如果監聽啟動的時候出錯 <code>monitoringDidFailForRegion</code> 方法會提供錯誤資訊。

你需要注意到的一大限制因素是:你同時最多隻能監聽 20 個裝置。如果你有超過 20 個裝置,你就需要持續管理維護應用正在監聽的裝置清單。

範圍是 iBeacon 中的另一種推送模式,本質上它比起監聽模式的資訊量更大并且更頻繁的發送更新資料到應用。設定範圍模式和設定監聽模式很相似,你隻需要用 <code>startRangingBeaconsInRegion</code> 替換 <code>startMonitoringForRegion</code> 方法。一旦設定完成,你隻需要監聽 <code>didRangeBeacons</code> 方法的回調,這個代理方法實作如下:

這些回調方法基本上每秒都會觸發一次。每次回調傳回一個<code>CLBeacon</code> 對象,其中範圍内的裝置資訊如下:

接近度 - <code>CLProximity</code> 類描述裝置的接近程度,值包括 <code>Near</code>, <code>Far</code>, <code>Immediate</code> 和 <code>Unknown</code>。

精确度 - <code>CLLocationAccuracy</code> 類捕獲一個和裝置間精确到米精确值。

RSSI - 捕獲一個 <code>Int</code> 類型的資訊用來描述裝置信号強度。

另外說明一下我們同是需要關注範圍模式比起監聽模式是更耗電。此外,盡管技術上你可以在背景使用範圍模式,但這是個很不被認可的方案。網上的讨論中都說如果你在項目中這樣使用會被蘋果公司拒絕上線。

正像我前邊介紹的那樣,你現在隻能監聽 20 個 iBeacons ,如果你需要監聽超過 20 個裝置,你将需要在應用運作的過程中更改監聽的設定,一種實作方案是用圖表來展示你的 iBeacons 網絡,在網絡中定義最頂層的 iBeacons 以及如果這些彼此接近的情況下能夠連接配接到的邊界。這樣你就可以快速的查找到最接近的 20 個 iBeacons 并監聽他們。這需要很多的工作,但是定義一個這樣的拓撲是一種實作 20 個 iBeacons 限制的方式。

如果你的 iBeacons 不能關閉或者不能輕易的在廣播資料的過程中被停止,你也許應該考慮購買一個法拉第包或籠。如果 iBeacon 不能被關閉的話,多個裝置配置起來很麻煩,會互相幹擾,是以需要法拉第籠來屏蔽其他裝置,一個個來設定。我們很确定 Estimote 的 iBeacons 就有上述的問題,放置所有的裝置除了其中一個放置在法拉第籠中,這将使你很容易使你想要配置的 iBeacons 被孤立出來。

<b>原文釋出時間為:2017年2月16日</b>

<b>本文來自雲栖社群合作夥伴掘金,了解相關資訊可以關注掘金網站。</b>

繼續閱讀