CoreBluetooth广告错误

时间:2015-10-09 10:32:27

标签: ios bluetooth-lowenergy core-bluetooth ibeacon

尝试宣传某些服务数据时发生了一个奇怪的错误。

func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
    if let beacon = beacons.first, username = NSUserDefaults.standardUserDefaults().objectForKey("username") {
        var major = beacon.major.integerValue
        var minor = beacon.minor.integerValue

        let advertismentData:[String:AnyObject] = [
            CBAdvertisementDataServiceUUIDsKey:[AppDelegate.MajorUUID, AppDelegate.MinorUUID, AppDelegate.IdentifierUUID],
            CBAdvertisementDataServiceDataKey:[AppDelegate.MajorUUID: NSData(bytes: &major, length: sizeof(Int)), AppDelegate.MinorUUID: NSData(bytes: &minor, length: sizeof(Int)), AppDelegate.IdentifierUUID: username.dataUsingEncoding(NSUTF8StringEncoding)]
        ]
        peripheralManger?.startAdvertising(advertismentData)
        manager.stopRangingBeaconsInRegion(region)
    }
}

传递给广告时会发生以下错误:

  

2015-10-09 11:17:05.563 BeConvo [280:21134] - [CBUUID UTF8String]:   无法识别的选择器发送到实例0x13dd5b420 2015-10-09   11:17:05.564 BeConvo [280:21134] *由于未被捕获而终止应用程序   异常'NSInvalidArgumentException',原因:' - [CBUUID UTF8String]:   无法识别的选择器发送到实例0x13dd5b420'   * 第一次抛出调用堆栈:(0x185364f5c 0x199f5bf80 0x18536bc6c 0x185368c14 0x18526cdcc 0x184fe56b4 0x185361f00 0x184fe4634   0x184fe58a8 0x184fe56d8 0x185361f00 0x184fe4634 0x184fe44dc   0x184fe4704 0x184fe47e8 0x184fe6104 0x184fe7190 0x1000eb9a4   0x1000ebae0 0x185af5f04 0x185af0b14 0x185aeaef4 0x18531c48c   0x18531bdc4 0x18531a20c 0x185248dc0 0x19039c088 0x18a922f44   0x1000ec328 0x19a7868b8)libc ++ abi.dylib:以uncaught终止   NSException类型的异常

如果删除ServiceDataKey或删除字典内容,则广告会成功。

func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
    if let beacon = beacons.first, username = NSUserDefaults.standardUserDefaults().objectForKey("username") {
        var major = beacon.major.integerValue
        var minor = beacon.minor.integerValue

        let advertismentData:[String:AnyObject] = [
            CBAdvertisementDataServiceUUIDsKey:[AppDelegate.MajorUUID, AppDelegate.MinorUUID, AppDelegate.IdentifierUUID],
            CBAdvertisementDataServiceDataKey:[]
        ]
        peripheralManger?.startAdvertising(advertismentData)
        manager.stopRangingBeaconsInRegion(region)
    }
}

我已经尝试了每一个键/值对来查看它是否是特定的一个,但任何组合中的任何一个都会导致错误发生。

有人有任何想法吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

不幸的是,CBAdvertisementDataServiceDataKey只能在iOS上阅读。虽然您可以在发现外围设备时使用它来读取服务数据,但您无法使用CBPeriperalManager来传输服务数据。有关详细信息,请参阅此处:https://stackoverflow.com/a/31856456/1461050

如果您希望传输iBeacon数据包,可以使用region.peripheralDataWithMeasuredPower(nil)作为@heypiotr在他的回答中建议。

为了便于理解,请注意iBeacon广告是制造商的蓝牙广告,而不是服务广告。因此,即使显示的技术有效,也没有理由填充CBAdvertisementDataServiceUUIDsKey,如示例所示。发送服务广告不会触发iBeacon接收器。

答案 1 :(得分:0)

如果您想要宣传为iBeacon,那么使用CLBeaconRegion peripheralDataWithMeasuredPower方法会更容易且更不容易出错,这会自动生成适当的广告数据您。下面的示例代码段:

let region = CLBeaconRegion(proximityUUID: beacon.proximityUUID,
                            major: beacon.major, minor: beacon.minor,
                            identifier: "iOS beacon")
let advertisementData = region.peripheralDataWithMeasuredPower(nil)
peripheralManger?.startAdvertising(advertisementData)