今天總結下iOS開發中定位權限那些坑。順便吐槽下我們的產品經理。
這里不講定位功能怎么實現,反正這些東西一搜一堆,懶得搜我這里貼上一個很全的實現文章:iOS】7.4 定位服務->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)包括這位簡書作者其他定位相關文章,都很詳細。
接下來進入重點,我們都知道iOS定位權限自從iOS8之后就改動很多,出于對用戶隱私方面來說,如果要調用GPS模塊,就必須經過用戶確定,體現在應用彈窗讓用戶選擇。所以你要在info.plist里面加兩個字段:NSLocationWhenInUseUsageDescription (使用應用期間)或NSLocationAlwaysUsageDescription(始終),以申請定位權限。
那么當我們允許應用使用GPS獲取位置信息之后,我們在設置-隱私-定位服務 找到自己的應用點進去可以看到如下
有三個選項:1、永不 2、使用應用期間 3、始終。
當然,有的情況下只有兩個選擇:(1、永不 2、使用應用期間)(info.plist只設置了NSLocationWhenInUseUsageDescription) 或者(1、永不 2、始終)(info.plist只設置了NSLocationAlwaysUsageDescription) 。
顧名思義永不對應著不給定位權限,使用期間就是應用在前臺運行狀態,始終就包括應用在后臺也能獲取定位信息。
有些應用需求需要應用一直獲取定位信息,比如騎車、跑步、導航這一類應用,如果要實現后臺定位,同時必須打開這個設置才能在后臺獲取位置信息。
這里要重點是說明一點,開啟了后臺定位的情況下,如果定位權限是處于使用應用期間的話,應用進入后臺,桌面頂部位置會出現藍色提醒條,提醒你什么應用在使用定位。
思路到這里,感覺好像前面扯多了,還是直接進入我們的產品需求重點。
我們產品是運動類,騎車記錄軌跡的。一直以后都是在后臺定位,兩個權限都有添加上,定位權限默認是勾選始終。當然在桌面上不會出現定位藍條。本來挺好的,出現藍條占位置還更讓人反感,網上都是一堆在詢問如何不顯示藍條的,我們產品倒好,這一版需要出現藍條,說是我們應用在后臺定位沒有什么提示,有時候用戶騎車定位,然后忘了結束騎行缺不知道,倒是定位軌跡路線很亂。從這一點出發倒是可取。于是想要默認勾選使用應用期間。
產品說什么事什么,趕緊改。由于我們用的是高德地圖跟高德定位,高德定位的API只有
讓我死活搞了半天,到處找資料,還是沒搞定定位權限默認選擇使用應用期間,但是看到有個應用可以,那一定可以。
最后看到一些關于定位權限的描述是這樣的:
requestWhenInUseAuthorization跟requestAlwaysAuthorization的執行順序有影響,requestAlwaysAuthorization的權限大于(包括)requestWhenInUseAuthorization,于是我應該是執行順序問題,應該先執行requestWhenInUseAuthorization在執行requestAlwaysAuthorization。果然在demo里面搞定了。
但是在項目遲疑了下,因為用的是高德定位,它.h沒有提供CLLocationManager屬性。。。
于是想著是不是先自己創建一個官方的CLLocationManager獲取權限:
self.locationManager = [[CLLocationManager alloc]init];
self.locationManager.delegate = self;
[self.locationManager requestWhenInUseAuthorization];
[self.locationManager requestAlwaysAuthorization];
self.locationManager.distanceFilter = 500;
self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
self.locationManager.allowsBackgroundLocationUpdates = YES;
[self.locationManager requestLocation];
}
else {
[self.locationManager startUpdatingLocation];
}
果然可以了,這下應用安裝獲取權限默認選中的就是使用應用期間,也相應的開啟定位之后,在后臺的時候,桌面上有藍條提醒。