Функция делегата CLLocationManager 'didRangeBeacon' не находит маяки? - PullRequest
0 голосов
/ 20 октября 2018

Этот вопрос был задан здесь , но это не решает мою проблему, я объясню, почему это не решает проблему в конце вопроса.

Что я 'Для этого требуется 2 шага:

  1. Пусть CBCentralManager обнаружит периферию

  2. Пусть CLLocationManager прослушивает маяки, обнаруженные на шаге 1

Я узнал UUID моего маяка с помощью следующего метода делегата:

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) {
    print(peripheral.identifier)
}

Затем выполняется шаг 2:

if let uuid = UUID.init(uuidString: "<identifier found in step 1>") {
    locationManager.startRangingBeacons(in: .init(proximityUUID: uuid, identifier: UUID().uuidString))
}

Метод делегата моего locationManager просто печатает всемаяки в диапазоне:

func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
    print(beacons)
}

Но все, что я получаю, это пустой массив.Зачем?Как это исправить?

Приведенный выше вопрос предполагает, что при создании CLBeaconRegion мы должны дать уникальный идентификатор, который я уже делаю.

1 Ответ

0 голосов
/ 20 октября 2018

Проблема с этим утверждением:

Я узнал UUID моего маяка с помощью следующего метода делегата:

 func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) {
     print(peripheral.identifier)
 }

Значение, возвращаемое peripheral.identifier, не является значением proximityUUID вашего маяка. Из-за этого didRangeBeacons возвращает пустой массив, поскольку поблизости нет маяков с proxmityUUID, совпадающим сCLBeaconRegion Вы настроили.

Вот более глубокое объяснение:

Поле peripheral.identifier происходит от объекта CBPeripheral, который наследует его от CBPeer.Документация Apple здесь описывает это следующим образом:

Значение этого свойства представляет уникальный идентификатор партнера.В первый раз, когда локальный менеджер встречает однорангового узла, система назначает одноранговому узлу UUID, представленный новым объектом NSUUID.Пиры идентифицируются UUID идентификаторов NSUUID, а не объектами CBUUID, которые идентифицируют службы периферийного устройства, характеристики и дескрипторы характеристик.

По сути, это поле является временным идентификатором, назначенным устройству Bluetooth с помощьюIOS.Хотя он представлен NSUUID (как его называют в Objective C или просто UUID в Swift), а CLBeacon / CLBeaconRegion имеет поле proximityUUID, которое также является экземпляром NSUUID, это не одно и то же значение. Это распространенный источник путаницы.

К сожалению, невозможно использовать API-интерфейсы CoreBluetooth для получения ProximityUUID вашего маяка .Apple намеренно идет на все, чтобы помешать вам сделать это.К сожалению.

...