尝试宣传某些服务数据时发生了一个奇怪的错误。
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)
}
}
我已经尝试了每一个键/值对来查看它是否是特定的一个,但任何组合中的任何一个都会导致错误发生。
有人有任何想法吗?
感谢您的帮助。
答案 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)