关于CoreLocation定位服务的简单使用

在我们发微博,发表空间内容,以及在朋友圈发表动态的时候,会发现有一个位置信息的控件。iOS中是如何定位我们的位置信息的呢?基于此写一个小Demo,供大家参考使用。

在iOS中,用于定位时需要我们导入以下框架:

#import <CoreLocation/CoreLocation.h>

该框架中的CLLocationManager类可以实时的获取我们位置的经纬度。 CLLocationManager相当于一个位置管家,常用的属性和方法有:

(1)每隔多少米定位一次

@property(assign, nonatomic) CLLocationDistance distanceFilter;

(2)定位的精确度

@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

(3)定位信息

@property(readonly, nonatomic, copy) CLLocation *location;

(4)开始定位与关闭定位

- (void)startUpdatingLocation;
- (void)stopUpdatingLocation;

CLLocation类是用来表示某一位置的经纬度,常用属性有和方法:

(1)经纬度

@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

//(2)海波高度
@property(readonly, nonatomic) CLLocationDistance altitude;

(3)路线,航向 (范围在 0.0°~359.9°,0° 是正北 方向)

@property(readonly, nonatomic) CLLocationDirection course;

(4)行走速度

@property(readonly, nonatomic) CLLocationSpeed speed;

(5)计算两个位置之间的距离

- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location

CLLocationCoordinate2D 是一个枚举类型

<span style="font-size:14px;">typedef struct {
	CLLocationDegrees latitude;    // 纬度
	CLLocationDegrees lo</span><span style="font-family: Menlo;"><span style="font-size:12px;">ngitude;   // 经度</span></span><span style="font-size:14px;">
} CLLocationCoordinate2D;</span>


typedef double CLLocationDistance;

< Demo如下 >:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 是否打开定位服务
    if ([CLLocationManager locationServicesEnabled]) {
        NSLog(@"开启定位服务");
    } else {
        NSLog(@"没有开启定位服务");
    }
    
    // 创建manager
    locationManager = [[CLLocationManager alloc] init];
    // 设置代理
    locationManager.delegate = self;
    
    if ([[UIDevice currentDevice].systemVersion floatValue] > 8.0) {
        /*
         kCLAuthorizationStatusNotDetermined = 0,   // 用户还没决定 要不要授权
         kCLAuthorizationStatusRestricted,          // 应用程序受限制,没有授权
         kCLAuthorizationStatusDenied,              // 被用户拒绝授权
         kCLAuthorizationStatusAuthorizedAlways,    // 始终
         kCLAuthorizationStatusAuthorizedWhenInUse  // 使用应用程序期间
         */
        
        // 如果程序定位设置不是 使用应用程序期间,则设置为 使用应用程序期间
        if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorizedWhenInUse) {
            [locationManager requestWhenInUseAuthorization];
        }
    }
    
    // 设置精确度,精度越高越耗电!
    [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
    [locationManager startUpdatingLocation];
    
    // 定位频率,每隔10米定位一次
    CLLocationDistance distance = 10.0;
    locationManager.distanceFilter = distance;

}

 
注意:用户授权APP访问定位服务 

     1.不允许访问 2.使用应用程序期间 3.后台(始终)

     iOS8 app想要获取定位,必须申请授权,在info.plist中添加:

     NSLocationAlwaysUsageDescription 始终

     NSLocationWhenInUseUsageDescription使用应用程序期间

< Delegate >:

#pragma mark - CLLocationManagerDelegate
/**
 *  实时定位,当定位到用户的位置时,就会调用
 */
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{   
    // locations数组里边存放的是CLLocation对象,一个CLLocation对象就代表着一个位置
    for (CLLocation *newLocation in locations) {
     
     //拿到经纬度
     CLLocationCoordinate2D coor2D = newLocation.coordinate;
     NSLog(@"纬度为:%f, 经度为:%f", coor2D.latitude, coor2D.longitude);
     
     //海拔高度
     CLLocationDistance altitude = newLocation.altitude;
     NSLog(@"高度为:%f", altitude);
     
     //水平精确度, 垂直精确度
     CLLocationAccuracy horizontalAcc = newLocation.horizontalAccuracy;
     CLLocationAccuracy verticalAcc = newLocation.verticalAccuracy;
     NSLog(@"%f, %f", horizontalAcc, verticalAcc);
     
     //北京站 经纬度
     CLLocation *anyLocation = [[CLLocation alloc] initWithLatitude:39.909843 longitude:116.433015];
     CLLocationDistance distance = [newLocation distanceFromLocation:anyLocation];
     NSLog(@"当前位置到北京站的距离为:%f米", distance);
     
     
     //位置反编码(根据当前的经纬度获取具体的位置信息)
     CLGeocoder *geocoder = [[CLGeocoder alloc] init];
     [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
     
     for (CLPlacemark *placeMark in placemarks) {
     NSLog(@"位置:%@", placeMark.name);
     NSLog(@"街道:%@", placeMark.thoroughfare);
     NSLog(@"子街道:%@", placeMark.subThoroughfare);
     NSLog(@"市:%@", placeMark.locality);
     NSLog(@"区\\县:%@", placeMark.subLocality);
     NSLog(@"行政区:%@", placeMark.administrativeArea);
     NSLog(@"国家:%@", placeMark.country);
     }
     }];
     
     //停止定位,定位是一个很耗能的功能,在不需要时应当停止定位
     [manager stopUpdatingLocation];
    }
}


注意:在调用CLLocationManagerDelegate的时候,很多人会出现程序运行时,并没有进入到Delegate方法里。

    (1)确定在程序第一次运行时弹出的提示框,你是否选择了允许,如果没有此时你应当去查看你的模拟器设置->隐私->位置->当前程序->是否允许位置信息<建议选中『使用应用程序期间』>



   (2)方法(1)确认过后,还是没解决,此时查看你的程序的Supporting Files->info.plist 文件,是否添加了:

        NSLocationWhenInUseUsageDescription 或者 NSLocationAlwaysUsageDescription



   (3)若以上方法都试过了,还是没有进入到Delegate方法里,那么你该检查一下你的程序了

检查没问题?!好吧,下面来看看小编犯的错误:

#pragma mark - startUpdatingHeading 和 startUpdatingLocation 及其类似啊,别写错了
//    [locationManager startUpdatingHeading];
    [locationManager startUpdatingLocation];
如果此时你发现错得和小编一样的话, 偷笑 请下次一定要提防着 Xcode 的了,因为你稍不留神 敲出 startupdat , 然后潇洒的按下TAB键或者回车的时候,错误就已经产生了,若不一个字母一个字母的检查,你还真找不出问题所在!

- (void)startUpdatingLocation; // 是开始定位
- (void)startUpdatingHeading;  // 是更新方向

开发 路上与君共勉,编程一定要严谨


附上查阅资料时看到的一篇定位文章:一篇关于CoreLocation定位的文章点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值