> [Turning an iOS Device into an iBeacon](https://developer.apple.com/documentation/corelocation/turning_an_ios_device_into_an_ibeacon?language=occ)
學習如何在iOS設備上播放 iBeacon 信號。
### 第1節 概述
任何支持使用藍牙低功耗共享數據的 iOS 設備都可以轉換成 iBeacon 。使用 iOS 設備作為 iBeacon 的應用程序必須在前臺運行。因此,對于應用程序來說,無論如何都要在前臺運行該功能。對于其他類型的 iBeacon 實現,請使用來自第三方制造商的專用信標硬件。
要將 iOS 設備用作 iBeacon,請執行以下操作:
1. 為設備獲取或生成一個128位的 UUID。
2. 創建一個包含 UUID 值的 CLBeaconRegion 對象,以及適合信標的 major 和 minor 值。
3. 使用 Core Bluetooth 框架來發送信標信息。
### 第2節 獲取設備的 UUID
識別 iBeacon 的主要方式是來自其 UUID 。在部署一個或多個信標時,需要為每個信標分配一個 UUID,以將信標的用途傳達給客戶端。你定義的內容決定信標的用途。例如,百貨商店可能為其所有已部署的信標使用相同的 UUID,或者每個商店可能會分配一個不同的 UUID。因為檢測涉及使用區域監視來查找具有特定 UUID 的信標,所以使用更少的 UUID 更容易管理。
要為 iBeacon 部署創建一個新的 UUID ,請使用 uuidgen 命令行工具。打開終端,在命令行上輸入 uuidgen,并按 Return。
該工具生成一個惟一的128位值,并將其格式化為一個ASCII字符串,該字符串被連字符分割斷,如清單1所示。
###### 清單1 從命令行生成一個UUID
```
$ uuidgen
39ED98FF-2900-441A-802F-9C398FC199D2
```
### 第3節 配置 CLBeaconRegion 對象
使用 CLBeaconRegion 對象來配置信標的身份。可以使用信標區域生成一個信息字典,可以稍后通過藍牙進行廣播。清單2顯示了如何創建一個信標區域對象并填充信息。
###### 清單2 配置信標的身份
```
//Swift
func createBeaconRegion() -> CLBeaconRegion? {
let proximityUUID = UUID(uuidString:
"39ED98FF-2900-441A-802F-9C398FC199D2")
let major : CLBeaconMajorValue = 100
let minor : CLBeaconMinorValue = 1
let beaconID = "com.example.myDeviceRegion"
return CLBeaconRegion(proximityUUID: proximityUUID!,
major: major, minor: minor, identifier: beaconID)
}
//Objective-C
NSUUID *proximityUUID = [[NSUUID alloc] initWithUUIDString:@"39ED98FF-2900-441A-802F-9C398FC199D2"];
CLBeaconMajorValue majorValue = 100;
CLBeaconMinorValue minorValue = 10;
CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:majorValue minor:minorValue identifier:@"com.example.myDeviceRegion"];
```
UUID,major,minor 值是特定于 iBeacon 實施的。你決定這些值的含義,并決定檢測信標的應用程序如何解讀使用這些值。
### 第4節 通過藍牙發送 iBeacon 廣播
要從 iOS 設備上廣播信標的身份,請使用 Core Bluetooth 框架將 iOS 設備配置為藍牙外設。當配置為外設時,iOS 設備將使用藍牙硬件向其他設備廣播其信標信息。其他設備使用該信息來執行測距并檢測其與 iOS 設備的距離。
將 Core Bluetooth 框架添加到 Xcode 工程中。在代碼中,創建一個 [CBPeripheralManager](https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager?language=objc) 對象并調用它 [startAdvertising:](https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393252-startadvertising?language=objc) 方法來開始廣播信標數據。[startAdvertising:](https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393252-startadvertising?language=objc) 方法使用包含信標信息的字典作為參數。調用之前創建的 [CLBeaconRegion](https://developer.apple.com/documentation/corelocation/clbeaconregion?language=objc) 的 [peripheralDataWithMeasuredPower:](https://developer.apple.com/documentation/corelocation/clbeaconregion/1621494-peripheraldatawithmeasuredpower?language=objc) 方法,以獲取包含與信標相關聯的數據的字典。
###### 清單3 通過藍牙廣播設備
```
//Swift
func advertiseDevice(region : CLBeaconRegion) {
let peripheral = CBPeripheralManager(delegate: self, queue: nil)
let peripheralData = region.peripheralData(withMeasuredPower: nil)
peripheral.startAdvertising(((peripheralData as NSDictionary) as! [String : Any]))
}
//Objective-C
NSDictionary *peripheraData = [beaconRegion peripheralDataWithMeasuredPower:nil];
CBPeripheralManager *peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
[peripheralManager startAdvertising:peripheraData];
```
調用 [peripheralDataWithMeasuredPower:](https://developer.apple.com/documentation/corelocation/clbeaconregion/1621494-peripheraldatawithmeasuredpower?language=objc) 方法獲取數據字典時,通常會傳遞 nil 來指定與 iOS 設備關聯的默認接收信號強度指示(RSSI)值。此參數表示從離設備一米遠處測得的信號強度(以分貝為單位)。如果需要在某些環境中校準設備以獲得更好的測距性能,則可以指定自定義值。
在創建外圍管理器對象時,它會調用其委托對象的 [peripheralManagerDidUpdateState:](https://developer.apple.com/documentation/corebluetooth/cbperipheralmanagerdelegate/1393271-peripheralmanagerdidupdatestate?language=objc) 方法。必須實施此代表方法,以確保在 iOS 設備上支持并使用 BLE 。
> 重要提示
> 在將應用作為一個 iBeacon 進行廣播之后,應用必須繼續在前臺運行,以播放所需的藍牙信號。如果用戶退出應用,系統就會停止在藍牙設備上做廣播。
在測距期間,可能會有一段短暫的時間,Core Location 為同一個 iOS 設備創建兩個 [CLBeacon](https://developer.apple.com/documentation/corelocation/clbeacon?language=objc) 對象。出現這種情況的原因是 iOS 定期更改設備的 Bluetooth 標識符以保護用戶的隱私,一個信標代表舊標識符,一個信標代表新標識符。在標識符更改的2秒內,具有舊標識符的信標將其接近度屬性設置為 [CLProximityUnknown](https://developer.apple.com/documentation/corelocation/clproximity/clproximityunknown?language=objc)。在10秒鐘之內,舊的標識符不再被報告。