2012年8月21日 星期二

判斷使用者是否開啟 GPS @ iOS

最近在寫一個結合 Server 和 GPS 的小 App 剛好有遇到這個問題,分享一下吧。

只要 App 會用到 GPS 的功能就會跳出一個視窗詢問使用者是否同意該 App 使用 GPS 的功能,如下圖。




那我在程式內要如何判斷使用者是點選"同意"還是"不同意"呢?換句話說就是要判斷該 App 揪~~竟~~能否使用 GPS 功能!

其實不難,但是要先了解 GPS 是否開啟其實有分兩個開關。 一是 GPS 總開關(Location Services),二是各別 App 是否開啟 GPS 功能(例如 Big Lens 就被我關掉,Camera則可以使用)。



要判斷總開關是否開啟很簡單,也最常使用,如下

[CLLocationManager locationServicesEnabled]


[CLLocationManager locationServicesEnabled] 會回傳一個 BOOL 值,YES就是開啟,NO就是關閉,沒啥好講的。

再來是要判斷各個 App 的 GPS 使用權,也正是此次遇到的問題。

其實 Apple 的官方文件裡也有寫,只是不知道為啥似乎很少人使用,Google 了一陣子才找到正解。官方文件

判斷各個 App 的 GPS Method 是

[CLLocationManager authorizationStatus]


[CLLocationManager authorizationStatus] 回的就不是 BOOL了,而是整數。定義如下

typedef enum {
    kCLAuthorizationStatusNotDetermined = 0,
    kCLAuthorizationStatusRestricted,        
    kCLAuthorizationStatusDenied,            
    kCLAuthorizationStatusAuthorized         
} CLAuthorizationStatus;


簡單說明一下各個代表的意義,官方文件都有詳細說明,有興趣的人請自行前往囉。

kCLAuthorizationStatusNotDetermined 表示使用者尚未選擇同意或不同意。

kCLAuthorizationStatusRestricted 代表GPS功能受限於某些限制,例如 parental controls(不懂這應該翻叫啥。。。)

kCLAuthorizationStatusDenied 代表使用者點選了不同意!

kCLAuthorizationStatusAuthorized 代表使用者點選同意 。


所以只要在我需要的地方打上

if ( [CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorized) {
    //you can not use GPS.
    //do something
}


就可判斷使用者有打開該 App 的 GPS 功能了,這麼簡單的東西也可以打這麼一大篇。。。






沒有留言:

張貼留言