将 iPhone 用作 iBeacon

Using iPhones as iBeacons

我正在尝试让一个应用程序工作,phone 发出一个 iBeacon 信号,附近的 phones 能够在后台检测到它并执行回调方法。 Phone A 正在广播信号,phone B 在后台监视它并调用方法。这是全部设置的代码:

var centralManager: CBCentralManager!
var peripheralManager: CBPeripheralManager = CBPeripheralManager()
var locationManager: CLLocationManager = CLLocationManager()
let uuid: NSUUID = NSUUID(UUIDString: "DCEF54A2-31EB-467F-AF8E-350FB641C97B")!

override func viewDidLoad() {
    super.viewDidLoad()
    self.locationManager.delegate = self
    self.locationManager.requestAlwaysAuthorization()
    self.centralManager = CBCentralManager(delegate: self, queue: nil)
    self.peripheralManager = CBPeripheralManager(delegate: self, queue: nil)
    let beaconRegion = CLBeaconRegion(proximityUUID: uuid, identifier: "device")
    locationManager.startMonitoringForRegion(beaconRegion)

这是我用于广告和监控信标的代码:

func locationManager(manager: CLLocationManager, didEnterRegion region: CLRegion) {
    print("Beacon has been found")
    print(region)
}

func peripheralManagerDidUpdateState(peripheral: CBPeripheralManager) {
    print("PM state updated")
    let advertisingData = [CBAdvertisementDataLocalNameKey:"device", CBAdvertisementDataServiceUUIDsKey: uuid]
    peripheralManager.startAdvertising(advertisingData)
}

由于我希望所有设备具有相同的 UUID,因此我没有指定主要和次要,但是我想获得 phone B 的主要和次要用于它在监视时调用的方法 phone A.

我的问题是 phone A 能够成功开始广告,但是 phone B 似乎无法识别任何设备。

设置蓝牙广告的代码没有设置iBeacon传输:

let advertisingData = [CBAdvertisementDataLocalNameKey:"device", CBAdvertisementDataServiceUUIDsKey: uuid]
peripheralManager.startAdvertising(advertisingData)

该代码实际上设置为通告服务 ID 为 DCEF54A2-31EB-467F-AF8E-350FB641C97B 的蓝牙 LE 服务。这与 iBeacon 广告不同,iBeacon 广告是 制造商 广告,具有 ProximityUUID(不同于服务 UUID)以及主要和次要标识符。您使用 ProximityUUID DCEF54A2-31EB-467F-AF8E-350FB641C97B major 1 minor 1 设置 iBeacon 传输,如下所示:

let advertisingData = beacon.peripheralDataWithMeasuredPower(nil) as Dictionary
peripheralManager.startAdvertising(advertisingData as? [String : AnyObject])