導(dǎo)讀
要實(shí)現(xiàn)地圖、導(dǎo)航功能,往往需要先熟悉定位功能蒜撮,在iOS中通過Core Location
框架進(jìn)行定位操作。Core Location
自身可以單獨(dú)使用,和地圖開發(fā)框架MapKit完全是獨(dú)立的段磨,但是往往地圖開發(fā)要配合定位框架使用取逾。在Core Location
中主要包含了定位、地理編碼(包括反編碼)功能苹支。
定位是一個(gè)很常用的功能砾隅,如一些地圖軟件打開之后如果用戶允許軟件定位的話,那么打開軟件后就會(huì)自動(dòng)鎖定到當(dāng)前位置债蜜,如果用戶手機(jī)移動(dòng)那么當(dāng)前位置也會(huì)跟隨著變化晴埂。要實(shí)現(xiàn)這個(gè)功能需要使用Core Loaction
中CLLocationManager
類
一、導(dǎo)入CoreLocation框架
CoreLocation.framework
二寻定、在Info.plist中配置定位描述字段
不設(shè)置定位描述字段儒洛,將不能調(diào)起定位授權(quán)彈窗。
如果只要求應(yīng)用使用時(shí)定位(前臺(tái)中接受到定位信息)狼速,則需要配置NSLocationWhenInUseUsageDescription
晶丘。
如果要求應(yīng)用一直使用定位(前后臺(tái)接受到定位信息),則需要配置
NSLocationAlwaysUsageDescription
唐含。三浅浮、授權(quán)請求
-
iOS8.0之后,iOS9.0之前
//前臺(tái)權(quán)限請求
- (void)requestWhenInUseAuthorization;
//前后臺(tái)權(quán)限請求
- (void)requestAlwaysAuthorization;
前臺(tái)定位開啟的方式:
在Info.plist中配置KEY(NSLocationWhenInUseUsageDescription)捷枯,并請求權(quán)限
[_locationManager requestWhenInUseAuthorization];
前后臺(tái)定位開啟的方式:
(1) 如果是前臺(tái)定位權(quán)限滚秩,但是開始了后臺(tái)模式,在后臺(tái)也是可以定位的淮捆,但是屏幕的上邊會(huì)有藍(lán)條郁油,提示用戶是哪個(gè)應(yīng)用在定位
如果沒有出現(xiàn)上述現(xiàn)象,可能是模擬器或手機(jī)的版本為iOS9.0以上攀痊。
(2) 請求前后臺(tái)定位授權(quán),并在info.plist文件中配置KEY( NSLocationAlwaysUsageDescription)
不需要勾選后臺(tái)模式,也可以進(jìn)行后臺(tái)定位桐腌;此時(shí)授權(quán)狀態(tài)如果是前后臺(tái)定位, 那么即使APP退到后臺(tái)時(shí), 屏幕頂部也不會(huì)出現(xiàn)藍(lán)條。 -
iOS9.0
前臺(tái)定位開啟的方式:
(同iOS8.0之后一致, 無任何變化, 都需要主動(dòng)請求授權(quán))
前后臺(tái)定位開啟的方式:
(1)在前臺(tái)定位基礎(chǔ)上, 勾選后臺(tái)模式Location updates, 并且設(shè)置以下屬性為YES
if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
_locationManager.allowsBackgroundLocationUpdates = YES;
}
如果程序后臺(tái)苟径,會(huì)出現(xiàn)藍(lán)條
注意事項(xiàng):
如果只是配置了上述代碼案站,而未勾選后臺(tái)模式,會(huì)出現(xiàn)下面的報(bào)錯(cuò)
reason: 'Invalid parameter not satisfying: !stayUp || CLClientIsBackgroundable(internal->fClient)'
如果勾選了后臺(tái)模式棘街,而info.plist中未包含下圖的key也會(huì)出現(xiàn)上述問題
(2)請求前后臺(tái)定位授權(quán),并在info.plist文件中配置KEY (NSLocationAlwaysUsageDescription
)
[_locationManager requestAlwaysAuthorization];//前后臺(tái)蟆盐,這種方式的后臺(tái)不會(huì)出現(xiàn)藍(lán)條
四、iOS9.0出現(xiàn)新的Api
單次定位
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
[self.locationManager requestLocation];
}
單次定位邏輯
* 按照定位精確度從低到高進(jìn)行排序遭殉,逐個(gè)進(jìn)行定位.如果在有效時(shí)間內(nèi), 定位到了精確度最好的位置, 那么就把對應(yīng)的位置通過代理告知外界.
* 如果獲取到的位置不是精確度最高的那個(gè)石挂,也會(huì)在定位超時(shí)后,通過代理告訴外界.
* 如果沒有位置可以確定,會(huì)調(diào)用-locationManager:didFailWithError:
代理方法
注意事項(xiàng):
* 必須實(shí)現(xiàn)代理的-locationManager:didFailWithError:
方法
* 該方法不能與startUpdatingLocation
或allowDeferredLocationUpdates
同時(shí)使用险污,否則會(huì)取消單次定位功能
* 單次定位在模擬器上測試不出效果?
因?yàn)槟M器的位置是固定的, 所以無法測試出效果,請使用真機(jī)進(jìn)行測試.
五痹愚、經(jīng)驗(yàn)總結(jié)
- 定位的應(yīng)用場景
1) 導(dǎo)航
2) 電商APP,獲取用戶所在城市(需要與(反)地理編碼聯(lián)合使用)
3) 數(shù)據(jù)采集用戶信息(例如,統(tǒng)計(jì)app使用分布)
4) 查找周邊(周邊好友,周邊商家等等)
- 開發(fā)經(jīng)驗(yàn)
由于定位非常耗電; 所以為了給用戶省電,你可以遵守以下小經(jīng)驗(yàn)
1)不需要獲取用戶位置時(shí),一定要關(guān)閉定位服務(wù):
2)如果能滿足項(xiàng)目需求,盡可能的使用”監(jiān)聽顯著位置變化”的定位服務(wù)(打車app)
3)如果可以,盡可能使用低精度的desiredAccuracy
4)如果是數(shù)據(jù)采集,(一般都是周期性的去輪詢用戶位置),在輪詢期間一定要關(guān)閉定位