Мы находимся на продвинутой стадии разработки приложения 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()
Это неоптимально, потому что мы не получаем входные и выходные события или состояние, но, по крайней мере, мы получаем количество маяков.