Swift: всплывающее окно разрешения местоположения продолжает закрываться

При попытке получить долготу и широту пользователей в Swift я столкнулся с проблемой. У меня есть кнопка, которая запускает функцию для получения координат пользователя, при первом нажатии она должна запрашивать разрешение на предоставление приложению вашего местоположения. Но проблема, с которой я сталкиваюсь, заключается в том, что это всплывающее окно автоматически закрывается сразу после того, как я нажимаю кнопку «Получить местоположение».

Вот что происходит: http://imgur.com/a/0wdnm

Вот мой код:

class location: NSObject, CLLocationManagerDelegate {
var locationManager = CLLocationManager()

internal func getLocation() {
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest

    if CLLocationManager.authorizationStatus() == .AuthorizedAlways {
        locationManager.startUpdatingLocation()
    } else if CLLocationManager.authorizationStatus() == .NotDetermined {
        locationManager.requestAlwaysAuthorization()
    } else if CLLocationManager.authorizationStatus() == .Denied {
        print("User denied location permissions.")
    }
}


// MARK : CLLocationManagerDelegate protocol
@objc
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let location: CLLocationCoordinate2D = (locationManager.location?.coordinate)!
    print(location.latitude)
    print(location.longitude)
    }
}

person Danny M    schedule 10.07.2016    source источник
comment
Пожалуйста, покажите код, в котором вы выделяете свой экземпляр класса location. Похоже, что он выпускается, когда он должен оставаться на время вашего приложения. Вы должны подумать о том, чтобы сделать его синглтоном   -  person Paulw11    schedule 10.07.2016


Ответы (2)


Вот код, который работает для меня. Некоторые вещи, на которые следует обратить внимание:

  1. Создавайте CLLocationManager только тогда, когда вам действительно нужно его использовать. Если пользователь не включил CoreLocation, он получит предупреждение при создании диспетчера местоположений, что может произойти при запуске вашего приложения (что может быть, а может и не быть тем, что вы хотите).
  2. requestAlwaysAuthorization требуется запись [NSLocationAlwaysUsageDescription][1] в Info.plist.
  3. Соблюдайте locationManager:didChangeAuthorizationStatus: и остановите диспетчер местоположений, если службы станут недоступны.

Код:

import UIKit
import CoreLocation

class LocationViewController: UIViewController, CLLocationManagerDelegate {

    var locationManager: CLLocationManager?

    internal func getLocation() {

        if locationManager == nil {

            locationManager = CLLocationManager()
            locationManager?.delegate = self
            locationManager?.desiredAccuracy = kCLLocationAccuracyBest
        }

        if CLLocationManager.authorizationStatus() == .AuthorizedAlways {
            locationManager?.startUpdatingLocation()
        } else if CLLocationManager.authorizationStatus() == .NotDetermined {
            locationManager?.requestAlwaysAuthorization()
        } else if CLLocationManager.authorizationStatus() == .Denied {
            print("User denied location permissions.")
        }
    }


    // MARK : CLLocationManagerDelegate protocol

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {

        switch status {

        case .AuthorizedAlways, .AuthorizedWhenInUse:
            locationManager?.startUpdatingLocation()

        default:
            locationManager?.stopUpdatingLocation()
        }
    }

    @objc func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        guard let location = locationManager?.location?.coordinate else {
            return
        }

        print(location.latitude)
        print(location.longitude)
    }
}

extension LocationViewController {

    @IBAction internal func buttonTapped(sender: AnyObject) {

        getLocation()
    }
}
person Luke Van In    schedule 10.07.2016
comment
Даже после того, как я попробовал ваш код, у меня все еще есть та же проблема. - person Danny M; 11.07.2016

когда появляется всплывающее окно разрешения местоположения, вы больше не должны получать доступ к местоположению. Вам просто нужно дождаться разрешения пользователя, чем продолжать использовать функции, связанные с местоположением.

person Ali Kıran    schedule 10.07.2016