CoreLocation框架
來自520it.com
一. iOS8.0之前的定位(?????)
1. 前臺(tái)定位
-
導(dǎo)入CoreLocation框架以及對(duì)應(yīng)的主頭文件
#import <CoreLocation/CoreLocation.h>
-
創(chuàng)建CLLocationManager對(duì)象并設(shè)置代理
self.locationM = [[CLLocationManager alloc] init]; self.locationM.delegate = self;
-
調(diào)用方法,開始更新用戶位置信息
[self.locationM startUpdatingLocation];
-
在對(duì)應(yīng)的代理方法中獲取位置信息
-(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation > *)locations { NSLog(@"每當(dāng)請(qǐng)求到位置信息時(shí), 都會(huì)調(diào)用此方法"); }
2. 后臺(tái)定位
-
在前臺(tái)定位基礎(chǔ)上, 勾選后臺(tái)模式Location updates
3. 額外設(shè)置
-
每隔多少米定位一次
代碼: self.locationM.distanceFilter = 100; 功能: 只有當(dāng)最新的位置與上一次獲取的位置之間的距離, 大于這個(gè)值時(shí), 才會(huì)通過代理告訴外界
-
設(shè)置定位精確度
代 碼: self.locationM.desiredAccuracy = kCLLocationAccuracyBest; 功 能: 通過設(shè)置此屬性, 獲取不同精確度的位置信息 注意事項(xiàng): 精確度越高祟同,越耗電瞧剖,定位所需時(shí)間越長 枚舉注解:
枚舉值 | 含義 |
---|---|
kCLLocationAccuracyBestForNavigation | 最適合導(dǎo)航 |
kCLLocationAccuracyBest | 精度最好的 |
kCLLocationAccuracyNearestTenMeters | 附近10米 |
kCLLocationAccuracyHundredMeters | 附近100米 |
kCLLocationAccuracyKilometer | 附近1000米 |
kCLLocationAccuracyThreeKilometers | 附近3000米 |
3. 知識(shí)補(bǔ)充
1. 定位常識(shí)
1) 標(biāo)準(zhǔn)定位服務(wù)(基于gps/基站/wifi定位, 具體使用哪種,蘋果有自己規(guī)則)
> 程序關(guān)閉,就沒法獲取位置
2) 顯著的位置變化定位服務(wù)(使用基站進(jìn)行定位,所以必須要求設(shè)備有電話模塊)
> 當(dāng)app被完全關(guān)閉時(shí),也可以接收到位置通知,并讓app進(jìn)入到后臺(tái)處理
> 定位精度相比于上面,精度不大,所以耗電小,而且定位更新頻率依據(jù)基站密度而定
2. 應(yīng)用場(chǎng)景
1) 如果要求定位及時(shí),精度較高,并且運(yùn)行時(shí)間較短,可使用標(biāo)準(zhǔn)定位;
2) 如果長時(shí)間監(jiān)控用戶位置,用戶移動(dòng)速度比較快(例如打車軟件),可使用后者
4. 測(cè)試環(huán)境:
1. XCode7.0之前版本,例如XCode6.4版本
2. 模擬器選擇iOS8.0之前的版本
* 原因 : XCode7.0(包含7.0)之后不支持iOS8.0之前的模擬器
5. 常見問題總結(jié)
1. 定位不到, 對(duì)應(yīng)的代理方法不執(zhí)行
首先,檢查運(yùn)行的模擬器是否是iOS8.0之前的系統(tǒng)版本
其次,檢查模擬器是否設(shè)置位置數(shù)據(jù)
第三,確保代碼無問題(一般都是代理沒有設(shè)置,或者位置管理器對(duì)象是局部變量,亦或是位置管理器對(duì)象沒有被強(qiáng)引用)
第四,絕逼是模擬器BUG, 請(qǐng)重置模擬器(是重置,不是重啟)
二. iOS8.0之后定位(?????)
1. 前臺(tái)定位
-
導(dǎo)入CoreLocation框架以及對(duì)應(yīng)的主頭文件
#import <CoreLocation/CoreLocation.h>
-
創(chuàng)建CLLocationManager對(duì)象并設(shè)置代理
self.locationM = [[CLLocationManager alloc] init]; self.locationM.delegate = self;
-
請(qǐng)求前臺(tái)定位授權(quán), 并在Info.Plist文件中配置Key ( Nslocationwheninuseusagedescription )
[self.locationM requestWhenInUseAuthorization];
-
調(diào)用方法,開始更新用戶位置信息
[self.locationM startUpdatingLocation];
-
在對(duì)應(yīng)的代理方法中獲取位置信息
-(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation > *)locations { NSLog(@"每當(dāng)請(qǐng)求到位置信息時(shí), 都會(huì)調(diào)用此方法"); }
2. 后臺(tái)定位
方案一:
- 在前臺(tái)定位基礎(chǔ)上, 勾選后臺(tái)模式Location updates
注意:此時(shí)授權(quán)狀態(tài)如果是前臺(tái)定位, 那么當(dāng)APP退到后臺(tái)時(shí), 屏幕頂部會(huì)出現(xiàn)藍(lán)條
方案二:
-
請(qǐng)求前后臺(tái)定位授權(quán),并在info.plist文件中配置KEY ( NSLocationAlwaysUsageDescription )
[self.locationM requestAlwaysAuthorization];
注意:不需要勾選后臺(tái)模式, 也可以進(jìn)行后臺(tái)定位
注意:此時(shí)授權(quán)狀態(tài)如果是前后臺(tái)定位, 那么即使APP退到后臺(tái)時(shí), 屏幕頂部會(huì)也不會(huì)出現(xiàn)藍(lán)條
3. 監(jiān)聽用戶授權(quán)狀態(tài)
-
實(shí)現(xiàn)以下代理方法即可
// 當(dāng)用戶授權(quán)狀態(tài)發(fā)生變化時(shí)調(diào)用 -(void)locationManager:(nonnull CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { switch (status) { // 用戶還未決定 case kCLAuthorizationStatusNotDetermined: { NSLog(@"用戶還未決定"); break; } // 訪問受限(蘋果預(yù)留選項(xiàng),暫時(shí)沒用) case kCLAuthorizationStatusRestricted: { NSLog(@"訪問受限"); break; } // 定位關(guān)閉時(shí)和對(duì)此APP授權(quán)為never時(shí)調(diào)用 case kCLAuthorizationStatusDenied: { // 定位是否可用(是否支持定位或者定位是否開啟) if([CLLocationManager locationServicesEnabled]) { NSLog(@"定位開啟,但被拒"); // 在此處, 應(yīng)該提醒用戶給此應(yīng)用授權(quán), 并跳轉(zhuǎn)到"設(shè)置"界面讓用戶進(jìn)行授權(quán) // 在iOS8.0之后跳轉(zhuǎn)到"設(shè)置"界面代碼 NSURL *settingURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if([[UIApplication sharedApplication] canOpenURL:settingURL]) { [[UIApplication sharedApplication] openURL:settingURL]; } }else { NSLog(@"定位關(guān)閉开泽,不可用"); } break; } // 獲取前后臺(tái)定位授權(quán) case kCLAuthorizationStatusAuthorizedAlways: // case kCLAuthorizationStatusAuthorized: // 失效捂寿,不建議使用 { NSLog(@"獲取前后臺(tái)定位授權(quán)"); break; } // 獲得前臺(tái)定位授權(quán) case kCLAuthorizationStatusAuthorizedWhenInUse: { NSLog(@"獲得前臺(tái)定位授權(quán)"); break; } default: break; } }
4. 測(cè)試環(huán)境:
1. XCode版本無要求
2. 模擬器選擇iOS8.0之后的版本
5. 常見問題總結(jié)
1. 定位不到, 對(duì)應(yīng)的代理方法不執(zhí)行
首先,檢查是否請(qǐng)求授權(quán), 并設(shè)置了對(duì)應(yīng)的KEY
其次,檢查模擬器是否設(shè)置位置數(shù)據(jù)
第三,確保代碼無問題(一般都是代理沒有設(shè)置,或者位置管理器對(duì)象是局部變量,亦或是位置管理器對(duì)象沒有被強(qiáng)引用)
第四,絕逼是模擬器BUG, 請(qǐng)重置模擬器(是重置,不是重啟)
三. iOS9.0 定位補(bǔ)充(???)
1. 定位變化
* 前臺(tái)定位
(同iOS8.0之后一致, 無任何變化, 都需要主動(dòng)請(qǐng)求授權(quán))
* 后臺(tái)定位
方案一:
-
在前臺(tái)定位基礎(chǔ)上, 勾選后臺(tái)模式Location updates, 并且設(shè)置以下屬性為YES
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) { self.locationM.allowsBackgroundLocationUpdates = YES; }
方案二:
-
請(qǐng)求前后臺(tái)定位授權(quán),并在info.plist文件中配置KEY ( NSLocationAlwaysUsageDescription )
[self.locationM requestAlwaysAuthorization];
2. 新的API
-
單次定位請(qǐng)求;
代 碼: [self.locationM requestLocation]; 功 能: 獲取一次位置信息 實(shí)現(xiàn)邏輯: (1) 按照定位精確度從低到高進(jìn)行排序口四,逐個(gè)進(jìn)行定位.如果在有效時(shí)間內(nèi), 定位到了精確度最好的位置, 那么就把對(duì)應(yīng)的位置通過代理告知外界. (2) 如果獲取到的位置不是精確度最高的那個(gè),也會(huì)在定位超時(shí)后秦陋,通過代理告訴外界. 注意事項(xiàng): (1) 必須實(shí)現(xiàn)代理的-locationManager:didFailWithError:方法 (2) 不能與startUpdatingLocation方法同時(shí)使用
3. 測(cè)試環(huán)境:
1. XCode版本要求7.0版本以上
2. 模擬器選擇iOS9.0之后的版本
4. 常見問題總結(jié)
1. 單次定位在模擬器上測(cè)試不出效果?
答: 因?yàn)槟M器的位置是固定的, 所以無法測(cè)試出效果, 請(qǐng)使用真機(jī)進(jìn)行測(cè)試.
四. CLLocation對(duì)象詳解(?????)
1. 屬性解釋
> coordinate : 當(dāng)前位置所在的經(jīng)緯度數(shù)據(jù)
> altitude : 海拔
> speed : 當(dāng)前速度
> course : 航向(設(shè)備移動(dòng)的方向, 值域范圍:0.0 ~ 259.9, 正北方向?yàn)?.0)
2. 重要方法
代碼: - (CLLocationDistance)distanceFromLocation:(CLLocation *)location
作用: 計(jì)算兩個(gè)位置對(duì)象之間的物理距離, 單位是(米)
3. 場(chǎng)景演練
1. 場(chǎng)景演示:打印當(dāng)前用戶的行走方向,偏離角度以及對(duì)應(yīng)的行走距離,
例如:”北偏東30度方向,移動(dòng)了8米”
2. 實(shí)現(xiàn)步驟:
1> 獲取對(duì)應(yīng)的方向偏向(例如”正東”,”東偏南”)
2> 獲取對(duì)應(yīng)的偏離角度(并判斷是否是正方向)
3> 計(jì)算行走距離
4> 打印信息
4. 注意事項(xiàng)
-
使用位置前, 務(wù)必判斷當(dāng)前獲取的位置是否有效
代碼: if (location.horizontalAccuracy < 0) return; 功能: 如果水平精確度小于零, 代表雖然可以獲取位置對(duì)象, 但是數(shù)據(jù)錯(cuò)誤, 不可用
* 經(jīng)驗(yàn)小結(jié)
一. 定位的應(yīng)用場(chǎ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)閉定位
五. 指南針效果實(shí)現(xiàn)(??)
1. 實(shí)現(xiàn)思路
- 利用"磁力計(jì)"傳感器,獲取設(shè)備朝向
- 根據(jù)設(shè)備朝向反向旋轉(zhuǎn)"指南針"圖片
2. 代碼實(shí)現(xiàn)
-
獲取設(shè)備朝向
1) 導(dǎo)入CoreLocation框架以及對(duì)應(yīng)的主頭文件 #import <CoreLocation/CoreLocation.h> 2) 創(chuàng)建CLLocationManager對(duì)象并設(shè)置代理 self.locationM = [[CLLocationManager alloc] init]; self.locationM.delegate = self; 3) 調(diào)用方法, 開始獲取設(shè)備朝向 [self.locationM startUpdatingHeading]; 4) 在對(duì)應(yīng)的代理方法中獲取設(shè)備朝向信息 -(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { // 旋轉(zhuǎn)圖片代碼 }
-
旋轉(zhuǎn)圖片
// 1.判斷當(dāng)前的角度是否有效(如果此值小于0,代表角度無效) if(newHeading.headingAccuracy < 0) return; // 2.獲取當(dāng)前設(shè)備朝向(磁北方向) CGFloat angle = newHeading.magneticHeading; // 3.轉(zhuǎn)換成為弧度 CGFloat radian = angle / 180.0 * M_PI; // 4.帶動(dòng)畫反向旋轉(zhuǎn)指南針 [UIView animateWithDuration:0.5 animations:^{ self.compassView.transform = CGAffineTransformMakeRotation(-radian); }];
3. 概念補(bǔ)充
磁北角度: newHeading.magneticHeading ------- 相對(duì)于"磁北方向"產(chǎn)生的角度
真北角度: newHeading.trueHeading ------- 相對(duì)于"真北方向"產(chǎn)生的角度
4. 注意事項(xiàng)
1. 獲取設(shè)備朝向前, 先判斷"磁力計(jì)"是否可用
[CLLocationManager headingAvailable];
2. 獲取朝向前, 判斷當(dāng)前朝向信息是否有效
if(newHeading.headingAccuracy < 0) return;
3. 注意與"航向"的區(qū)別
設(shè)備朝向是指手機(jī)的朝向; "航向"可以理解為設(shè)備的移動(dòng)方向
4. 使用"磁力計(jì)"傳感器獲取設(shè)備朝向, 不需要請(qǐng)求用戶授權(quán)
因?yàn)樵O(shè)備朝向不涉及用戶隱私
5.測(cè)試環(huán)境
1. XCode版本無要求(建議:XCode7.0不需要開發(fā)者賬號(hào)也可以進(jìn)行真機(jī)調(diào)試)
2. 必須要求真機(jī)設(shè)備(只有真機(jī)設(shè)備才有"磁力計(jì)"傳感器)
六. 區(qū)域監(jiān)聽(???)
1.概念解釋
區(qū) 域 : 就是指劃定的一塊地域范圍(比如圓形區(qū)域, 則由區(qū)域中心, 和半徑組成)
區(qū)域監(jiān)聽 : 是指,我們通過代碼指定一個(gè)區(qū)域, 然后當(dāng)用戶持握設(shè)備進(jìn)入或者離開指定區(qū)域, 我們都能監(jiān)聽到.
2. 監(jiān)聽指定區(qū)域
-
導(dǎo)入CoreLocation框架以及對(duì)應(yīng)的主頭文件
#import <CoreLocation/CoreLocation.h>
-
創(chuàng)建CLLocationManager對(duì)象并設(shè)置代理
self.locationM = [[CLLocationManager alloc] init]; self.locationM.delegate = self;
-
請(qǐng)求前后臺(tái)定位, 或前臺(tái)定位授權(quán), 并在Info.Plist文件中配置相應(yīng)的Key
[self.locationM requestAlwaysAuthorization]; // [self.locationM requestWhenInUseAuthorization];
-
創(chuàng)建一個(gè)區(qū)域, 并開始監(jiān)聽
// 1. 判斷區(qū)域監(jiān)聽服務(wù)是否可用(定位服務(wù)是否關(guān)閉, 定位是否授權(quán), 是否開啟飛行模式) if ([CLLocationManager isMonitoringAvailableForClass:[CLCircularRegion class]]) { // 創(chuàng)建區(qū)域中心 CLLocationCoordinate2D center = CLLocationCoordinate2DMake(29.12345, 131.23456); // 創(chuàng)建區(qū)域(指定區(qū)域中心蔓彩,和區(qū)域半徑) CLLocationDistance radius = 1000; // 判斷區(qū)域半徑是否大于最大監(jiān)聽區(qū)域半徑,如果大于, 就沒法監(jiān)聽 if (radius > self.locationM.maximumRegionMonitoringDistance) { radius = self.locationM.maximumRegionMonitoringDistance; } CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:center radius:radius identifier:@"小碼哥"]; // 開始監(jiān)聽指定區(qū)域(只有用戶有進(jìn)入?yún)^(qū)域, 或者離開區(qū)域動(dòng)作的時(shí)候 才會(huì)通過代理告訴外界) // 例:當(dāng)一開始在區(qū)域內(nèi),不會(huì)通知代理,只有進(jìn)入或離開區(qū)域時(shí)才會(huì)調(diào)用 [self.locationM startMonitoringForRegion:region]; // 請(qǐng)求某個(gè)區(qū)域的狀態(tài) // 不止可以獲取到指定區(qū)域的狀態(tài), 而且當(dāng)狀態(tài)發(fā)生變化時(shí), 也會(huì)調(diào)用對(duì)應(yīng)的代理方法, 告訴我們 [self.locationM requestStateForRegion:region]; } else { NSLog(@"區(qū)域監(jiān)聽不可用"); }
-
在對(duì)應(yīng)的代理方法中監(jiān)聽區(qū)域狀態(tài)
// 進(jìn)去監(jiān)聽區(qū)域后調(diào)用(調(diào)用一次) -(void)locationManager:(nonnull CLLocationManager *)manager didEnterRegion:(nonnull CLRegion *)region { NSLog(@"進(jìn)入?yún)^(qū)域---%@", region.identifier); [manager stopMonitoringForRegion:region]; } // 離開監(jiān)聽區(qū)域后調(diào)用(調(diào)用一次) -(void)locationManager:(nonnull CLLocationManager *)manager didExitRegion:(nonnull CLRegion *)region { NSLog(@"離開區(qū)域---%@", region.identifier); } /** * 當(dāng)前請(qǐng)求指定區(qū)域狀態(tài)時(shí), 回調(diào)的代理方法 * @param manager 位置管理者 * @param state 狀態(tài) * @param region 區(qū)域 */ -(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region { /** * CLRegionStateUnknown, // 不知道 CLRegionStateInside, // 在區(qū)域內(nèi)部 CLRegionStateOutside // 在區(qū)域外部 */ if(state == CLRegionStateInside) { self.noticeLabel.text = @"小碼哥歡迎你, 給你技術(shù)"; }else if (state == CLRegionStateOutside) { self.noticeLabel.text = @"歡迎下次來復(fù)讀"; } }
3. 獲取某個(gè)區(qū)域的當(dāng)前狀態(tài)
監(jiān)聽某個(gè)區(qū)域時(shí), 只有進(jìn)入或者離開這個(gè)區(qū)域時(shí), 才能回調(diào)對(duì)應(yīng)的方法, 是一個(gè)進(jìn)入或者離開的動(dòng)作
如果想知道某一個(gè)區(qū)域的當(dāng)前狀態(tài)(識(shí)別用戶是在區(qū)域內(nèi)部, 還是區(qū)域外部), 則需要使用以下方法
代 碼:
[self.locationM requestStateForRegion:region];
回調(diào)代理:
// 請(qǐng)求某個(gè)區(qū)域狀態(tài)時(shí), 回調(diào)的代理方法
-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
switch (state) {
case CLRegionStateUnknown:
NSLog(@"未知狀態(tài)");
break;
case CLRegionStateInside:
NSLog(@"在區(qū)域內(nèi)部");
break;
case CLRegionStateOutside:
NSLog(@"在區(qū)域外部");
break;
default:
break;
}
}
4. 測(cè)試環(huán)境
XCode版本無要求
iOS模擬器版本無要求
5. 注意事項(xiàng)
1. 想要做區(qū)域監(jiān)聽, 在iOS8.0之后, 必須請(qǐng)求位置授權(quán)
代碼: [self.locationM requestAlwaysAuthorization];
原因: 區(qū)域監(jiān)聽的原理就是獲取用戶的位置, 然后在判斷該位置是否在制定區(qū)域內(nèi), 所以會(huì)涉及到用戶隱私(位置), 而在iOS8.0之后, 想要訪問用戶位置信息, 就需要主動(dòng)請(qǐng)求授權(quán);
2. 使用前, 先判斷區(qū)域監(jiān)聽是否可用
代碼: [CLLocationManager isMonitoringAvailableForClass:[CLCircularRegion class]]
3. 注意區(qū)域半徑是否大于最大區(qū)域監(jiān)聽半徑(如果大于, 則無法監(jiān)聽成功)
代碼: radius > self.locationM.maximumRegionMonitoringDistance
6. 常見問題
1. 區(qū)域監(jiān)聽, 測(cè)試沒有效果?
首先, 確定代碼沒有問題, 是否有請(qǐng)求授權(quán);
其次, 嘗試修改模擬器位置信息, 觸發(fā)進(jìn)入?yún)^(qū)域或離開區(qū)域的動(dòng)作
第三, 如果模擬器出現(xiàn)BUG, 定位不到, 也會(huì)無法判定當(dāng)前區(qū)域狀態(tài); 所以, 最后可以嘗試重置模擬器.
七. (反)地理編碼(?????)
1. 概念解釋
地理編碼: 是指根據(jù)地址關(guān)鍵字, 將其轉(zhuǎn)換成為對(duì)應(yīng)的經(jīng)緯度等信息;
發(fā)地理編碼: 是指根據(jù)經(jīng)緯度信息, 將其轉(zhuǎn)換成為對(duì)應(yīng)的省市區(qū)街道等信息;
2. 地理編碼
-
導(dǎo)入CoreLocation框架以及對(duì)應(yīng)的主頭文件
#import <CoreLocation/CoreLocation.h>
-
創(chuàng)建CLGeocoder對(duì)象
self.geoC = [[CLGeocoder alloc] init];
-
根據(jù)地址關(guān)鍵字, 進(jìn)行地理編碼
// 直接根據(jù)地址進(jìn)行地理編碼(返回結(jié)果可能有多個(gè),因?yàn)橐粋€(gè)地點(diǎn)有重名) [self.geoC geocodeAddressString:@"廣州" completionHandler:^(NSArray<CLPlacemark *> * __nullable placemarks, NSError * __nullable error) { // 包含區(qū)驳概,街道等信息的地標(biāo)對(duì)象 CLPlacemark *placemark = [placemarks firstObject]; // 城市名稱 NSString *city = placemark.locality; // 街道名稱 NSString *street = placemark.thoroughfare; // 全稱 NSString *name = placemark.name; }];
3. 反地理編碼
-
導(dǎo)入CoreLocation框架以及對(duì)應(yīng)的主頭文件
#import <CoreLocation/CoreLocation.h>
-
創(chuàng)建CLGeocoder對(duì)象
self.geoC = [[CLGeocoder alloc] init];
-
根據(jù)經(jīng)緯度信息, 進(jìn)行反地理編碼
// 根據(jù)經(jīng)緯度信息進(jìn)行反地理編碼 [self.geoC reverseGeocodeLocation:[[CLLocation alloc] initWithLatitude:21.123 longitude:123.345] completionHandler:^(NSArray<CLPlacemark *> * __nullable placemarks, NSError * __nullable error) { // 包含區(qū)赤嚼,街道等信息的地標(biāo)對(duì)象 CLPlacemark *placemark = [placemarks firstObject]; // 城市名稱 NSString *city = placemark.locality; // 街道名稱 NSString *street = placemark.thoroughfare; // 全稱 NSString *name = placemark.name; }];
4. CLPlacemark 地標(biāo)對(duì)象詳解
location : CLLocation 類型, 位置對(duì)象信息, 里面包含經(jīng)緯度, 海拔等等
region : CLRegion 類型, 地標(biāo)對(duì)象對(duì)應(yīng)的區(qū)域
addressDictionary : NSDictionary 類型, 存放街道,省市等信息
name : NSString 類型, 地址全稱
thoroughfare : NSString 類型, 街道名稱
locality : NSString 類型, 城市名稱
administrativeArea : NSString 類型, 省名稱
country : NSString 類型, 國家名稱
5. 測(cè)試環(huán)境
* 必須聯(lián)網(wǎng)
XCode版本不限
iOS模擬器系統(tǒng)版本不限
6. 常見問題
1. 測(cè)試無數(shù)據(jù)?
首先, 檢查是否有聯(lián)網(wǎng);
其次, 如果是反地理編碼,可嘗試更換經(jīng)緯度再次嘗試, 有的經(jīng)緯度沒有對(duì)應(yīng)信息
7. 應(yīng)用場(chǎng)景
1. 一般與定位結(jié)合使用, 確定當(dāng)前位置的具體地理信息
八. 使用第三方框架進(jìn)行定位(??)
1. 主要原因
因?yàn)槭褂肅oreLocation框架進(jìn)行獲取用戶位置信息, 是通過代理進(jìn)行回調(diào); 而第三方框架將"代理模擬"轉(zhuǎn)換成為"block模式"; 使用起來比較方便, 而且額外增加了超時(shí)時(shí)間等功能.
2. 框架信息
名稱: locationManager
地址: [link](https://github.com/intuit/LocationManager)
3. 使用方法
參照該框架對(duì)應(yīng)的 readME
4. 注意事項(xiàng)
一般集成第三方框架到項(xiàng)目中, 請(qǐng)先確保該框架沒有問題, 然后再向項(xiàng)目中集成
九. 補(bǔ)充(???)
-
代理模式到block模式的轉(zhuǎn)換
主要思想就是,先記錄下外界傳遞過來的block, 然后在對(duì)應(yīng)的代理方法里面執(zhí)行這個(gè)block;