1. 程式人生 > >iBeacon 教學(swift 3, iOS)

iBeacon 教學(swift 3, iOS)

以下,以程式碼來說明整個iBeacon在iOS app內的大概流程。

首先先演示最後的app畫面:

開啟app後的畫面
偵測到iBeacon後,背景變為紅色,秀出iBeacon相關資訊,並顯示“已在region中”
離開region後,背景變為白色,並顯示“離開region”

在iOS內,要使用iBeacon相關的API,必須使用Core Location 框架。手機部分也必須開啟GPS追蹤和藍芽。

開啟GPS追蹤

在iBeacon的世界中,每顆iBeacon發出的訊號內皆帶著UUID、Major、Minor。如同在地圖應用內一樣,每個iBeacon的訊號形成一個region,手機要“monitor”這個region,當進入或離開region時,做出相對的反應(如:推播訊息。)

手機是否能monitor任一顆iBeacon的region,如上所提,必須要iPhone 4S以後的手機才支援。故在ViewController中,首次開啟app,先判斷硬體是否支援接收iBeacon訊號,若支援的話,則要求使用者使用GPS。

如同正常的地圖應用,使用CoreLocation時,需建立CLLocationManager的實體,並使用CLLocationManagerDelegate這個protocol來實現各種功能。

iBeacon的訊號,會形成一個region,而這個region可透過UUID、Major、Minor Value,並給定一個identifier來建立。

給定identifier的好處在於,透過identifier的名稱,可輕易分辨接收到的每個region訊號分別為哪家櫃位。

如上面百貨公司的例子,這家百貨公司有20顆iBeacon供使用者搜尋。在程式碼中,給定UUID,即可一次鎖定20顆在此UUID之下的iBeacon。也就是說,一個region,不一定只代表一顆iBeacon。

透過如下第3行,建立region後,第8行透過locationManager即可開始monitor各個region,判斷使用者是否進入或離開region。

第4,5行內,要求當進入region和離開region時通知。預設即是開啟,在此只是演示此功能。

一個app最多一次可同時monitor 20個region!

一開始monitor,就會呼叫CLLocationManagerDelegate內的didStartMonitoringForregion的函式,在此函式內使用requestState函式,判斷開始monitor的當下,使用者是否在region內。

使用requestState函式得到的目前狀態,會傳到didDetermineState函式內

這裡來了一個重點,使用者可能同時偵測到多顆iBeacon的訊號,但一般來說,我們想要的是一個由遠到近的iBeacon距離排列順序,而這個距離排列行為就稱為ranging。

在didDetermineState函式內,第3行判斷目前狀態是否位於任一個region內,若進入region內,第5行接著開始ranging,排列出所有目前偵測到的iBeacon距離。

同樣的,在第4行內,判斷此手機是否支援接收iBeacon訊號,可進行ranging。

在使用者與各個iBeacon region的關係中,只有在進入region或離開region才會觸發通知,在region內任何的移動並不會造成持續一直接收通知。

進入region或離開region時,會呼叫didEnterRegion、didExitRegion和上面的didDetermineState函式。

在函式內決定開始ranging或停止ranging。

ranging完成後,呼叫didRangeBeacons函式,取得beacons引數,此為一個array,即為使用者接收到的所有iBeacon,經過排序後,依照距離由近到遠列出。

第4行可知,其內只取出離使用者最近,也就是array當中的第一個element。

在此獲取的每個iBeacon都是一個CLBeacon class的實體,其內有3個重要的屬性:proximity、accuracy、rssi

proximity:與此iBeacon的距離,由近到遠分為immediate、near、far和unknown

accuracy:proximity的準確程度,單位是meter,數值越高表示proximity的準確程度越不能相信,負值表示無法計算。但千萬別把這個數值作為實際距離,此數值受到很多外在因素幹擾,且距離越遠越無參考性。

rssi:接收到的iBeacon訊號強弱程度,單位為decibels

以上三個數值,會綜合起來參考,用來衡量目前使用者與iBeacon的距離。

最後,處理所有錯誤情況發生的時候。