Код Swift2.3 для обнаружения маяка

Мы находимся на продвинутой стадии разработки приложения Swift 2.2 и поэтому решили временно перейти на 2.3, а позже выполнить полную миграцию Swift 3. Однако мы не можем заставить обнаружение маяка работать после преобразования в Swift 2.3. Метод didRangeBeacons продолжает возвращать пустой массив. Тот же код работал в Swift 2.2, поэтому мы знаем, что у нас есть все разрешения и т. д.

Кроме того, если мы откроем приложение «Locate» на том же iPad, наше приложение также начнет возвращать данные в «didRangeBeacons». Пробовали различные версии приложений, и все приложения Swift2.3 ведут себя одинаково. Не могу понять, что делает приложение Locate... Кто-нибудь на той же лодке??


Вот код, который мы используем. Не уверен, что это должно быть написано здесь или в комментариях, но я не мог как-то поместить код в комментарии...

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

let locationManager = CLLocationManager()
let region = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: "9735BF2A-0BD1-4877-9A4E-103127349E1D")!, identifier: "testing")
// Note: make sure you replace the keys here with your own beacons' Minor Values


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.locationManager.delegate = self
    self.locationManager.requestAlwaysAuthorization()
    self.locationManager.startMonitoringForRegion(self.region)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func locationManager(manager: CLLocationManager, didStartMonitoringForRegion region: CLRegion) {
    print("didStartMonitoringForRegion")
    self.locationManager.requestStateForRegion(region)
}

func locationManager(manager: CLLocationManager, monitoringDidFailForRegion region: CLRegion?, withError error: NSError) {
    print("monitoringDidFailForRegion")
}

func locationManager(manager: CLLocationManager, didDetermineState state: CLRegionState, forRegion region: CLRegion) {
    print("didDetermineState")
    if state == .Inside {
        //Start Ranging
        self.locationManager.startRangingBeaconsInRegion(self.region)
        self.locationManager.startUpdatingLocation()
    }
    else {
        //Stop Ranging here
        self.locationManager.stopUpdatingLocation()
        self.locationManager.stopRangingBeaconsInRegion(self.region)
    }
}

func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
    print(beacons.count)
}

}

[Обновить опубликуйте еще несколько попыток заставить это работать] Приложение работает в режиме переднего плана, если мы удалим self.locationManager.startMonitoringForRegion(self.region) и вызовем self.locationManager.startRangingBeaconsInRegion(self.region) сразу после self.locationManager.requestAlwaysAuthorization()

Это неоптимально, потому что мы не получаем входные и выходные события или состояние, но, по крайней мере, мы получаем количество маяков.


person Anshulee    schedule 22.09.2016    source источник
comment
Можете ли вы показать свой код, который устанавливает ранжирование? Эти симптомы проявляются как на переднем, так и на заднем плане или только на заднем плане?   -  person davidgyoung    schedule 22.09.2016
comment
Спасибо за ответ! Мы видим больше проблем в фоновом режиме. У нас есть «Конфиденциальность — описание использования местоположения всегда», установленное в Info.pList. Также были добавлены фоновые возможности. Счетчик маяков постоянно уведомляется как 0, когда он находится в фоновом режиме.   -  person Anshulee    schedule 22.09.2016
comment
Код указан ниже   -  person Anshulee    schedule 22.09.2016
comment
Я могу подтвердить проблему, но с iPhone 6S и iOS 10 проблем нет вообще.   -  person pascalbros    schedule 10.10.2016


Ответы (3)


Есть несколько неподтвержденных сообщений о проблемах с обнаружением маяков в iOS 10. Симптомы включают в себя:

  • Неправильные события выхода из области, особенно когда приложение находится в фоновом режиме, за которыми следуют события входа, если нажата кнопка плеча.
  • Периодические сбои при обнаружении маяков дальнего действия с обратными вызовами, предоставляющими пустой список маяков, когда маяки находятся поблизости.
  • Обратные вызовы маяка дальнего действия возвращают правильные результаты, когда запущено другое приложение определения местоположения или обнаружения маяка, предназначенное для iOS 9.x.

Предположительно, это ошибка, которая будет исправлена ​​в обновлении iOS. До тех пор некоторые пользователи сообщали, что установка цели развертывания приложения в XCode на 9.x решит проблему.

person davidgyoung    schedule 22.09.2016
comment
Спасибо, Дэвид. Попробую это завтра и вернусь к вам. - person Anshulee; 22.09.2016
comment
У iOS10 определенно есть проблема. У нас есть приложение Locate, работающее как на устройстве iOS 9, так и на устройстве iOS10, и устройство iOS10 периодически обнаруживает 0 маяков. Сигнал iOS 9 довольно сильный. 1. Мы удалили все фоновые режимы и использовали только авторизацию при использовании 2. Удалили все другие программы обнаружения маяков с устройства ios 10 3. Сброс настроек сети из «Настройки» -> «Общие» -> «Сброс». работает по крайней мере так же, как приложение Locate на iOS 10, но только в режиме переднего плана. Помогло следующее - person Anshulee; 23.09.2016
comment
Установка цели развертывания на 9.x не решила проблему. Кроме того, даже когда мы находимся на переднем плане, мы можем использовать startMonitoringForRegion, который нам нужен, потому что мы хотим отслеживать события выхода и входа. Вызов startrangingbeaconsinregion из didDeterminState, где state=Inside has приводит к обнаружению маяка = 0. Если мы вызываем startrangingbeaconsinregion независимо, как в приведенном выше коде, это работает.. - person Anshulee; 23.09.2016
comment
У меня меньше проблем с iBeacon после установки 10.0.3 (14A551) - person Philip Jespersen; 23.10.2016

Попробуйте создать менеджер местоположений после загрузки представления. Другими словами, изменить:

let locationManager = CLLocationManager()

to

let locationManager : CLLocationManager!

А затем добавьте это к viewDidLoad:

locationManager = CLLocationManager()

Я видел странное поведение с LocationManager, созданным при инициализации UIViewController.

person davidgyoung    schedule 23.09.2016

Пока я тестировал ранжирование маяков, я загрузил несколько приложений, которые забыл удалить. После удаления всех приложений, связанных с маяками, и повторной установки только необходимых приложений я смог заставить работать маяки дальности.

person Pierre Yao    schedule 11.02.2017