定位
1.實(shí)現(xiàn)定位功能
在iOS中使用定位功能惫叛,需要導(dǎo)入CoreLocation.h文件,其實(shí)現(xiàn)定位功能的步驟如下:
1.創(chuàng)建一個(gè)CLLocationManager類型的屬性次舌,并且通過(guò)懶加載創(chuàng)建出來(lái)
//聲明定位管理屬性
@property(nonatomic, strong)CLLocationManager * locationManager;
//通過(guò)懶加載創(chuàng)建定位管理對(duì)象
- (CLLocationManager *)locationManager{
if (_locationManager == nil) {
_locationManager = [[CLLocationManager alloc] init];
}
return _locationManager;
}
2.在使用定位功能前需要先判斷定位服務(wù)是否可用
//1.判斷定位服務(wù)是否可用
if ([CLLocationManager locationServicesEnabled]) {
//====定位服務(wù)可用====
//2.設(shè)置成總是打開(kāi)定位服務(wù)(8.0以后需要設(shè)置)
//a.先設(shè)置plist文件;在inf.plist文件中添加NSLocationAlwaysUsageDescription字段,其對(duì)應(yīng)的類型是字符串竟贯,可以設(shè)置成任意字符串盗誊。如圖圣猎;
//b.代碼設(shè)置成總是打開(kāi)
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
[self.manager requestAlwaysAuthorization];
}
}else{
//====定位服務(wù)不可用====
}
3.設(shè)置定位精度
//精度越高士葫,越費(fèi)電
//kCLLocationAccuracyBest 最高精度
//kCLLocationAccuracyNearestTenMeters; 有10米誤差
//kCLLocationAccuracyHundredMeters; 有100米誤差
//kCLLocationAccuracyKilometer; 有1000米誤差
//kCLLocationAccuracyThreeKilometers; 有3000米誤差
[self.manager setDesiredAccuracy:kCLLocationAccuracyBest];
4.自動(dòng)過(guò)濾距離
設(shè)置多遠(yuǎn)距離刷新一次位置信息,單位:米
//讓設(shè)備每移動(dòng)10米刷新一次定位信息
[self.manager setDistanceFilter:10];
5.設(shè)置定位用途
//CLActivityTypeOther 普通定位
//CLActivityTypeAutomotiveNavigation 汽車導(dǎo)航
//CLActivityTypeFitness 健身
//CLActivityTypeOtherNavigation 其他的運(yùn)輸工具送悔,比如船舶慢显、火車、飛機(jī)
[self.manager setActivityType:CLActivityTypeOther];
6.設(shè)置代理
通過(guò)CLLocationManagerDelegate的協(xié)議方法可以獲取到定位結(jié)果的相關(guān)信息
self.manager.delegate = self;
7.開(kāi)始定位
前面的設(shè)置都是定位前的一些設(shè)置欠啤,并沒(méi)有真正開(kāi)啟定位功能
//開(kāi)始定位
[self.locationManager startUpdatingLocation];
8.區(qū)域監(jiān)聽(tīng)
//經(jīng)緯度坐標(biāo)
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(104.06667, 30.66667);
//通過(guò)經(jīng)緯度和半徑確定范圍
CLRegion * region = [[CLCircularRegion alloc] initWithCenter:coordinate radius:200 identifier:@"天豐利"];
//監(jiān)聽(tīng)指定范圍
[self.manager startMonitoringForRegion:region];
9. CLLocationManagerDelegate協(xié)議方法
//位置已經(jīng)更新的時(shí)候調(diào)用
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation;
//位置已經(jīng)更新的時(shí)候調(diào)用(如果實(shí)現(xiàn)了這個(gè)方法荚藻,那么上面那個(gè)方法就不會(huì)被調(diào)用)
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations;
//當(dāng)定位失敗的時(shí)候洁段,會(huì)調(diào)用這個(gè)方法
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
//進(jìn)入監(jiān)聽(tīng)區(qū)域的時(shí)候应狱,會(huì)調(diào)用這個(gè)方法
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region;
//從監(jiān)聽(tīng)區(qū)域出去的時(shí)候,會(huì)調(diào)用這個(gè)方法
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
地址的編碼和反編碼
iOS專門提供了一個(gè)用來(lái)通過(guò)經(jīng)緯度獲取其對(duì)應(yīng)的地址祠丝,和通過(guò)地址來(lái)獲取經(jīng)緯度的類:CLGeocoder疾呻。CLGeocoder聲明在<MapKit/MapKit.h>庫(kù)中。
1.使用CLGeocoder写半,先創(chuàng)建其對(duì)象
//地址解析器
@property (nonatomic, strong) CLGeocoder *geoCoder;
//實(shí)例化
self.geoCoder = [[CLGeocoder alloc] init];
2.通過(guò)地址解析器將地址解析成經(jīng)緯度
[self.geocoder geocodeAddressString:address completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
}
3.通過(guò)地址解析器將經(jīng)緯度反編碼成地址
[self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
}