提示用户在被拒绝后允许位置服务而不会崩溃

时间:2016-04-17 22:54:57

标签: ios swift core-location cllocationmanager location-services

我面临的问题是,当我按下UIButton时 - 需要位置服务来启动操作。但是,如果用户在应用程序首次启动时拒绝定位服务 - 应用程序将崩溃。

我试过找到一种方法来实现CLAuthorizationStatus .Denied但我似乎无法找到一种方法。我似乎可以实现的唯一代码是didChangeAuthorizationStatus,它只在首次启动应用程序时启动请求。

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

如果按UIButton发送API请求,如果位置服务被拒绝,应用程序将崩溃。

我的问题是如何在按钮的IBAction中实现一种方法,该方法将引导用户转到他们的设置并启用位置服务。 :)

1 个答案:

答案 0 :(得分:5)

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()
        }
    }
}