1. 程式人生 > >iOS Swift 判斷應用定位許可權

iOS Swift 判斷應用定位許可權

 最近做到地圖定位的東西,在搜尋應用定位許可權判斷的這一塊兒的時候搜到了許多答案,現在把自己的一些理解說一下,有錯誤請大家指正。
iOS的應用定位許可權有種狀態  1   .NotDetermined 表示使用者還未對該應用的定位許可權做出選擇,但是一般如果用到定位,一進入app的時候就會自動彈出提示框要使用者選擇啟用或者禁止,這個狀態應該說進入程式後就不存在了 2  .Restricted 表示GPS功能受限於某些限制,無法使用定位服務,例如 parental controls(這裡沒想到該狀態的應用場景)該狀態使用者無法改變     3  .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)
        }