У меня странная ошибка при попытке рекламировать некоторые данные службы.Ошибка объявления CoreBluetooth
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? Причина, по которой я не могу использовать маяк, заключается в том, что я хочу отправить определенную информацию, в этом случае имя пользователя и основное и второстепенное значение маяка, на которое я отвечаю (если в регионе есть другие маяки, которые могут видеть ответ). –
Да, это обычный вариант использования. К сожалению, iOS немного ограничивает вас при использовании устройства для передачи рекламы Bluetooth. Вы можете рекламировать UUID службы (но только без прикрепленных данных). Поскольку длинный служебный UUID составляет 16 байт, вы можете использовать некоторые из этих байтов в качестве совпадающего префикса, а остальные - для кодирования идентификатора пользователя и другой информации. Получающему устройству придется сканировать все служебные uuids (возможно только на переднем плане), искать соответствующий префикс, а затем анализировать данные из других байтов. – davidgyoung
Еще одна альтернатива моему последнему комментарию - сделать эту передачу данных с помощью веб-службы. Передатчик отправляет данные на сервер, затем получатель будет считывать эти данные с сервера. Он будет использовать сеть, но не bluetooth. – davidgyoung