最近做到地图定位的东西,在搜索应用定位权限判断的这一块儿的时候搜到了许多答案,现在把自己的一些理解说一下,有错误请大家指正。
iOS的应用定位权限有种状态 


1   .NotDetermined 表示用户还未对该应用的定位权限做出选择,但是一般如果用到定位,一进入app的时候就会自动弹出提示框要用户选择启用或者禁止,这个状态应该说进入程序后就不存在了


2  .Restricted 表示GPS功能受限於某些限制,无法使用定位服务,例如 parental controls(这里没想到该状态的应用场景)该状态用户无法改变    


.Denied 表示用户拒绝该应用使用定位服务(也可能是定位服务总开关处于关闭状态,CLLocationManager.authorizationStatus()获取的是应用的授权状态,但是当定位服务总开关处于关闭状态的时候,所有应用的定位服务都为关闭状态 )   


4  .AuthorizedAlways(iOS 8.0) 表示用户授权该应用可永久使用定位权限    


5  .AuthorizedWhenInUse(iOS 8.0)


还有一个判断设备定位权限总开关的方法 CLLocationManager.locationServicesEnabled() 返回值是一个Bool类型,true为开启,false为关闭




理清了上面每种状态的意义,我们便可以根据当前的状态来判断当前应用的定位权限


思路:如果系统定位服务总开关为开启状态,直接判断应用的定位权限状态是否开启;如果系统的定位服务总开关关闭,则所有应用的定位权限为关闭状态(不存在说系统定位服务总开关为关闭状态,而某个应用服务的定位服务为开启状态),这样想来,我们对应用定位权限的判断时不需要以系统定位服务总开关的状态为前提的,我们只需要对应用的定位权限状态进行判断即可。


因为.NotDetermined为第一次进入的时候应用的状态,.Restricted状态无法更改,所以我们只要考虑后面3种状态就行,我们的判断可以写为,




 

if(CLLocationManager.authorizationStatus() != .Denied) {
            print("应用拥有定位权限")
        }else {
            let aleat = AlertController(title: "打开定位开关", message:"定位服务未开启,请进入系统设置>隐私>定位服务中打开开关,并允许xxx使用定位服务", preferredStyle: .Alert)
            let tempAction = UIAlertAction(title: "取消", style: .Cancel) { (action) in
            }
            let callAction = UIAlertAction(title: "立即设置", style: .Default) { (action) in
                let url = NSURL.init(string: UIApplicationOpenSettingsURLString)
                if(UIApplication.sharedApplication().canOpenURL(url!)) {
                    UIApplication.sharedApplication().openURL(url!)
                }
            }
            aleat.addAction(tempAction)
            aleat.addAction(callAction)
            self.presentViewController(aleat, animated: true, completion: nil)
        }