常用的类
- CLLocationManager:定位服务管理类,开启/关闭定位服务,配置定位精度,距离等等。
- CLGeocoder:地理位置编码类, 根据经纬度获取地理位置信息,根据地名获取位置信息。
- CLLocation:地理位置信息类,经纬度、海拔、速度、时间、国家等相关位置信息。
- CLLocationCoordinate2D:结构体只包含经纬度信息。
- 需要遵守CLLocationManagerDeletage
可参见帮助文档获取更多信息
iOS8定位服务设置
设置info.plist文件增加:
NSLocationAlwaysUsageDescription, 允许获取地理位置描述 NSLocationWhenInUseDescription, 允许获取地理位置描述
请求位置授权
[_locationMananer requestAlwaysAuthorization];
遵守协议
_locationManger.delegate = self
实现协议相关方法。
//定位信息获取后调用的方法 -(void)locationManager:didUpdateLocations:
启动定位服务
_locationManager startUpatingLocation];
停止定位服务
locationManager stopUpatingLocation];
以下为源码
#import "ViewController.h"
@import CoreLocation;
@interface ViewController () <CLLocationManagerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
//请求授权
[_locationManager requestAlwaysAuthorization];
//定位精度
_locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
//发生事件的最小距离间隔
_locationManager.distanceFilter = 1000.0f;
[_locationManager startUpdatingLocation]; //启动定位服务.
//根据输入的位置信息进行定位,输出相应的位置信息
[[[CLGeocoder alloc] init] geocodeAddressString:@"北京" completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
NSLog(@"geocode placemark count:%d", (int)placemarks.count);
for (CLPlacemark *placemark in placemarks) {
NSLog(@"%@\n", placemark.location);
}
}];
}
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
CLLocation *location = [locations lastObject];
/*当定位成功后,如果horizontalAccuracy大于0,说明定位有效
horizontalAccuracy,该位置的纬度和经度确定的圆的中心,并且这个值表示圆的半径。负值表示该位置的纬度和经度是无效的。
*/
NSLog(@"lat:%.3f, log:%.3f", location.coordinate.latitude, location.coordinate.longitude);
if(location.horizontalAccuracy > 0){//定位数据有效
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
//反地理位置编码
[geocoder reverseGeocodeLocation:location
completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
NSLog(@"placemark count:%d", (int)placemarks.count);
for (CLPlacemark *placemark in placemarks) {
NSLog(@"%@", placemark.addressDictionary);
}
}];
[manager stopUpdatingLocation]; //结束定位服务
}
}