要實(shí)現(xiàn)地圖、導(dǎo)航功能,往往需要先熟悉定位功能觅丰,在iOS中通過(guò)Core Location框架進(jìn)行定位操作。Core Location自身可以單獨(dú)使用妨退,和地圖開(kāi)發(fā)框架MapKit完全是獨(dú)立的妇萄,但是往往地圖開(kāi)發(fā)要配合定位框架使用。在Core Location中主要包含了定位咬荷、地理編碼(包括反編碼)功能冠句。
定位功能
定位是一個(gè)很常用的功能,如一些地圖軟件打開(kāi)之后如果用戶允許軟件定位的話幸乒,那么打開(kāi)軟件后就會(huì)自動(dòng)鎖定到當(dāng)前位置懦底,如果用戶手機(jī)移動(dòng)那么當(dāng)前位置也會(huì)跟隨著變化。要實(shí)現(xiàn)這個(gè)功能需要使用Core Loaction中CLLocationManager類逝变,首先看一下這個(gè)類的一些主要方法和屬性:
類方法 說(shuō)明
+ (BOOL)locationServicesEnabled; 是否啟用定位服務(wù)基茵,通常如果用戶沒(méi)有啟用定位服務(wù)可以提示用戶打開(kāi)定位服務(wù)
+ (CLAuthorizationStatus)authorizationStatus; 定位服務(wù)授權(quán)狀態(tài),返回枚舉類型:
kCLAuthorizationStatusNotDetermined: 用戶尚未做出決定是否啟用定位服務(wù)
kCLAuthorizationStatusRestricted: 沒(méi)有獲得用戶授權(quán)使用定位服務(wù),可能用戶沒(méi)有自己禁止訪問(wèn)授權(quán)
kCLAuthorizationStatusDenied :用戶已經(jīng)明確禁止應(yīng)用使用定位服務(wù)或者當(dāng)前系統(tǒng)定位服務(wù)處于關(guān)閉狀態(tài)
kCLAuthorizationStatusAuthorizedAlways: 應(yīng)用獲得授權(quán)可以一直使用定位服務(wù)壳影,即使應(yīng)用不在使用狀態(tài)
kCLAuthorizationStatusAuthorizedWhenInUse: 使用此應(yīng)用過(guò)程中允許訪問(wèn)定位服務(wù)
屬性 說(shuō)明
desiredAccuracy 定位精度,枚舉類型:
kCLLocationAccuracyBest:最精確定位
CLLocationAccuracy kCLLocationAccuracyNearestTenMeters:十米誤差范圍
kCLLocationAccuracyHundredMeters:百米誤差范圍
kCLLocationAccuracyKilometer:千米誤差范圍
kCLLocationAccuracyThreeKilometers:三千米誤差范圍
distanceFilter 位置信息更新最小距離弥臼,只有移動(dòng)大于這個(gè)距離才更新位置信息宴咧,默認(rèn)為kCLDistanceFilterNone:不進(jìn)行距離限制
對(duì)象方法 說(shuō)明
startUpdatingLocation 開(kāi)始定位追蹤,開(kāi)始定位后將按照用戶設(shè)置的更新頻率執(zhí)行-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;方法反饋定位信息
stopUpdatingLocation 停止定位追蹤
startUpdatingHeading 開(kāi)始導(dǎo)航方向追蹤
stopUpdatingHeading 停止導(dǎo)航方向追蹤
startMonitoringForRegion: 開(kāi)始對(duì)某個(gè)區(qū)域進(jìn)行定位追蹤径缅,開(kāi)始對(duì)某個(gè)區(qū)域進(jìn)行定位后掺栅。如果用戶進(jìn)入或者走出某個(gè)區(qū)域會(huì)調(diào)用- (void)locationManager:(CLLocationManager *)manager
didEnterRegion:(CLRegion *)region和- (void)locationManager:(CLLocationManager *)manager
didExitRegion:(CLRegion *)region代理方法反饋相關(guān)信息
stopMonitoringForRegion: 停止對(duì)某個(gè)區(qū)域進(jìn)行定位追蹤
requestWhenInUseAuthorization 請(qǐng)求獲得應(yīng)用使用時(shí)的定位服務(wù)授權(quán),注意使用此方法前在要在info.plist中配置NSLocationWhenInUseUsageDescription
requestAlwaysAuthorization 請(qǐng)求獲得應(yīng)用一直使用定位服務(wù)授權(quán)纳猪,注意使用此方法前要在info.plist中配置NSLocationAlwaysUsageDescription
代理方法 說(shuō)明
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations; 位置發(fā)生改變后執(zhí)行(第一次定位到某個(gè)位置之后也會(huì)執(zhí)行)
- (void)locationManager:(CLLocationManager *)manager
didUpdateHeading:(CLHeading *)newHeading; 導(dǎo)航方向發(fā)生變化后執(zhí)行
- (void)locationManager:(CLLocationManager *)manager
didEnterRegion:(CLRegion *)region 進(jìn)入某個(gè)區(qū)域之后執(zhí)行
- (void)locationManager:(CLLocationManager *)manager
didExitRegion:(CLRegion *)region 走出某個(gè)區(qū)域之后執(zhí)行
注意:
1.定位頻率和定位精度并不應(yīng)當(dāng)越精確越好氧卧,需要視實(shí)際情況而定,因?yàn)樵骄_越耗性能氏堤,也就越費(fèi)電沙绝。
2.定位成功后會(huì)根據(jù)設(shè)置情況頻繁調(diào)用-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations方法,這個(gè)方法返回一組地理位置對(duì)象數(shù)組,每個(gè)元素一個(gè)CLLocation代表地理位置信息(包含經(jīng)度闪檬、緯度星著、海報(bào)、行走速度等信息)粗悯,之所以返回?cái)?shù)組是因?yàn)橛行r(shí)候一個(gè)位置點(diǎn)可能包含多個(gè)位置虚循。
3.使用完定位服務(wù)后如果不需要實(shí)時(shí)監(jiān)控應(yīng)該立即關(guān)閉定位服務(wù)以節(jié)省資源。
4.除了提供定位功能样傍,CLLocationManager還可以調(diào)用startMonitoringForRegion:方法對(duì)指定區(qū)域進(jìn)行監(jiān)控横缔。
地理編碼
除了提供位置跟蹤功能之外,在定位服務(wù)中還包含CLGeocoder類用于處理地理編碼和逆地理編碼(又叫反地理編碼)功能衫哥。
地理編碼:根據(jù)給定的位置(通常是地名)確定地理坐標(biāo)(經(jīng)剪廉、緯度)。
逆地理編碼:可以根據(jù)地理坐標(biāo)(經(jīng)炕檩、緯度)確定位置信息(街道斗蒋、門牌等)。
用戶位置跟蹤
在很多帶有地圖的應(yīng)用中默認(rèn)打開(kāi)地圖都會(huì)顯示用戶當(dāng)前位置笛质,同時(shí)將當(dāng)前位置標(biāo)記出來(lái)放到屏幕中點(diǎn)方便用戶對(duì)周圍情況進(jìn)行查看泉沾。如果在iOS6或者iOS7中實(shí)現(xiàn)這個(gè)功能只需要添加地圖控件、設(shè)置用戶跟蹤模式妇押、在-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation代理方法中設(shè)置地圖中心區(qū)域及顯示范圍跷究。但是在iOS8中用法稍有不同:
1.由于在地圖中進(jìn)行用戶位置跟蹤需要使用定位功能,而定位功能在iOS8中設(shè)計(jì)發(fā)生了變化敲霍,因此必須按照前面定位章節(jié)中提到的內(nèi)容進(jìn)行配置和請(qǐng)求俊马。
2.iOS9中不需要進(jìn)行中心點(diǎn)的指定,默認(rèn)會(huì)將當(dāng)前位置設(shè)置中心點(diǎn)并自動(dòng)設(shè)置顯示區(qū)域范圍肩杈。
了解以上兩點(diǎn)柴我,要進(jìn)行用戶位置跟蹤其實(shí)就相當(dāng)簡(jiǎn)單了,值得一提的是-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation這個(gè)代理方法扩然。這個(gè)方法只有在定位(利用前面章節(jié)中的定位內(nèi)容)到當(dāng)前位置之后就會(huì)調(diào)用艘儒,以后每當(dāng)用戶位置發(fā)生改變就會(huì)觸發(fā),調(diào)用頻率相當(dāng)頻繁夫偶。
大頭針
在iOS開(kāi)發(fā)中經(jīng)常會(huì)標(biāo)記某個(gè)位置界睁,需要使用地圖標(biāo)注,也就是大家俗稱的“大頭針”兵拢。只要一個(gè)NSObject類實(shí)現(xiàn)MKAnnotation協(xié)議就可以作為一個(gè)大頭針翻斟,通常會(huì)重寫協(xié)議中coordinate(標(biāo)記位置)、title(標(biāo)題)说铃、subtitle(子標(biāo)題)三個(gè)屬性访惜,然后在程序中創(chuàng)建大頭針對(duì)象并調(diào)用addAnnotation:方法添加大頭針即可(之所以iOS沒(méi)有定義一個(gè)基類實(shí)現(xiàn)這個(gè)協(xié)議供開(kāi)發(fā)者使用嘹履,多數(shù)原因應(yīng)該是MKAnnotation是一個(gè)模型對(duì)象,對(duì)于多數(shù)應(yīng)用模型會(huì)稍有不同疾牲,例如后面的內(nèi)容中會(huì)給大頭針模型對(duì)象添加其他屬性)植捎。