ibeacon tags wholesale ibeacon android private label

嘿,我的名字是 Will,今天我

將向您展示如何編寫一個使用 iBeacon 的小型 Swift 應用

程序。 我們的應用程序將

找到距離設備最近的信標並

更改屏幕顏色以匹配該

信標的顏色。 我們不會使用任何 SDK,

我們將直接與 CoreLocation

API 交互以檢測信標,我想您

會驚訝於代碼如此之少

,啟動和運行所需的樣板代碼如此之少

iBeacon。 讓我們開始吧。 繼續

並啟動 Xcode,我們將創建

一個新項目,一個單一視圖應用程序。

我將稱之為”最近的信標演示”。

確保您的語言是 Swift,這就是

我們今天要使用的語言。 和設備,

只需選擇您實際擁有的任何一個。

對於這個演示,要繼續進行,您需要

做一些事情。 首先,您需要使用信標

與應用程序進行實際交互。 其次,

您需要一個設備和一個付費開發者

帳戶才能將應用程序實際加載到

您的設備上。 原因是,我們正在檢測

藍牙信號,而您的 Mac 不會將

其藍牙硬件代理到模擬器,因此

您實際上不會使用模擬器檢測到任何信標

。 好的,繼續點擊下一步

並保存。 我們將幾乎

完全在我們的視圖控制器中工作,

所以繼續並打開它。 現在,為了

與 iBeacon 交互,我們將使用 CoreLocation,

所以我們要做的第一

件事就是在 UIKit 的正下方導入該庫。

我們需要做的下一件事是告訴我們的類

它將有哪些委託方法

可供它使用,因此我們將創建一個 LocationManagerDelegate

並將所有這些方法直接傳遞

到這裡。 所以在 UIViewController 之後

添加一個逗號,我們將添加 ‘CLLocationManagerDelegate’

,這將告訴這個類

它有哪些委託方法可用。 接下來

我們實際上需要創建一個位置管理器,

這是為我們協調所有位置

服務的東西。 所以繼續定義一個

locationManager,這將是一個

‘CLLocationManager()’的實例,就像

那樣。 接下來我們需要告訴 locationManager

它的委託是什麼以及它應該在哪里

傳遞委託方法,所以就在 viewDidLoad() 內部,

讓我們告訴 locationManager 它的委託

是”self”,這個視圖控制器。 好的,現在

我們已經完成了,為了真正開始

使用 locationManager,我們需要做一些

事情。 您可能已經註意到

,當您使用應用程序時,它們必須徵得

您的許可才能訪問 GPS。

ibeacon module manufacturer 技術也是如此。 未經他們的許可,您不能

開始尋找和嗅探藍牙信號

。 所以

我們需要做一些事情來做到這一點。 首先,

我們將在 locationManger 上

為”requestWhenInUseAuthorization()”調用一個方法。

因此,您可以使用幾個不同的選項

,因此有兩個選項:requestAlwaysAuthorization(),即使您在後台,

它也會授予您訪問位置服務的權限

,並且您

可以喚醒您的應用程序並響應這些

通知。 或 requestWhenInUseAuthorization()

,這將您的訪問限制為僅當

您在前台並且用戶正在

積極使用您的應用程序時。 由於我們正在

更改屏幕顏色以響應最近的

信標,因此我們請求 whenInUseAuthorization() 是有意義的。

所以 requestWhenInUseAuthorization()

和 requestAlwaysAuthorization() 的另一部分是一旦他們

批准了這一點,您就不必繼續詢問

,實際上系統不會繼續

詢問對話框。 但為了負責任,

我想我們會在這裡添加一點檢查。

因此,為了檢查我們的授權

狀態,CLLocationManager 上有一個類方法

(您會注意到這是實際的 CLLocationManager

類,而不是我們的 locationManager 實例)。

如果您對此調用 authorizationStatus() ,

它將返回一個枚舉。 所以讓我們說

如果這不是 CLAuthorizationStatus.AuthorizedWhenInUse 之外的任何東西,

這就是我們想要的,如果不是

這個,如果它被拒絕,或者只是還沒有

請求,那麼讓我們請求這個 requestWhenInUseAuthorization()。

所以現在如果我們真的在這裡啟動我們的模擬器

,你會發現什麼都沒有發生。 加載

屏幕確實消失了,所以這是我們的空白屏幕,

viewDidLoad() 確實觸發了,但我們沒有被

要求授權。 那

是因為我們還需要做一件事。 所以在

我們的支持文件中,你會找到你的 info.plist。

我們需要在此處添加一行,

定義消息/理由或您對

用戶為何應授權的請求。 所以讓

我們在底部添加另一行,

這也是一個問題,因為這

不會自動完成,並且沒有

很好的記錄,但是您需要添加這個

鍵:’NSLocationWhenInUseUsageDescription’。

那是一口。 這就是關鍵,

whenInUseUsageDescription,值

將是提示中顯示的內容。 所以

我要說”檢測信標並顯示

最近的信標的顏色。” 所以現在

我們在我們的 plist 中有它,讓我們再次運行。

現在你會看到,一旦加載屏幕

消失,我們就會收到提示,

它說,”檢測信標並顯示最近的信標的

顏色。” 這正是

我們剛剛在 plist 中輸入的內容。 因此,現在當您

點擊”允許”時,您實際上可以

訪問委託方法,您實際上可以

通過 locationManager 控制開始

執行操作。 所以現在我們已經獲得了

授權狀態,我們可以開始實際

監聽信標了。 所以我們需要做的第一件事

就是建立一個區域。 區域是一種

告訴您的位置管理器您關心哪些信標的方式

。 您可能會想像,在擁擠的

區域、地鐵或某個地方,

用戶周圍可能有很多信標,並且您

不想

從其他人的信標觸發應用程序中的內容。 所以你需要

一種方法來告訴 locationManager 哪些信標

是你的。 現在每個信標都有一個 UUID 字符串

,它應該是您的信標唯一的。

這正是您用來定義區域的方法。

所以讓我們從創建一個區域開始,

這將是一個 CLBeaconRegion 的實例,

我們將傳遞

給它兩件事:一個鄰近 UUID 和一個標識符。

現在是 UUID,我正在使用 Estimote 信標,

它們都帶有相同的信標,所以我

去查了一下,我這裡只有一個小

文本擴展器來填充

它。你會看到這將是 以

NSUUID 的格式並在此處使用 UUIDString 創建

,但取決於您

使用的信標,或者如果您自己製作,您

可能應該知道正在廣播的 UUID

,這就是您應該在此處填寫的內容, 那是

你特有的。 標識符只是一個

字符串,它會告訴您

這是哪個區域,如果您監視多個區域,

則可以在返回事件時訪問此標識符

。 所以我將稱之為

‘Estimotes’,這就是該地區的情況。

我們需要對這個區域做的下一

件事實際上是告訴我們的 locationManager 實例

使用這個區域並開始尋找。 因此

,locationManager 上有一個

用於 startRangingBeaconsInRegion() 的實例方法,我們

將傳入我們剛剛定義的區域。

所以現在我們將真正能夠

開始監聽信標,這意味著

我們的委託方法將開始被

調用。 因此,如果您開始在 locationManager 中輸入,

您將在此處看到我們可用的所有委託方法的自動完成功能

。 這是我們在這里關心的一個:didRangeBeacons:inRegion。

所以首先,讓我們實際上只是註銷

輸出。 你會看到返回的信標

只是一個 [AnyObject] 的數組,所以讓我們

在這裡打印出來。

就您可以使用

模擬器而言,現在是切換到真實設備的時候了。

所以我要把它加載到我的手機上

,讓我們在這裡觀看日誌輸出。

所以它正在加載,我們將允許訪問,現在我們

開始取回一大堆信標。

所以讓我們暫時停止,我們會

仔細看看。 我周圍有 3 個信標

,所以每次返回時,它

應該打印出一個數組中的 3 個信標。 我們

在這裡看到了我們的 UUID,我們看到

了每個、鄰近度和 rssi 的主要值和次要值

。 我們確實看到了這個,那個是一個,這個

是兩個,那個是數組中的三個。 所以

這裡有幾件事:每個信標至少

要廣播這三個標識符

:UUID、主要和次要值,這

就是您識別信標的方式。 然後接近度

很有趣,接近度是一個枚舉

,返回為 0、1、2 或 3。這

只是一般意義上的一種告訴

您信標有多近的方式。 所以0代表它不知道,

1代表它非常接近,2代表它

有點遠,3代表它很

遠。 RSSI 是實際信號強度的度量

。 越接近 0,它就越強

,因此 -49 的 rssi

比 -51 更接近於 0,這與 -51 匹配。 現在我

想提一下,在我的測試中,我已經做

了一大堆交換和查看日誌

,這個數組總是回到我身邊,

按 rssi 排序最接近最遠。 所以你會

看到所有這些的接近度都是 2,在這裡將

所有這些日誌放在一起很難

看到,但是接近度返回為

2,所以一般來說你無法分辨

哪個最接近 ,但使用 RSSI 或信號

強度是另一種

通過檢查哪個 RSSI 最接近 0 來區分更細粒度級別的方法

。問題是

未知的 RSSI 報告為 0,並且

會在此之前返回 數組,所以你

不能僅僅指望獲取

數組中的第一個,因為未知的

不太可能比已知的更接近,特別是

如果有一堆回來。 所以

我們現在想要對這個數組做一些事情

。 我們要做的第一件事是清理

它,這意味著我在這裡使用我將只

獲取數組中的第一個並假設

它是最接近的,但在此之前我

想清除所有未知數。 我確實

想指出,如果您要發布生產

應用程序,您不應該依賴第

一個返回的最接近的應用程序。 只是在

我的測試中,我發現了這一點,因此對於本教程,

我們將繼續這樣做,但

Apple 的文檔中沒有任何內容承諾

它將永遠如此,或者

它將永遠如此。 因此,讓我們

通過創建一個名為 knownBeacons 的新數組來清理返回的這個信標數組

,我們將在從這裡委託方法返回

的信標數組上調用過濾器方法

所以在這裡我們想說,讓我們檢查

這個數組中的每個項目,如果它的接近度不等於 CLProximity.Unknown,

(記住接近度是一個枚舉,所以我正在

檢查 Unknown 的枚舉值),然後說 ,

你可以留在這個數組中,否則只要接近度不是未知的,信標

就會把這個item推送到knownBeacons數組

中。 所以

現在我們有一個 knownBeacons 數組,它將

包含與另一個數組相同的排序,

減去所有未知的信標。 所以現在

就我們的目的而言,只獲取

數組中的第一個是安全的。 所以

在我們這樣做之前我唯一想做的就是

確保這裡實際上至少剩下一個

,所以只要計數大於

0,我們就會讓最近的Beacon

成為第一個已知的Beacon, 我們需要將

其轉換為 CLBeacon,以便它知道

它是什麼。 唯一剩下要做的就是

將我們的背景顏色設置為這個

信標的顏色。 我要回到這裡,我

有另一個文本擴展器來創建這個

數組,其中鍵對應於

我的信標的次要值,這就是我

要識別它們的方式,我發現了所有的次要值

我之前的信標,並將

它們與我發現非常接近的 UIColor 相關聯

。 所以我們在這裡要做的是我們

要說self.view.backgroundColor

將等於我們的colors 數組,

並且鍵將是我們的closestBeacon.minor

值,轉換為它的integerValue。 所以我們將

保存並運行

,當它彈出時,我將把綠色信標真正靠近它,

我們會看到屏幕的顏色是綠色的。

把它換成藍色,屏幕變成藍色,

把它換成紫色,屏幕變成

紫色。 所以我們可以一整天都這樣做,

當我們將信標移近和

遠離我們的設備時,我們會看到顏色變化很快,看到它正在工作。

好的,這

就是如何使用 Swift 和 iOS8 啟動和運行 iBeacon 的基本示例

。 如果您有任何問題,請

隨時將它們留在 YouTube 評論中

或在 Twitter 上找到我,我是 @willdages。 我

很想收到你的來信,尤其是如果這

對你有幫助的話。 謝謝!

Leave a Reply

Your email address will not be published. Required fields are marked *