CoreLocation框架的使用

CoreLocation框架使用前提

导入主头文件: CoreLocation/CoreLocation.h

CoreLocation框架使用须知:
  1. CoreLocation框架中所有数据类型的前缀都是CL
  2. CoreLocation中使用CLLocationManager对象来做用户定位
CLLocationManager的常用操作

开始用户定位
- (void)startUpdatingLocation;

停止用户定位
- (void) stopUpdatingLocation;

当调用了startUpdatingLocation方法后,就开始不断地定位用户的位置,中途会频繁地调用代理的下面方法
- (void)locationManager:(CLLocationManager )manager didUpdateLocations:(NSArray )locations;
locations参数里面装着CLLocation对象

CLLocation的属性

CLLocation用来表示某个位置的地理信息,比如经纬度、海拔等等
@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;
经纬度
@property(readonly, nonatomic) CLLocationDistance altitude;
海拔
@property(readonly, nonatomic) CLLocationDirection course;
路线,航向(取值范围是0.0° ~ 359.9°,0.0°代表真北方向)
@property(readonly, nonatomic) CLLocationSpeed speed;
行走速度(单位是m/s)

用- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location方法可以计算2个位置之间的距离

CLLocationManager的属性

@property(assign, nonatomic) CLLocationDistance distanceFilter;
每隔多少米定位一次
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;
定位精确度(越精确就越耗电)

CLLocationCoordinate2D

CLLocationCoordinate2D是一个用来表示经纬度的结构体,定义如下
typedef struct {
CLLocationDegrees latitude; // 纬度
CLLocationDegrees longitude; // 经度
} CLLocationCoordinate2D;

一般用CLLocationCoordinate2DMake函数来创建CLLocationCoordinate2D

用户隐私的保护

从iOS 6开始,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权
要想获得用户的位置
想访问用户的通讯录、日历、相机、相册等等

当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权

开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)
一旦用户选择了“Don’t Allow”,意味着你的应用以后就无法使用定位功能
为了严谨起见,最好在使用定位功能之前判断当前应用的定位功能是否可用
CLLocationManager有个类方法可以判断当前应用的定位功能是否可用
+ (BOOL)locationServicesEnabled;

示例代码:

引入头文件并声明属性:

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>// 倒入地图框架

@interface ViewController ()<CLLocationManagerDelegate>// 遵守协议

@property (nonatomic, strong) CLLocationManager *manager;//  定位管理类对象(定位用户的位置)

@end

懒加载创建属性:

- (CLLocationManager *)manager{ // 1.创建位置管理器(定位用户的位置)
    if (_manager == nil) {
        _manager = [[CLLocationManager alloc]init];
        self.mnager.delegate = self;  // 设置代理
    }
    return _manager;
}

在 - (void)viewDidLoad{}方法里熟悉代码,开启定位,设置相关属性

- (void)viewDidLoad {
    [super viewDidLoad];

    // 请求用户是否允许使用定位功能(先去info.plist文件里配置(NSLocationAlwaysUsageDescription)
    // NSLocationWhenInUsageDescription/NSLocationAlwaysUsageDescription(两种定位方式)
    [self.manager requestAlwaysAuthorization];

    if ([CLLocationManager locationServicesEnabled]) {// 如果定位服务能用

        [self.manager startUpdatingLocation]; // 开启定位
        self.manager.distanceFilter = 100;// 定位过滤 每隔多少米定位一次(不需要频繁定位时)
        // 定位精度,精度越高越耗电
        self.manager.desiredAccuracy = kCLLocationAccuracyHundredMeters;

    } else {// 不能定位用户位置
        // 告诉用户检查网络状况 或者 提醒用户开启定位功能

    }
    [self countDistance];// 调用获取两点距离的方法

}

获取两点间距离

- (void)countDistance
{
    CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:40 longitude:116];
    CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:41 longitude:116];

    CLLocationDistance distance = [loc1 distanceFromLocation:loc2];
    NSLog(@"(%@)和(%@)的距离:%f", loc1, loc2, distance);
}

定位到用户位置时调用此代理方法

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{

    // 数组里面存放的是CLLocation对象, 一个CLLocation对象就代表一个位置
    CLLocation *location = locations.lastObject;
    // 纬度:location.coordinate.latitude
    // 经度:location.coordinate.longitude
     NSLog(@"纬度=%f, 经度=%f", location.coordinate.latitude, location.coordinate.longitude);

    // 停止更新位置(不用定位服务时,应当马上停止定位服务,定位服务时比较好点的)
    [self.manager stopUpdatingLocation];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值