定位CoreLocation

一、定位介紹

現(xiàn)在很多社交敞贡、電商泵琳、團購應用都引入了地圖和定位功能,似乎地圖功能不再是地圖應用和導航應用所特有的誊役。的確获列,有了地圖和定位功能確實讓我們的生活更加豐富多彩,極大的改變了我們的生活方式蛔垢。要實現(xiàn)地圖击孩、導航功能,往往需要先熟悉定位功能鹏漆。

在iOS中通過CoreLocation框架進行定位操作巩梢。

CoreLocation自身可以單獨使用,和地圖開發(fā)框架MapKit完全是獨立的艺玲,但是往往地圖開發(fā)要配合定位框架使用括蝠。

CoreLocation可以實現(xiàn)的功能:

定位功能

地理編碼與逆地理編碼

二、定位核心類

定位是一個很常用的功能饭聚,如一些地圖軟件打開之后如果用戶允許軟件定位的話忌警,那么打開軟件后就會自動鎖定到當前位置,如果用戶手機移動那么當前位置也會跟隨著變化秒梳。要實現(xiàn)這個功能需要使用CoreLoaction中CLLocationManager類法绵,下面是這個類的使用說明:

1. 類方法:

+ (BOOL)locationServicesEnabled;/* 返回用戶是否啟用定位服務 */

+ (CLAuthorizationStatus)authorizationStatus;/* 定位服務授權狀態(tài),返回枚舉類型 */

typedefNS_ENUM(int,CLAuthorizationStatus){? ?

? ? ? ? ?kCLAuthorizationStatusNotDetermined =0,/* 用戶尚未決定是否啟用定位服務 */

? ? ? ? ?kCLAuthorizationStatusRestricted,/* 沒有獲得用戶授權 */

? ? ? ? ?kCLAuthorizationStatusDenied,/* 用戶禁止使用定位或者定位服務處于關閉狀態(tài) */

? ? ? ? ?kCLAuthorizationStatusAuthorizedAlways,/* 前臺酪碘、后臺定位授權 */

? ? ? ? ?kCLAuthorizationStatusAuthorizedWhenInUse,/* 前臺定位授權 */

};

2. 對象屬性:

? 定位精度desiredAccuracy:

? 枚舉類型:?

? 位置信息更新最小距離distanceFilter:

? 浮點數(shù)朋譬,默認為kCLDistanceFilterNone,表示不進行距離限制

3. 對象方法:

#pragmamark - 定位追蹤

-(void)startUpdatingLocation;/* 開始定位追蹤 */

-(void)stopUpdatingLocation;/* 停止定位追蹤 */

#pragmamark - 導航追蹤

-(void)startUpdatingHeading;/* 開始導航方向追蹤 */

-(void)stopUpdatingHeading;/* 停止導航方向追蹤 */

#pragmamark - 區(qū)域定位追蹤

-(void)startMonitoringForRegion:(CLRegion *)region;/* 開始對某個區(qū)域進行定位追蹤 */

-(void)stopMonitoringForRegion:(CLRegion *)region;/* 停止對某個區(qū)域進行定位追蹤 */

#pragmamark - 授權請求

-(void)requestWhenInUseAuthorization;/* 請求獲得應用前臺定位授權 */

-(void)requestAlwaysAuthorization;/* 請求獲得應用前后臺定位授權 */

4. 常用代理方法CLLocationManagerDelegate:

/* 位置發(fā)生改變后調(diào)用兴垦,第一次定位也會調(diào)用 */

-(void)locationManager:(CLLocationManager*)managerdidUpdateLocations:(NSArray*)locations;

/* 導航方向發(fā)生變化后調(diào)用 */

-(void)locationManager:(CLLocationManager*)managerdidUpdateHeading:(CLHeading*)newHeading;

/* 進入某個區(qū)域后調(diào)用 */

-(void)locationManager:(CLLocationManager*)managerdidEnterRegion:(CLRegion*)region;

/* 走出某個區(qū)域后調(diào)用 */

-(void)locationManager:(CLLocationManager*)managerdidExitRegion:(CLRegion*)region;

/* 當用戶授權狀態(tài)發(fā)生變化時調(diào)用 */

-(void)locationManager:(CLLocationManager*)managerdidChangeAuthorizationStatus:(CLAuthorizationStatus)status;

三徙赢、定位簡單使用

先要在項目導入CoreLocation框架,然后再導入頭文件:

#import<CoreLocation/CoreLocation.h>

iOS版本不同探越,使用也有一些區(qū)別狡赐,主要區(qū)分為:

iOS8.0之前的定位使用

iOS8.0之后的定位使用

1. iOS8.0之前的定位使用:

1.1 前臺定位:

- (void)viewDidLoad{?

? ? ? ? ?[superviewDidLoad];

? ? ? ? ? if(![CLLocationManagerlocationServicesEnabled]) {

? ? ? ? ? NSLog(@"定位服務當前可能尚未打開,請設置打開扶关!");

? ? ? ? ? return;? ?

? ? ? ? ? }?

? ? ? ? ? ? [self ? initLocationManager];

? ? ? ? ? ?//調(diào)用方法,開始更新用戶位置信息

? ? ? ? ? ? [self.locationM startUpdatingLocation];

}

//創(chuàng)建CLLocationManager并啟動定位

- (void)initLocationManager{

? ? ? ? ? ?//創(chuàng)建CLLocationManager對象并設置代理

? ? ? ? ? ? self.locationM = [[CLLocationManageralloc] init];

? ? ? ? ? ? self.locationM.delegate =self;

? ? ? ? ? ? //設置定位精度和位置更新最小距離

? ? ? ? ? ? self.locationM.distanceFilter =100;

? ? ? ? ? ? self.locationM.desiredAccuracy = kCLLocationAccuracyBest;

}

//在對應的代理方法中獲取位置信息

- (void)locationManager:(CLLocationManager*)manager? ? ? didUpdateLocations:(NSArray *)locations{

? ? ? ? ? ?CLLocation*location = [locations firstObject];//取出第一個位置

? ? ? ? ? /*

? ? ? ? ? ? ? ? ? 使用位置前, 務必判斷當前獲取的位置是否有效

? ? ? ? ? ? ? ? ?如果水平精確度小于零, 代表雖然可以獲取位置對象, 但是數(shù)據(jù)錯誤, 不可用

? ? ? ? ?*/

? ? ? ? ? ?if(location.horizontalAccuracy <0)

? ? ? ? ? ? ? ? ?return;

? ? ? ? ? CLLocationCoordinate2D ?coordinate = location.coordinate;//位置坐標

? ? ? ? ? CGFloat ? longitude = coordinate.longitude;//經(jīng)度

? ? ? ? ? CGFloat ? ?latitude = coordinate.latitude;//緯度

? ? ? ? ?CGFloat ? ?altitude = location.altitude;//海拔

? ? ? ? ?CGFloat ? ?course = location.course;//方向

? ? ? ? ?CGFloat ? ?speed = location.speed;//速度

? ? ? ? ?NSLog(@"經(jīng)度:%f,緯度:%f",longitude,latitude);

? ? ? ? ?NSLog(@"海拔:%f,方向:%f,速度:%f",altitude,course,speed);

? ? ? ? //如果不需要實時定位阴汇,使用完即使關閉定位服務

? ? ? ? [self.locationM stopUpdatingLocation];?

}

1.定位頻率和定位精度并不是越精確越好数冬,需要視實際情況而定节槐,因為越精確越耗性能搀庶,也就越費電。

2.定位成功后會根據(jù)設置情況頻繁調(diào)用locationManager:didUpdateLocations:方法

3.每個元素一個CLLocation代表地理位置信息铜异,之所以返回數(shù)組是因為有些時候一個位置點可能包含多個位置哥倔。

4.使用完定位服務后,如果不需要實時監(jiān)控應該立即關閉定位服務揍庄,以節(jié)省資源咆蒿。

5.除了提供定位功能,還可以調(diào)用startMonitoringForRegion:方法對指定區(qū)域進行監(jiān)控蚂子。

1.2 后臺定位:

在前臺的基礎上沃测,勾選后臺模式Location updates

2. iOS8之后的定位使用

iOS8開始,需要請求定位授權:

前臺授權:

在Info.plist文件中配置NSLocationWhenInUseUsageDescription為YES

前后臺授權:

在Info.plist文件中配置NSLocationAlwaysUsageDescription為YES

- (void)viewDidLoad{? ?

? ? ? ? ? ? [superviewDidLoad];

? ? ? ? ? ? if(![CLLocationManagerlocationServicesEnabled]) {

? ? ? ? ? ? ? ? ? ? ? ? NSLog(@"定位服務當前可能尚未打開食茎,請設置打開蒂破!");

? ? ? ? ? ? ? ? ? ? ? ? return;? ?

? ? ? ? ? ? ? }? ?

? ? ? ? ? ? ?[self initLocationManager];

? ? ? ? ? ? //如果沒有授權,則請求用戶授權

? ? ? ? ? ? CLAuthorizationStatus ?status = [CLLocationManager ?authorizationStatus];

? ? ? ? ? ? if(status == kCLAuthorizationStatusNotDetermined){

? ? ? ? ? ? //請求前臺定位授權

? ? ? ? ? ? // [self.locationM requestWhenInUseAuthorization];

? ? ? ? ? ? ?//請求前后臺定位授權

? ? ? ? ? ? ? [self.locationM requestAlwaysAuthorization];? ?

? ? ? ? ? ?}

}

//創(chuàng)建CLLocationManager并啟動定位

- (void)initLocationManager{

? ? ? ? ? ?//創(chuàng)建CLLocationManager對象并設置代理

? ? ? ? ? ?self.locationM = [[CLLocationManageralloc] init];

? ? ? ? ? ?self.locationM.delegate =self;

? ? ? ? ? //設置定位精度和位置更新最小距離

? ? ? ? ? self.locationM.distanceFilter =100;

? ? ? ? ? self.locationM.desiredAccuracy = kCLLocationAccuracyBest;

}

// 當用戶授權狀態(tài)發(fā)生變化時調(diào)用

- (void)locationManager:(CLLocationManager*)manager? ? ? ? didChangeAuthorizationStatus:(CLAuthorizationStatus)status{

? ? ? ? ? ? switch(status) {

? ? ? ? ? ? ? ? ? ? ? ? case ? ?kCLAuthorizationStatusNotDetermined://用戶還未決定{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NSLog(@"用戶還未決定");

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? case ? ? kCLAuthorizationStatusRestricted://訪問受限{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NSLog(@"訪問受限");

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ?case ? ? kCLAuthorizationStatusDenied://定位關閉時或用戶APP授權為永不授權時調(diào)用{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NSLog(@"定位關閉或者用戶未授權");

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?break;? ? ? ?

? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? case ? ?kCLAuthorizationStatusAuthorizedAlways://獲取前后臺定位授權{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NSLog(@"獲取前后臺定位授權");? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [self.locationM startUpdatingLocation];

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;? ? ? ?

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? case ? ? ?kCLAuthorizationStatusAuthorizedWhenInUse://獲得前臺定位授權{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NSLog(@"獲得前臺定位授權");? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [self.locationM startUpdatingLocation];

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;? ? ? ?

? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? default:break;?

? ? ? ? ? } ? ? ??

}

//在對應的代理方法中獲取位置信息

- (void)locationManager:(CLLocationManager*)manager? ? ? didUpdateLocations:(NSArray *)locations{

? ? ? ? ? ? ?CLLocation*location = [locations firstObject]; ? //取出第一個位置

? ? ? ? ? ?/*

? ? ? ? ? ? ? 使用位置前, 務必判斷當前獲取的位置是否有效

? ? ? ? ? ? ? 如果水平精確度小于零, 代表雖然可以獲取位置對象, 但是數(shù)據(jù)錯誤, 不可用

? ? ? ? ?*/

? ? ? ? ? ? if(location.horizontalAccuracy <0)return;

? ? ? ? ? ? CLLocationCoordinate2D ?coordinate = location.coordinate;//位置坐標

? ? ? ? ? ? CGFloat ?longitude = coordinate.longitude;//經(jīng)度

? ? ? ? ? ? CGFloat ?latitude = coordinate.latitude;//緯度

? ? ? ? ? ? CGFloat ?altitude = location.altitude;//海拔

? ? ? ? ? ? ?CGFloat ?course = location.course;//方向

? ? ? ? ? ? ?CGFloat ?speed = location.speed;//速度

? ? ? ? ? ? ? NSLog(@"經(jīng)度:%f,緯度:%f",longitude,latitude);

? ? ? ? ? ? ? NSLog(@"海拔:%f,方向:%f,速度:%f",altitude,course,speed);

? ? ? ? ? ? ?//如果不需要實時定位别渔,使用完即使關閉定位服務

? ? ? ? ? ? ?[self.locationM stopUpdatingLocation];

}

控制臺打印


四附迷、地理編碼

定位服務中還包含CLGeocoder類,用于處理地理編碼和逆地理編碼功能哎媚。

地理編碼:根據(jù)給定的位置(通常是地名)確定地理坐標(經(jīng)喇伯、緯度)。

【位置 -> 地理坐標】

逆地理編碼:可以根據(jù)地理坐標(經(jīng)拨与、緯度)確定位置信息(街道稻据、門牌等)。

【地理坐標 -> 位置】

- (void)viewDidLoad {?

? ? ? ? ? ? [superviewDidLoad];

? ? ? ? ? ?self.geocoder = [[CLGeocoderalloc] init];? ?

? ? ? ? ? ? [selfgetCoordinateByAddress:@"北京"];? ?

? ? ? ? ? ?[self ? getAddressByLatitude:39.54longitude:116.28];

}

#pragma mark 根據(jù)地名確定地理坐標

-(void)getCoordinateByAddress:(NSString*)address{

? ? ? ? ? //地理編碼

? ? ? ? ? [self.geocoder geocodeAddressString:address ? completionHandler:^(NSArray*placemarks,NSError*error) {

? ? ? ? ? ?//取得第一個地標截珍,地標中存儲了詳細的地址信息攀甚,注意:一個地名可能搜索出多個地址

? ? ? ? ? ?CLPlacemark*placemark = [placemarks firstObject];

? ? ? ? ? ?CLLocation*location = placemark.location;//位置

? ? ? ? ? ?CLRegion*region = placemark.region;//區(qū)域

? ? ? ? ? ?NSDictionary*addressDic = placemark.addressDictionary;//詳細地址信息字典

? ? ? ? ? ? NSLog(@"位置:%@,區(qū)域:%@,詳細信息:%@",location,region,addressDic);?

? ? ? ? ? ?}];

}

#pragma mark 根據(jù)坐標取得地名

-(void)getAddressByLatitude:(CLLocationDegrees)latitude ? longitude:(CLLocationDegrees)longitude{

? ? ? ? ? ?//反地理編碼

? ? ? ? ? ?CLLocation*location = [[CLLocationalloc] initWithLatitude:latitude ? ? ? longitude:longitude];?

? ? ? ? ? ? [self.geocoder reverseGeocodeLocation:location ? ? ? ? ? ? ? ? ? ? ? ? ? completionHandler:^(NSArray*placemarks,NSError*error) {

? ? ? ? ? ? CLPlacemark*placemark = [placemarks firstObject];

? ? ? ? ? ? ?NSLog(@"詳細信息:%@",placemark.addressDictionary);? ?

? ? ? ? ? ? }];

}

地標類CLPlacemark還包含以下信息:

NSString*name = placemark.name;//地名

NSString*thoroughfare = placemark.thoroughfare;//街道

NSString*subThoroughfare = placemark.subThoroughfare;//街道相關信息,例如門牌等

NSString*locality = placemark.locality;// 城市

NSString*subLocality = placemark.subLocality;// 城市相關信息岗喉,例如標志性建筑

NSString*administrativeArea = placemark.administrativeArea;// 州

NSString*subAdministrativeArea = placemark.subAdministrativeArea;//其他行政區(qū)域信息

NSString*postalCode = placemark.postalCode;//郵編

NSString*ISOcountryCode = placemark.ISOcountryCode;//國家編碼

NSString*country = placemark.country;//國家

NSString*inlandWater = placemark.inlandWater;//水源秋度、湖泊

NSString*ocean = placemark.ocean;// 海洋

NSArray*areasOfInterest = placemark.areasOfInterest;//關聯(lián)的或利益相關的地標

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钱床,隨后出現(xiàn)的幾起案子荚斯,更是在濱河造成了極大的恐慌,老刑警劉巖查牌,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件事期,死亡現(xiàn)場離奇詭異,居然都是意外死亡纸颜,警方通過查閱死者的電腦和手機兽泣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胁孙,“玉大人唠倦,你說我怎么就攤上這事称鳞。” “怎么了稠鼻?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵冈止,是天一觀的道長。 經(jīng)常有香客問我候齿,道長熙暴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任慌盯,我火速辦了婚禮周霉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亚皂。我一直安慰自己诗眨,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布孕讳。 她就那樣靜靜地躺著匠楚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厂财。 梳的紋絲不亂的頭發(fā)上芋簿,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音璃饱,去河邊找鬼与斤。 笑死,一個胖子當著我的面吹牛荚恶,可吹牛的內(nèi)容都是我干的撩穿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼谒撼,長吁一口氣:“原來是場噩夢啊……” “哼食寡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起廓潜,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤抵皱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辩蛋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呻畸,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年悼院,在試婚紗的時候發(fā)現(xiàn)自己被綠了伤为。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡据途,死狀恐怖绞愚,靈堂內(nèi)的尸體忽然破棺而出剑鞍,到底是詐尸還是另有隱情,我是刑警寧澤爽醋,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站便脊,受9級特大地震影響蚂四,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哪痰,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一遂赠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晌杰,春花似錦跷睦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至爹殊,卻和暖如春蜕乡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梗夸。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工层玲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人反症。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓辛块,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铅碍。 傳聞我的和親對象是個殘疾皇子润绵,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容