iBeacon 是蘋(píng)果公司在 iOS 7 中新推出的一種近場(chǎng)定位技術(shù),可以感知一個(gè)附近的 iBeacon 信標(biāo)的存在。
當(dāng)一個(gè) iBeacon 兼容設(shè)備進(jìn)入/退出一個(gè) iBeacon 信標(biāo)標(biāo)識(shí)的區(qū)域時(shí),iOS 和支持 iBeacon 的 app 就能得知這一信息,從而對(duì)用戶發(fā)出相應(yīng)的通知。
典型的應(yīng)用場(chǎng)景例如博物館實(shí)時(shí)推送附近展品的相關(guān)信息,商場(chǎng)內(nèi)即時(shí)通知客戶折扣信息等。蘋(píng)果在 Apple Store 中也部署了 iBeacon 來(lái)推送優(yōu)惠、活動(dòng)信息。
iBeacon 基于低功耗藍(lán)牙技術(shù)(Bluetooth Low Energy, BLE)這一開(kāi)放標(biāo)準(zhǔn),因此也繼承了 BLE 的一些特點(diǎn)。
范圍廣
相比于 NFC 的數(shù)厘米的識(shí)別范圍,iBeacon 的識(shí)別范圍可以達(dá)到數(shù)十米,并且能夠估計(jì)距離的遠(yuǎn)近。
兼容性
iBeacon 是基于 BLE 做的一個(gè)簡(jiǎn)單封裝,因此大部分支持 BLE 的設(shè)備都可以兼容。 例如可以使用一個(gè)普通的藍(lán)牙芯片作為信標(biāo),使用 Android 設(shè)備檢測(cè)信標(biāo)的存在。
低能耗
不少 beacon 實(shí)現(xiàn)宣稱可以不依賴外部能源獨(dú)立運(yùn)行兩年。
我們以一個(gè)連鎖商場(chǎng)的例子來(lái)講解 iBeacon 的一個(gè)流程。在一個(gè)連鎖商場(chǎng)中,店家需要在商場(chǎng)中的不同地方推送不同的優(yōu)惠信息,比如服裝和家居柜臺(tái)推送的消息就很有可能不同。
當(dāng)消費(fèi)者走進(jìn)某個(gè)商場(chǎng)時(shí),會(huì)掃描到一個(gè) beacon。這個(gè) beacon 有三個(gè)標(biāo)志符,proximityUUID
是一個(gè)整個(gè)公司(所有連鎖商場(chǎng))統(tǒng)一的值,可以用來(lái)標(biāo)識(shí)這個(gè)公司,major
值用來(lái)標(biāo)識(shí)特定的連鎖商場(chǎng),比如消費(fèi)者正在走進(jìn)的商場(chǎng),minor
值標(biāo)識(shí)了特定的一個(gè)位置的 beacon,例如定位到消費(fèi)者正在門(mén)口。
這時(shí)商場(chǎng)的 app 會(huì)被系統(tǒng)喚醒,app 可以運(yùn)行一個(gè)比較短的時(shí)間。在這段時(shí)間內(nèi),app 可以根據(jù) beacon 的屬性查詢到用戶的地理位置(通過(guò)查詢服務(wù)器或者本地?cái)?shù)據(jù)),例如在化妝品專柜,之后就可以通過(guò)一個(gè) local notification 推送化妝品的促銷(xiāo)信息。用戶可以點(diǎn)擊這次 local notification 來(lái)查看更詳細(xì)的信息,這樣一次促銷(xiāo)行為就完成了。
閑話少說(shuō),我們來(lái)看下 iBeacon 具體怎么使用:
iBeacon 本質(zhì)上來(lái)說(shuō)是一個(gè)位置(區(qū)域)信息,所以 Apple 把 iBeacon 功能集成在了 Core Location 里面。
iBeacon 信標(biāo)在 Core Location 中表現(xiàn)為一個(gè) CLBeacon
,它圈定的范圍則表現(xiàn)為 CLBeaconRegion
,這是一個(gè) CLRegion
的子類。
CLBeaconRegion
主要用三個(gè)屬性來(lái)標(biāo)識(shí)一個(gè) iBeacon,proximityUUID
、major
和 minor
。
proximityUUID
是一個(gè) NSUUID
,用來(lái)標(biāo)識(shí)公司,每個(gè)公司、組織使用的 iBeacon 應(yīng)該擁有同樣的 proximityUUID
。
major
用來(lái)識(shí)別一組相關(guān)聯(lián)的 beacon,例如在連鎖超市的場(chǎng)景中,每個(gè)分店的 beacon 應(yīng)該擁有同樣的 major
。
minor
則用來(lái)區(qū)分某個(gè)特定的 beacon。
這些屬性如果不指定(即 nil),匹配的時(shí)候就會(huì)忽略這個(gè)屬性。例如只指定 proximityUUID
的 CLBeaconRegion
可以匹配某公司的所有 beacons。
Apple 在 iOS 4 中增加了地理圍欄 API,可以用來(lái)在設(shè)備進(jìn)入/退出某個(gè)地理區(qū)域時(shí)獲得通知,這些 API 包括 -startMonitoringForRegion:
、-locationManager:didEnterRegion:
、-locationManager:didExitRegion:
等。 CLBeaconRegion
作為 CLRegion
的子類也可以復(fù)用這些 API,這種檢測(cè) iBeacon 的方式叫做 monitoring。
使用這種方法可以在程序在后臺(tái)運(yùn)行時(shí)檢測(cè) iBeacon,但是只能同時(shí)檢測(cè) 20 個(gè) region,也不能推測(cè)設(shè)備與 beacon 的距離。
除了使用地理圍欄 API 的方式,Apple 還在 iOS 7 中新增加了 iBeacon 專用的檢測(cè)方式,也就是 ranging。
通過(guò) CLLocationManager
的 -startRangingBeaconsInRegion:
方法可以開(kāi)始檢測(cè)特定的 iBeacon。
當(dāng)檢測(cè)到 beacon 的時(shí)候,CLLocationManager
的 delegate 方法 -locationManager:didRangeBeacons:inRegion:
會(huì)被調(diào)用,通知調(diào)用者現(xiàn)在被檢測(cè)到的 beacons。 這個(gè)方法會(huì)返回一個(gè) CLBeacon
的數(shù)組,根據(jù) CLBeacon
的 proximity
屬性就可以判斷設(shè)備和 beacon 之間的距離。
proximity
屬性有四個(gè)可能的值,unknown、immediate、near 和 far。 另外 CLBeacon
還有 accuracy
和 rssi
兩個(gè)屬性能提供更詳細(xì)的距離數(shù)據(jù)。
我們可以使用 Core Bluetooth 框架來(lái)廣播特定的 payload 來(lái)讓 iOS 設(shè)備成為一個(gè) iBeacon。 這個(gè) payload 可以由 CLBeaconRegion
的 -peripheralDataWithMeasuredPower:
方法來(lái)獲取。
之后交給 CBPeripheralManager
廣播出去就可以了。
需要注意的是,廣播 iBeacon 信息的時(shí)候 app 必須在前臺(tái)運(yùn)行。
iBeacon 的 API 并不十分復(fù)雜,但他的行為比較難弄清楚,特別是當(dāng)應(yīng)用運(yùn)行在后臺(tái)時(shí),檢測(cè)到 beacon 的時(shí)間延遲會(huì)讓開(kāi)發(fā)者難以推測(cè)。在做了一些實(shí)驗(yàn)和合理的推測(cè)后,我們得出了一些結(jié)論:
notifyEntryStateOnDisplay=YES
的 beacon,iOS 會(huì)在屏幕點(diǎn)亮的時(shí)候(鎖屏狀態(tài)下按下 home 鍵,或者因?yàn)槭盏酵扑忘c(diǎn)亮等)進(jìn)行一次掃描。2018-02-10
2018-03-01
2017-01-22