今天總結(jié)下iOS開發(fā)中定位權(quán)限那些坑。順便吐槽下我們的產(chǎn)品經(jīng)理事扭。
這里不講定位功能怎么實(shí)現(xiàn)捎稚,反正這些東西一搜一堆,懶得搜我這里貼上一個(gè)很全的實(shí)現(xiàn)文章:iOS】7.4 定位服務(wù)->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)包括這位簡書作者其他定位相關(guān)文章求橄,都很詳細(xì)今野。
接下來進(jìn)入重點(diǎn),我們都知道iOS定位權(quán)限自從iOS8之后就改動很多罐农,出于對用戶隱私方面來說条霜,如果要調(diào)用GPS模塊,就必須經(jīng)過用戶確定涵亏,體現(xiàn)在應(yīng)用彈窗讓用戶選擇宰睡。所以你要在info.plist里面加兩個(gè)字段:NSLocationWhenInUseUsageDescription (使用應(yīng)用期間)或NSLocationAlwaysUsageDescription(始終)蒲凶,以申請定位權(quán)限。
那么當(dāng)我們允許應(yīng)用使用GPS獲取位置信息之后拆内,我們在設(shè)置-隱私-定位服務(wù) 找到自己的應(yīng)用點(diǎn)進(jìn)去可以看到如下
有三個(gè)選項(xiàng):1旋圆、永不 2、使用應(yīng)用期間 3麸恍、始終灵巧。
當(dāng)然,有的情況下只有兩個(gè)選擇:(1抹沪、永不 2刻肄、使用應(yīng)用期間)(info.plist只設(shè)置了NSLocationWhenInUseUsageDescription) 或者(1、永不 2融欧、始終)(info.plist只設(shè)置了NSLocationAlwaysUsageDescription) 肄方。
顧名思義永不對應(yīng)著不給定位權(quán)限,使用期間就是應(yīng)用在前臺運(yùn)行狀態(tài)蹬癌,始終就包括應(yīng)用在后臺也能獲取定位信息权她。
有些應(yīng)用需求需要應(yīng)用一直獲取定位信息,比如騎車逝薪、跑步隅要、導(dǎo)航這一類應(yīng)用,如果要實(shí)現(xiàn)后臺定位董济,同時(shí)必須打開這個(gè)設(shè)置才能在后臺獲取位置信息步清。
這里要重點(diǎn)是說明一點(diǎn),開啟了后臺定位的情況下虏肾,如果定位權(quán)限是處于使用應(yīng)用期間的話廓啊,應(yīng)用進(jìn)入后臺,桌面頂部位置會出現(xiàn)藍(lán)色提醒條封豪,提醒你什么應(yīng)用在使用定位谴轮。
思路到這里,感覺好像前面扯多了吹埠,還是直接進(jìn)入我們的產(chǎn)品需求重點(diǎn)第步。
我們產(chǎn)品是運(yùn)動類,騎車記錄軌跡的缘琅。一直以后都是在后臺定位粘都,兩個(gè)權(quán)限都有添加上,定位權(quán)限默認(rèn)是勾選始終刷袍。當(dāng)然在桌面上不會出現(xiàn)定位藍(lán)條翩隧。本來挺好的,出現(xiàn)藍(lán)條占位置還更讓人反感呻纹,網(wǎng)上都是一堆在詢問如何不顯示藍(lán)條的堆生,我們產(chǎn)品倒好专缠,這一版需要出現(xiàn)藍(lán)條,說是我們應(yīng)用在后臺定位沒有什么提示顽频,有時(shí)候用戶騎車定位藤肢,然后忘了結(jié)束騎行缺不知道,倒是定位軌跡路線很亂糯景。從這一點(diǎn)出發(fā)倒是可取嘁圈。于是想要默認(rèn)勾選使用應(yīng)用期間。
產(chǎn)品說什么事什么蟀淮,趕緊改最住。由于我們用的是高德地圖跟高德定位,高德定位的API只有
讓我死活搞了半天怠惶,到處找資料涨缚,還是沒搞定定位權(quán)限默認(rèn)選擇使用應(yīng)用期間,但是看到有個(gè)應(yīng)用可以策治,那一定可以脓魏。
最后看到一些關(guān)于定位權(quán)限的描述是這樣的:
requestWhenInUseAuthorization跟requestAlwaysAuthorization的執(zhí)行順序有影響,requestAlwaysAuthorization的權(quán)限大于(包括)requestWhenInUseAuthorization通惫,于是我應(yīng)該是執(zhí)行順序問題茂翔,應(yīng)該先執(zhí)行requestWhenInUseAuthorization在執(zhí)行requestAlwaysAuthorization。果然在demo里面搞定了履腋。
但是在項(xiàng)目遲疑了下珊燎,因?yàn)橛玫氖歉叩露ㄎ唬?strong>.h沒有提供CLLocationManager屬性遵湖。悔政。。
于是想著是不是先自己創(chuàng)建一個(gè)官方的CLLocationManager獲取權(quán)限:
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];
}
果然可以了延旧,這下應(yīng)用安裝獲取權(quán)限默認(rèn)選中的就是使用應(yīng)用期間谋国,也相應(yīng)的開啟定位之后,在后臺的時(shí)候垄潮,桌面上有藍(lán)條提醒烹卒。