дидрангебиакон позвонил без каких-либо маяков.


Я зарегистрировал свой собственный менеджер местоположения для мониторинга и определения дальности действия нескольких маяков:

[self.locationManager startMonitoringForRegion:region];
[self.locationManager startRangingBeaconsInRegion:region];

В моем понимании, когда один или несколько маяков найдены, этот метод делегата называется:

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region

Этот метод делегата действительно вызывается, когда я включил свой маяк, но массив beacons пуст. Есть ли какая-то причина, почему мой маяк не указан в этом массиве?

Вот скриншот, иллюстрирующий эту ситуацию:

Введите описание изображения здесь


Другие вещи, чтобы Примечание:

  • я использовал MacBeacon для передачи сигнала моего маяка. Позже я попробую использовать настоящий маяк, но MacBeacon отлично работает для меня в iOS 7.
  • я пытался отложить ранжирование, пока не получу didEnterRegion: или didDetermineState: вызов, но это все равно приводит к тому же самому.
  • я запросил разрешение на местоположение у моего менеджера местоположения: [self.locationManager requestWhenInUseAuthorization];.
  • у меня есть очень похожий код, прекрасно работающий в Xcode 5/iOS 7 SDK. Это конкретный Xcode 6 / iOS 8 поведение?
  • я добавил ключ NSLocationWhenInUseUsageDescription в свой plist.
4 6

4 ответа:

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

Особая благодарностьнайосо за помощь в решении этой проблемы.

Попробуйте использовать приложениеLocate на устройстве iOS 8 и убедитесь, что вы видите Маяк. Убедитесь, что у вас на UUID Маяк настроен на найдите приложения правильно.

Если вы видите его на Locate, то я подозреваю, что проблема заключается в том, что разрешения не предоставляются должным образом для вашего приложения на iOS 8. В этом случае вы, вероятно, должны опубликовать фрагмент кода, показывающий вашу установку, где вы вызываете [self.locationManager requestWhenInUseAuthorization]; , а также включить раздел вашего файла plist, который должен иметь что-то например:

<key>NSLocationWhenInUseUsageDescription</key> <string>Need to use location services</string>

Вы должны сначала запустить мониторинг маяка также установить notifyEntryStateOnDisplay = YES

self.region1.notifyEntryStateOnDisplay = YES;
[theLocManager startMonitoringForRegion: region1];
[theLocManager startRangingBeaconsInRegion: region1];

Этот код отлично работает для меня и в iOS 8.

У меня действительно была эта проблема, когда я создавал свой CLBeaconRegion с мажором и минором в качестве аргументов. Если вы создаете область маяка с основными и второстепенными аргументами и не имеете никаких маяков с этими основными и второстепенными аргументами, список маяков будет пуст. В моем случае я хотел динамически определить мажор / минор. После того, как я инициализировать CLBeaconRegion с идентификатором UUID и все было хорошо.