【问题标题】:CoreBluetooth advertisement errorCoreBluetooth 广告错误
【发布时间】:2015-10-09 10:32:26
【问题描述】:

我在尝试宣传某些服务数据时遇到了一个奇怪的错误。

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: 以未捕获的方式终止 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)
    }
}

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

有人有什么想法吗?

感谢您的帮助。

【问题讨论】:

    标签: ios bluetooth-lowenergy core-bluetooth ibeacon


    【解决方案1】:

    不幸的是,CBAdvertisementDataServiceDataKey 在 iOS 上是只读的。虽然您可以在发现外围设备时使用它来读取服务数据,但您不能使用它来使用CBPeriperalManager 传输服务数据。更多信息请看这里:https://stackoverflow.com/a/31856456/1461050

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

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

    【讨论】:

    • 感谢您的回答大卫。无论如何,是否有从 iOS 设备宣传特定价值的广告?我不能只使用信标的原因是我想发送一条特定的信息,在这种情况下是用户名以及我正在响应的信标的主要和次要值(如果该地区有其他信标可能会看到响应)。
    • 是的,这是一个常见的用例。不幸的是,iOS 在使用设备传输蓝牙广告时限制了你很多。您可以通告服务 UUID(但只能不附加数据。)由于长服务 UUID 为 16 个字节,您可以使用其中一些字节作为匹配前缀,其余字节用于对用户 ID 和其他信息进行编码。接收设备必须扫描所有服务 uuid(仅可能在前台),查找匹配的前缀,然后从其他字节中解析出数据。
    • 我上一条评论的另一种选择是使用 Web 服务进行此数据传输。发送器将数据发布到服务器,然后接收器将从服务器读取此数据。它将使用网络但不使用蓝牙。
    【解决方案2】:

    如果您想作为 iBeacon 进行广告宣传,使用CLBeaconRegionperipheralDataWithMeasuredPower 方法会更容易且不易出错,该方法会自动为您生成适当的广告数据。示例代码sn-p如下:

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

    【讨论】:

    • 我认为你误解了我想要做什么。我需要将一些信息通告回信标。当它进入信标区域时,客户端电话开始宣传此信息,并且信标(在本例中为 iPad)扫描具有此处宣传的服务的外围设备,并需要读取我尝试宣传的服务数据。
    • 啊,对不起,你没有准确解释你想要做什么,所以我做了一些假设。请记住 David 的说明,您不能通过外设管理器宣传服务数据,也许您可​​以查看 Multipeer Connectivity Framework,以在 iPhone 和 iPad 之间交换数据。马特·汤普森(Mattt Thompson)有一个很棒的向导,他总是这样做的:nshipster.com/multipeer-connectivity
    • 我会看看谢谢。您可以宣传自定义服务但不能宣传自定义服务数据,这对我来说似乎很荒谬。我猜他们不希望这样使用广告。
    猜你喜欢
    • 2014-03-20
    • 2017-01-30
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多