2015-10-09 3 views
0

У меня странная ошибка при попытке рекламировать некоторые данные службы.Ошибка объявления 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) 
    } 
} 

Я попробовал каждую из пар ключ/значение, чтобы увидеть, если это конкретный один, но ни один из них в любой комбинации вызывает ошибку произойти.

У кого-нибудь есть идеи?

Благодарим за помощь.

ответ

2

К сожалению, CBAdvertisementDataServiceDataKey читается только прошивка. Хотя вы можете использовать его для чтения служебных данных при обнаружении периферийных устройств, вы не можете использовать его для передачи служебных данных с помощью CBPeriperalManager. См. Здесь для получения дополнительной информации: https://stackoverflow.com/a/31856456/1461050

Если вы хотите передать пакет iBeacon, вы можете использовать region.peripheralDataWithMeasuredPower(nil), как предлагает в своем ответе @heypiotr.

Для понимания обратите внимание, что рекламные объявления iBeacon являются рекламными объявлениями производителя, а не рекламными объявлениями. Таким образом, даже если показанная техника действительно работает, не было бы причин для заполнения CBAdvertisementDataServiceUUIDsKey, как показано в примере. Отправка рекламной рекламы не приведет к срабатыванию приемников iBeacon.

+0

Спасибо за ваш ответ Дэвид. Нужно ли вообще рекламировать определенное значение с устройства iOS? Причина, по которой я не могу использовать маяк, заключается в том, что я хочу отправить определенную информацию, в этом случае имя пользователя и основное и второстепенное значение маяка, на которое я отвечаю (если в регионе есть другие маяки, которые могут видеть ответ). –

+2

Да, это обычный вариант использования. К сожалению, iOS немного ограничивает вас при использовании устройства для передачи рекламы Bluetooth. Вы можете рекламировать UUID службы (но только без прикрепленных данных). Поскольку длинный служебный UUID составляет 16 байт, вы можете использовать некоторые из этих байтов в качестве совпадающего префикса, а остальные - для кодирования идентификатора пользователя и другой информации. Получающему устройству придется сканировать все служебные uuids (возможно только на переднем плане), искать соответствующий префикс, а затем анализировать данные из других байтов. – davidgyoung

+1

Еще одна альтернатива моему последнему комментарию - сделать эту передачу данных с помощью веб-службы. Передатчик отправляет данные на сервер, затем получатель будет считывать эти данные с сервера. Он будет использовать сеть, но не bluetooth. – davidgyoung

0

Если вы хотите рекламировать как iBeacon, проще и дешевле использовать метод CLBeaconRegionperipheralDataWithMeasuredPower, который автоматически генерирует вам соответствующие рекламные данные. Пример код ниже:

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

Я думаю, вы неправильно понимаете, что я пытаюсь сделать. Мне нужно рекламировать некоторую информацию обратно к маяку. Когда он входит в зону маяка, клиентский телефон начинает рекламировать эту информацию, а маяк (в данном случае iPad) сканирует периферийные устройства с рекламируемыми здесь услугами и должен прочитать данные службы, которые я пытаюсь рекламировать. –

+1

А, извините, вы точно не объяснили, что вы пытаетесь сделать, поэтому я сделал некоторые предположения.Помня о том, что Дэвид отмечает, что вы не можете рекламировать данные службы через периферийного менеджера, возможно, вы могли бы взглянуть на структуру Multipeer Connectivity Framework, чтобы обмениваться данными между iPhone и iPad. У Mattt Thompson есть отличный гид, как он всегда делает: http://nshipster.com/multipeer-connectivity/ – heypiotr

+0

Я посмотрю спасибо. Мне кажется смешным, что вы можете рекламировать настраиваемые сервисы, но не пользовательские данные службы. Я думаю, они не хотят, чтобы рекламные объявления использовались так. –

Смежные вопросы