标签:
1.在iOSApp开发中,尤其是O2O类型的的App往往包含着定位或地图这两项功能,所以说定位和地图是iOS开发中一种常用的第三方(iOS自带高德地图)。
2.定位:首先我们先来说说定位:废话不多说,直接上干货。
(1)首先我们先要知道定位需要什么:
静态包:
导入#import <CoreLocation/CoreLocation.h>
(2)代码
//宏定义 #define IS_IOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
//声明 @property(nonatomic, strong) CLLocationManager *locationManager;
- (void)viewDidLoad { //定位 _locationManager = [[CLLocationManager alloc] init]; _locationManager.delegate = self; if (IS_IOS8) { [_locationManager requestAlwaysAuthorization]; [_locationManager requestWhenInUseAuthorization]; } _locationManager.desiredAccuracy = kCLLocationAccuracyBest; _locationManager.distanceFilter = kCLLocationAccuracyBest; [_locationManager startUpdatingLocation]; }
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { [_locationManager stopUpdatingLocation]; CLLocation *location=[[CLLocation alloc]initWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude]; self.geocoder = [[CLGeocoder alloc] init]; [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) { if (error||placemarks.count==0) { [self zhHUD_showErrorWithStatus:@"你输入的地址没找到"]; } else{ //编码成功 //显示最前面的地标信息 CLPlacemark *firstPlacemark=[placemarks firstObject]; //经纬度 // CLLocationDegrees latitude=firstPlacemark.location.coordinate.latitude; // CLLocationDegrees longitude=firstPlacemark.location.coordinate.longitude; //地理位置名 NSLog(@"name,%@",firstPlacemark.name); // 位置名 NSLog(@"thoroughfare,%@",firstPlacemark.thoroughfare); // 街道 NSLog(@"subThoroughfare,%@",firstPlacemark.subThoroughfare); // 子街道 NSLog(@"locality,%@",firstPlacemark.locality); // 市 NSLog(@"subLocality,%@",firstPlacemark.subLocality); // 区 NSLog(@"country,%@",firstPlacemark.country); // 国家 NSLog(@"country,%@",firstPlacemark.administrativeArea); // 省份 _province =firstPlacemark.administrativeArea; _city =firstPlacemark.locality; //数据 self.payBtn.enabled = YES; [self requestData]; } }]; } - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { [self zhHUD_showErrorWithStatus:@"请打开你的gps"]; self.payBtn.enabled = NO; }
(3)以上代码写完后,意味着定位代码已完成,但是你运行后就会发现,定位代理不会调用。我擦,坑了!好的,我们这时候需要配置plist文件
(4)运行代码,定位成功(必须真机)
3.当然你如果想将定位学习透彻,你需要了解他的所有代理和属性:介绍如下()
CLLocationManager相关方法解读:
+ (BOOL)locationServicesEnabled;
判断设备是否支持定位服务
+ (BOOL)headingAvailable;
判断设备是否支持航向信息功能(海拔,速度,方向等传感器的支持)
+ (BOOL)significantLocationChangeMonitoringAvailable;
判断设备是否支持更新位置信息
+ (BOOL)isMonitoringAvailableForClass:(Class)regionClass;
判断设备是否支持区域检测,regionClass是地图框架中的类。
+ (BOOL)isRangingAvailabl;
判断设备是否支持蓝牙测距
+ (CLAuthorizationStatus)authorizationStatus;
获得定位服务的授权状态,CLAuthorizationStatus的枚举如下:
1
2
3
4
5
6
7
|
typedef NS_ENUM( int , CLAuthorizationStatus) { kCLAuthorizationStatusNotDetermined = 0, //用户还没有做选择 kCLAuthorizationStatusRestricted, //应用拒接使用定位服务 kCLAuthorizationStatusDenied, //用户拒绝授权 kCLAuthorizationStatusAuthorizedAlways, //8.0后可用,始终授权位置服务 kCLAuthorizationStatusAuthorizedWhenInUse, //8.0后可用,只在前台授权位置服务 }; |
@property(assign, nonatomic) CLActivityType activityType;
这个属性用来设置位置更新的模式,枚举如下:
1
2
3
4
5
6
|
typedef NS_ENUM(NSInteger, CLActivityType) { CLActivityTypeOther = 1, //未知模式,默认为此 CLActivityTypeAutomotiveNavigation, //车辆导航模式 CLActivityTypeFitness, //行人模式 CLActivityTypeOtherNavigation //其他交通工具模式 }; |
模式的应用可以起到节省电量的作用,例如车辆导航模式,当汽车停止时,位置更新服务会暂停。
@property(assign, nonatomic) CLLocationDistance distanceFilter;
设置位置更新的敏感范围,单位为米。
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;
设置定位服务的精确度,系统定义好的几个参数如下:
kCLLocationAccuracyBestForNavigation;//导航最高精确
kCLLocationAccuracyBest;//高精确
kCLLocationAccuracyNearestTenMeters;//10米
kCLLocationAccuracyHundredMeters;//百米
kCLLocationAccuracyKilometer;//千米
kCLLocationAccuracyThreeKilometers;//三公里
@property(assign, nonatomic) BOOL pausesLocationUpdatesAutomatically;
设置位置更新是否自动暂停
@property(readonly, nonatomic, copy) CLLocation *location;
最后一次更新的位置信息,只读属性
@property(assign, nonatomic) CLLocationDegrees headingFilter;
相关航向更新的敏感范围
@property(assign, nonatomic) CLDeviceOrientation headingOrientation;
typedef NS_ENUM(int, CLDeviceOrientation) {
CLDeviceOrientationUnknown = 0,随机
CLDeviceOrientationPortrait,纵向
CLDeviceOrientationPortraitUpsideDown,纵向倒置
CLDeviceOrientationLandscapeLeft,左向横向
CLDeviceOrientationLandscapeRight,右向横向
CLDeviceOrientationFaceUp,水平屏幕向上
CLDeviceOrientationFaceDown水平屏幕
};
定位航向时的参照方向默认为正北,枚举如下:
@property(readonly, nonatomic, copy) CLHeading *heading;
最后一个定位得到的航向信息
- (void)startUpdatingLocation;
开启定位服务
- (void)stopUpdatingLocation;
停止定位服务
- (void)startUpdatingHeading;
开启航向地理信息服务
- (void)stopUpdatingHeading;
停止航向地理信息服务
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
位置更新后调用的方法,数组中是所有定位到的位置信息,最后一个是最新的。
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading;
航向信息更新后调用的方法
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error;
定位异常时调用的方法
上面也提到,定位后返回的数组中存放的都是CLLocation对象,这里面有很详细的位置信息,属性如下:
@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;
经纬度属性,CLLocationCoordinate2D是一个结构体,如下:
typedef struct {
CLLocationDegrees latitude;
CLLocationDegrees longitude;
} CLLocationCoordinate2D;
@property(readonly, nonatomic) CLLocationDistance altitude;
海拔高度,浮点型
@property(readonly, nonatomic) CLLocationAccuracy horizontalAccuracy;
水平方向的容错半径
@property(readonly, nonatomic) CLLocationAccuracy verticalAccuracy;
竖直方向的容错半径
@property(readonly, nonatomic) CLLocationDirection course;
设备前进的方向,取值范围为0-359.9,相对正北方向
@property(readonly, nonatomic) CLLocationSpeed speed;
速度,单位为m/s
@property(readonly, nonatomic, copy) NSDate *timestamp;
定位时的时间戳
CLHeading对象的属性信息:
@property(readonly, nonatomic) CLLocationDirection magneticHeading;
设备朝向航标方向,0为北磁极。
@property(readonly, nonatomic) CLLocationDirection trueHeading;
设备朝向真实方向,0被地理上的北极
@property(readonly, nonatomic) CLLocationDirection headingAccuracy;
方向偏差
@property(readonly, nonatomic) CLHeadingComponentValue x;
x轴的方向值
@property(readonly, nonatomic) CLHeadingComponentValue y;
y轴方向值
@property(readonly, nonatomic) CLHeadingComponentValue z;
z轴方向值
@property(readonly, nonatomic, copy) NSDate *timestamp;
方向定位时间戳
标签:
原文地址:http://www.cnblogs.com/YU411524/p/5228146.html