2016-02-11 3 views
0

Ошибка:ошибка requestWhenInUseAuthorization только при первом запуске

Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.

Код:

class ViewController: UIViewController { 

    @IBOutlet weak var mapView: MKMapView! 
    var locationManager: CLLocationManager! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     locationManager = CLLocationManager() 
     locationManager.requestAlwaysAuthorization() 

     let currentLocationCoo = locationManager.location?.coordinate 
     if let locationCoo = currentLocationCoo{ 
      mapView.region = MKCoordinateRegionMake(CLLocationCoordinate2D(latitude: locationCoo.latitude, longitude: locationCoo.longitude), MKCoordinateSpan(latitudeDelta: 0.002, longitudeDelta: 0.002)) 
      print("location ni nil") 
     }else{ 


     mapView.region = MKCoordinateRegionMake(CLLocationCoordinate2D(latitude: 52.05695, longitude: 14.50575), MKCoordinateSpan(latitudeDelta: 0.002, longitudeDelta: 0.002)) 
     } 

     let defaultAnnotation = MKPointAnnotation() 
     defaultAnnotation.coordinate = mapView.region.center 
     defaultAnnotation.title="Center" 
     defaultAnnotation.subtitle="This is!" 
     mapView.addAnnotation(defaultAnnotation) 

     mapView.showsUserLocation=true 
     mapView.showsBuildings=true 
     mapView.userTrackingMode = .None 

    } 

я заметил, что IOS бросает ошибку только при первом запуске. Прежде чем я даже соглашусь на приглашение на поиск местоположения. При последующем запуске он отлично работает. Это потому, что первый контроллер представления, который запускает приложение, уже использует карты? Обходной путь, вероятно, НЕ должен прыгать непосредственно в карты, но сначала показать некоторые другие VC. Любое другое обходное решение?

ответ

1

Да, вы правы, mapView.showsUserLocation=true требует доступа к вашему текущему местоположению, и это невозможно без согласия на оповещение, отображаемое ОС. Вы можете реализовать метод didChangeAuthorizationStatusCLLocationManagerDelegate и иметь в нем код, связанный с вашей картой. Попробуйте следующий код.

class ViewController: UIViewController,CLLocationManagerDelegate { 

    @IBOutlet weak var mapView: MKMapView! 
    var locationManager: CLLocationManager! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     locationManager = CLLocationManager() 
     locationManager.delegate = self 
     locationManager.requestAlwaysAuthorization() 
    } 

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
     switch status { 
     case .AuthorizedWhenInUse: 
      updateMap() 
      break 
     case .AuthorizedAlways: 
      updateMap() 
      // write your map related code here 
      break 
     default: 
      break 
     } 
    } 

    func updateMap() { 
     let currentLocationCoo = locationManager.location?.coordinate 
     if let locationCoo = currentLocationCoo{ 
      mapView.region = MKCoordinateRegionMake(CLLocationCoordinate2D(latitude: locationCoo.latitude, longitude: locationCoo.longitude), MKCoordinateSpan(latitudeDelta: 0.002, longitudeDelta: 0.002)) 
      print("location ni nil") 
     }else{ 
      mapView.region = MKCoordinateRegionMake(CLLocationCoordinate2D(latitude: 52.05695, longitude: 14.50575), MKCoordinateSpan(latitudeDelta: 0.002, longitudeDelta: 0.002)) 
     } 

     let defaultAnnotation = MKPointAnnotation() 
     defaultAnnotation.coordinate = mapView.region.center 
     defaultAnnotation.title="Center" 
     defaultAnnotation.subtitle="This is!" 
     mapView.addAnnotation(defaultAnnotation) 

     mapView.showsUserLocation=true 
     mapView.showsBuildings=true 
     mapView.userTrackingMode = .None 
    } 
} 
+0

Да, это работает красиво. Спасибо, добрый сэр. – brumbrum

Смежные вопросы