2015-06-19 2 views
9

Я пытаюсь реализовать базовое представление карты и добавить текущее местоположение пользователя к карте в качестве аннотации. Я добавил ключ request.heninuse к моему info.plist и импортировал coreLocation.Обработка разрешений на доступ мгновенно в swift

В сделал метод загрузки с моей точки зрения контроллера, у меня есть следующие:

locManager.requestWhenInUseAuthorization() 
var currentLocation : CLLocation 

if(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.AuthorizedWhenInUse){ 

    currentLocation = locManager.location 
    println("currentLocation is \(currentLocation)")  
} 
else{ 
    println("not getting location") 
    // a default pin 
} 

я получаю оперативную повторно. разрешение на получение местоположения. Поскольку это происходит, я получаю сообщение о том, что не получаю местоположение, очевидно, потому что это выполняется до того, как пользователь получит возможность нажать «ОК». Если я вернусь к приложению и вернусь, я смогу найти место и добавить его на карту. Тем не менее, я хочу, чтобы пользователь впервые нажал OK, чтобы иметь возможность захватить текущее местоположение и добавить его на карту там и тогда. Как я могу это достичь? У меня есть следующий метод добавления булавки:

func addPin(location2D: CLLocationCoordinate2D){ 
    self.mapView.delegate = self 
    var newPoint = MKPointAnnotation() 
    newPoint.coordinate = location2D 
    self.mapView.addAnnotation(newPoint) 
} 

ответ

22

Для того, чтобы сделать это, вам нужно реализовать метод didChangeAuthorizationStatus для вашего местоположения менеджера делегата, который называется вскоре после CLLocationManager инициализации.

Во-первых, в верхней части файла не забудьте добавить: import CoreLocation

Чтобы сделать это, в классе, где вы используете местоположение, добавить протокол делегата. Тогда в viewDidLoad методе (или applicationDidFinishLaunching, если вы находитесь в AppDelegate) инициализировать менеджер местоположения и установить его delegate свойство self:

class myCoolClass: CLLocationManagerDelegate { 
    var locManager: CLLocationManager! 

    override func viewDidLoad() { 
     locManager = CLLocationManager() 
     locManager.delegate = self 
    } 
} 

Наконец, реализовать locationManager (_ didChangeAuthorizationStatus _) метод в теле вашего класс, который вы объявили ранее, этот метод будет вызываться, когда статус авторизации будет изменен, так как ваш пользователь нажал кнопку. Вы можете реализовать это следующим образом:

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    switch status { 
    case .NotDetermined: 
     // If status has not yet been determied, ask for authorization 
     manager.requestWhenInUseAuthorization() 
     break 
    case .AuthorizedWhenInUse: 
     // If authorized when in use 
     manager.startUpdatingLocation() 
     break 
    case .AuthorizedAlways: 
     // If always authorized 
     manager.startUpdatingLocation() 
     break 
    case .Restricted: 
     // If restricted by e.g. parental controls. User can't enable Location Services 
     break 
    case .Denied: 
     // If user denied your app access to Location Services, but can grant access from Settings.app 
     break 
    default: 
     break 
    } 
} 

Swift 4 - Новый синтаксис перечисления

Для Swift 4, просто включите первую букву каждого случая перечисления в нижний регистр (.notDetermined, .authorizedWhenInUse, .authorizedAlways , .restricted and .denied)

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

+0

Спасибо за ответ. Строка locManger.delegate = self дает мне ошибку «ожидаемая декларация» – user2363025

+0

@ user2363025 вы можете уточнить? Нажмите на ошибку, и она должна рассказать вам больше –

+0

Вот и все ошибки. Никакая дополнительная информация не появляется при наведении указателя мыши. Я видел здесь http://stackoverflow.com/questions/24121761/how-to-use-corelocation-with-swift, что, возможно, я должен определить locManager в appdelegate? Я также получаю ошибки в каждом случае оператора switch, говоря, что каждый из методов не может быть вызван без аргументов, был ли я определен locManager в appdelegate или в контроллере просмотра – user2363025

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