iOS 9 [locationManager.requestWhenInUseAuthorization()] представление предупреждений быстро исчезает после появления
У меня настроено довольно простое приложение. Он использует контроллер навигации, а также контроллер вида, который я настроил в качестве контроллера вида карты.
Когда приложение запускается, оно запускается в Root View Controller, и оттуда у меня есть кнопка, настроенная для перехода к контроллеру view map и отображения карты. Когда это происходит, отображается предупреждение, но прежде чем я могу выбрать разрешить / не разрешить, оно исчезает и карта загружается.
Почему вид предупреждения исчезает сам по себе?
Я настроил файл info.plist соответственно, добавил необходимые фреймворки и добавил соответствующих делегатов.
Ниже приведен код, который я настроил:
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
@IBOutlet weak var map: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocation = locations[0]
let latitude = userLocation.coordinate.latitude
let longitude = userLocation.coordinate.longitude
let latDelta: CLLocationDegrees = 0.01
let lonDelta: CLLocationDegrees = 0.01
let coordinate: CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)
let span: MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)
let region: MKCoordinateRegion = MKCoordinateRegionMake(coordinate, span)
map.setRegion(region, animated: true)
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
print(error)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Любая помощь будет оценена! Заранее спасибо!
2 ответа
Объявите ваш locationManager ivar вне viewDidLoad. Он освобождается после завершения viewDidLoad, потому что ничто не имеет на него строгой ссылки. Вы, вероятно, также должны начать сканирование только после того, как ваш пользователь предоставил доступ.
var locationManager:CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
let authorizationStatus = CLLocationManager.authorizationStatus()
if (authorizationStatus == CLAuthorizationStatus.NotDetermined) {
locationManager.requestWhenInUseAuthorization()
} else if (authorizationStatus == CLAuthorizationStatus.AuthorizedWhenInUse) {
locationManager.startUpdatingLocation()
}
}
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
if (status == CLAuthorizationStatus.AuthorizedWhenInUse) {
locationManager.startUpdatingLocation()
}
}
Потому что ты делаешь это неправильно. Протокол CLLocationManagerDelegate имеет метод didChangeAuthorizationStatus. Вы должны проверить там, разрешил ли пользователь или нет приложение использовать местоположение. После проверки вы должны вызвать startUpdatingLocation. Обязательно выполняйте все обновления пользовательского интерфейса, требуемые этим кодом, с помощью dispatch_async и в главной очереди.