Предложить пользователю разрешить службы определения местоположения после отказа без сбоев

Проблема, с которой я сталкиваюсь, заключается в том, что когда я нажимаю кнопку UIButton, для инициирования действия требуются службы определения местоположения. Однако, если пользователь запретит службы определения местоположения при первоначальном запуске приложения, произойдет сбой приложения.

Я пытался найти способ реализовать CLAuthorizationStatus .Denied, но не могу найти способ сделать это. Единственный код, который я могу реализовать, - это didChangeAuthorizationStatus, который инициирует запрос только при первом запуске приложения.

func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus)
{
    if status == .AuthorizedAlways || status == .AuthorizedWhenInUse
    {
        manager.startUpdatingLocation()
    }
    else
    {
        manager.requestWhenInUseAuthorization()
    }
}

Если я нажму кнопку UIButton, чтобы отправить запрос API, приложение выйдет из строя, если службы определения местоположения были отклонены.

Мой вопрос заключается в том, как я могу реализовать метод в IBAction кнопки, который будет направлять пользователя к своим настройкам и включать службы определения местоположения. :)


person lifewithelliott    schedule 17.04.2016    source источник
comment
Какую именно проблему вы пытаетесь решить?   -  person nhgrif    schedule 18.04.2016
comment
Если разрешение на использование служб определения местоположения отклонено и нажата кнопка -› представляет предупреждение о том, что местоположение пользователя требуется для использования приложения, и перенаправляет пользователя к настройкам для его изменения.   -  person lifewithelliott    schedule 18.04.2016
comment
А что произошло, когда вы попробовали else if status == .Denied?   -  person nhgrif    schedule 18.04.2016
comment
Когда я попробовал if status == .Denied, на самом деле ничего не изменилось, и он никогда не представлял контроллер, который я пытался поместить в скобки. этот метод появится, когда приложение изначально установлено и запускается самостоятельно. Я не уверен, как и даже смогу ли я создать экземпляр CLAuthorizationStatus в методе кнопки IBAction.   -  person lifewithelliott    schedule 18.04.2016
comment
Я пробовал в IBAction - пусть статус: статус CLAuthorization и реализует оператор переключения, чтобы попытаться переключить статус { case .Denied ....etc... но не нашел удачи в этом подходе   -  person lifewithelliott    schedule 18.04.2016


Ответы (1)


CLLocationManager имеет статическую функцию authorizationStatus(), которую можно использовать для получения текущего статуса авторизации даже без инициализации объекта CLLocationManager.

Таким образом, в функции, которую вы вызываете, когда пользователь нажимает кнопку, вы можете проверить статус авторизации и действовать соответствующим образом:

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    lazy var locationManager = CLLocationManager()

    ...

    func didPressButton(sender: UIButton) {
        switch CLLocationManager.authorizationStatus() {
        case .AuthorizedAlways, .AuthorizedWhenInUse:
            locationManager.delegate = self
            locationManager.startUpdatingLocation()
        case .NotDetermined:
            locationManager.delegate = self
            locationManager.requestWhenInUseAuthorization()
        case .Denied:
            print("Show Alert with link to settings")
        case .Restricted:
            // Nothing you can do, app cannot use location services
            break
        }
    }

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        if status == .AuthorizedWhenInUse {
            manager.startUpdatingLocation()
        }
    }
}
person joern    schedule 19.04.2016
comment
Фантастический! Я очень ценю это!! :) - person lifewithelliott; 20.04.2016