iBeacon x Firebase打造定點留言板[Swift](一)

YU
6 min readDec 27, 2016

--

iBeacon是蘋果公司提出的「一種可以讓附近手持電子設備檢測到的一種新的低功耗、低成本信號傳送器」的一套可用於室內定位系統的協議。這種技術可以使一個智慧型手機或其他裝置在一個iBeacon基站的感應範圍內執行相應的命令。

這是幫助智慧型手機確定他們大概位置或環境的一個應用程式。在一個iBeacon基站的幫助下,智慧型手機的軟體能大概找到它和這個iBeacon基站的相對位置。iBeacon能讓手機收到附近售賣商品的通知,也可以讓消費者不用拿出錢包或信用卡就能在銷售點的POS機上完成支付。iBeacon技術通過低功耗藍牙(BLE),也就是智能藍牙來實現。

iBeacon為利用低功耗藍牙可以近距離感測的功能來傳輸通用唯一識別碼的一個app或作業系統。 這個識別碼可以在網上被查找到用以確定設備的物理位置或者可以在設備上觸發一個動作比如在社交媒體簽到或者推送通知。

維基百科

  1. iOS 7.0及以後的版本開始支援iBeacon。
  2. iPhone4S及以後, ipad 3代及以後, ipad Mini及以後, ipod 5及以後。

其實 iBeacon除了是一個BLE之外什麼也不是,但要明白的一件重要事情是 我們之所以能夠監控這些 iBeacon 就是基於UUID、major value和 minor value。

舉個例子🌰,便利商店的所有iBeacon可以是同一個UUID,每一間分店利用major來識別,分店的每個區域使用minor識別,這樣就可以在客人走到某個區域就推送那個區域的優惠商品到手機上。

iBeacon除了傳送UUID、Major、Minor還會傳送靠近程度。靠近程度是Immediate、Near、Far、Unknown中的一種。

以下是實測數據約略值(並不能準確的顯示距離,所以室內定位都採用多個iBeacon去運算)

  • Immediate: 貼近
  • Near: 一公尺內
  • Far: 一公尺外
  • Unknown: 不在範圍內

還可以搭配 accuracy 以及 RSSI來推算距離,accuracy越高代表距離越遠。RSSI為負值越接近0表示訊號越強,也就是越接近iBeacon。

在監控iBeacon時,是使用CoreLocation,而不是CoreBluetooth,我們再處理iBeacon的資訊是處理iBeacon的一個區域CLRegion及它的子類別CLBeaconRegion。

記得要在info.plist添加隱私的選項

蘋果不建議用hardcode的方式來寫可能會有變動的字串,直接用String表示一個名稱,用tag來取得IB中的view。這些行為會影響程式的可維護性。所以我們把iBeacon的UUID 及identifier 儲存在Firebase中。之後要修改或添加就可以直接在Firebase中修改。

在Firebase中取得beaconID,beaconID是一個裡面是字典的陣列,取得每個字典來設定要監聽的iBeacon!

利用一個UISwitch來開始或停止偵測iBeacon

  • beaconRegions為所有要偵測的iBeacon
  • currentRegions是用來顯示tableView的陣列,表示目前偵測到的iBeacon。

實作CLLocationManagerDelegate

  • 走到didStartMonitoringFor,則代表這個區域可以被監聽的。
  • 可以利用didDetermineState來偵測狀態並推送通知

另外locationManager的delegate還可以實作兩個方法didEnterRegion及didExitRegion,當這兩個方法被呼叫時,就會觸發didDetermineState。

*要注意的是didEnter和didExit的呼叫是以UUID來觸發的,因為iBeacon可以有相同的uuid,不同的major和不同的minor。如果A,B是兩個相同UUID, major和minor不同的兩個iBeacon設備,若使用者從A區域走到B區域,並不會呼叫didEnter和didExit。didEnter和didExit的呼叫可靠性並不高,可能你在範圍內他還是會呼叫didExit然後再呼叫didEnter。

所以要知道目前範圍內的iBeacon比較好的方式是在didRangeBeacons這個方法內。

偵測到我們指定的beacon,didRangeBeacons就會被觸發,可以在其中讀取目前beacon的資訊。

把每個iBeacon的資訊利用key為iBeacon identifier 的字典存起來方便我們在tableView中展示。

在tableView中顯示偵測到的iBeacon及資訊

--

--