将 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])
我正在尝试让一个应用程序工作,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])