CoreLocation框架可用于定位设备当前经纬度,通过该框架,应用程序可通过附近的蜂窝基站,WIFI信号或者GPS等信息计算用户位置。
iOS定位支持的3种模式。
(1)GPS卫星定位
(2)基站定位
(3)WiFi
iOS开发者使用CoreLocation.framework框架进行定位非常简单,CoreLocation框架的常用API主要有如下几个。
(1)CLLocationManger:定位管理器类。
(2)CLLocationManagerDelegate:该协议代表定位管理器的delegate协议。实现该协议的对象可负责处理CLLocationManager的定位事件。
(3)CLLocation:该对象代表位置。该对象包含了当前设备的经度、纬度、高度、速度、路线等信息,还包含了该定位信息的水平精确度,垂直精确度以及时间戳信息。
(4)CLHeading:该对象代表设备的移动方向。
(5)CLRegion:该对象代表一个区域。一般程序不会直接使用该类,而是使用它的两个子类,即CLCircularRegion(圆形区域)和CLBeaconRegion(蓝牙信号区)。
1.获取位置信息
(1)创建CLLocationManager对象,该对象负责获取定位相关信息。并为该对象设置一些必要的属性。
(2)为CLLocationManager指定delegate属性,该属性值必须是一个实现CLLocationManagerDelegate协议的对象。实现CLLocationManagerDelegate协议时可根据需要实现协议中特定的方法。
(3)调用CLLocationManager的startUpdatingLocation方法获取定位信息。定位结束时,可调用stopUpdatingLocation方法结束获取定位信息。
1、将CoreLocation.framework添加到项目中
2、在iOS8中需要在info.plist中添加两个字段。
方向监测
拥有GPS硬件的设备可以生成设备的当前方向(course属性)和速度信息。iPhone设备携带的定位管理器可以返回一个已经计算好的course 值,通过这个值我们可以获得当前前进的方向,course值是0~360之间的浮点数,0°值表示正北方向,90°表示正东方向,180°值表示正南方 向,270°值表示正西方向,程序可以通过course值来检测用户位置的移动方向。除此之外,还可以通过磁力计来获取设备的真实方向。
使用CLLocationManager获取设备方向的步骤如下。
1.创建CLLocationManager对象,该对象负责获取定位相关信息,并为该对象设置一些必要的属性。
2.为CLLocationManager指定delegate属性,该属性值必须是一个实现CLLocationManagerDelegate协议的对象。实现CLLocationManagerDelegate协议时可根据需要实现协议中特定的方法。
3.调用CLLocationManager的startUpdatingHeading方法获取方向信息。获取方向结束时,可调用stopUpdatingHeading方法结束时获取方向信息。
当设备的方向改变时,iOS系统就会自动激发CLLocationManager的delegate对象的locationManager:didUpdateHeading:方法,而程序可通过重写该方法来获取设备方向。
iOS允许为检测方向改变设置如下属性。
1)CLLocationDegress headingFilter:设置只有当设备方向的改变值超过该属性值时才激发delegate的方法。
2)CLDeviceOrientation headingOrientation:设置设备当前方向。
监听方向时返回的是一个CLHeading对象,该对象包含以下属性。
1)magnticHeading:该属性返回设备与磁北的相对方向。
2)trueHeading:该属性返回设备与真北的相对方向。
3)headingAccuracy:该属性返回方向值的误差范围。
4)timestamp:该属性返回方向值的生成时间。
区域监测
如果希望iOS设备进入某个区域发出通知,那么这种区域监测的功能也被称为临近警告。
用户设备不断地临近指定固定点,当与该固定点的距离小于指定范围时,系统可以触发相应的处理。用户设备离开指定固定点,当与该固定点的距离大于指定范围时,系统也可以触发相应的处理。
iOS的区域监测同样可以使用CLLocationManager来实现,监听设备是否进入/离开某个区域的步骤如下:
1)创建CLLocationManager对象,该对象负责获取定位相关信息,并未该对象设置一些必要的属性。对于区域监测而言,CLLocationManager对象需要设置monitoredRegions属性,该属性值用于设置该设备监听的多个区域。
2)为CLLocationManager指定delegate属性,该属性值必须是一个实现CLLocationManagerDelegate协议的对象。实现CLLocationManagerDelegate协议时可根据需要实现协议中特定的方法。
3)调用CLLocationManager的startMonitoringForRegion:方法进行区域监测。区域监测结束时,可调用stopMonitoringForRegion:方法结束区域监测。
CoreLocation具体详细用法代码
#import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewController ()<CLLocationManagerDelegate> @property (nonatomic,strong) CLLocationManager *mange; @end @implementation ViewController -(CLLocationManager *)mange { if (!_mange) { //创建定位管理器 _mange = [[CLLocationManager alloc]init]; /* extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);导航定位 extern const CLLocationAccuracy kCLLocationAccuracyBest;精准定位 extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;精确度十米 extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters; extern const CLLocationAccuracy kCLLocationAccuracyKilometer; extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;一英里 */ //定位精确度,精确度越高越耗电 _mange.desiredAccuracy = kCLLocationAccuracyBest; //定位的更新频率,单位为米 _mange.distanceFilter = 5; _mange.delegate = self; } return _mange; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //iOS8之后开启定位需要执行这个方法或者,而且还要配置info.plist CGFloat systemVersion = [UIDevice currentDevice].systemVersion.floatValue; if (systemVersion>=8.0) { [self.mange requestAlwaysAuthorization]; } //2.判断方法能否执行 // if ([self.mange respondsToSelector:@selector(requestAlwaysAuthorization)]) { // // [self.mange requestAlwaysAuthorization]; // } //3.判断定位按钮是否打开 if (![CLLocationManager locationServicesEnabled]) { NSLog(@"请打开地图导航按钮...亲"); } else { //获取当前定位的状态 CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; //如果定位状态未打开 if(status == kCLAuthorizationStatusNotDetermined) { //前端定位 [self.mange requestAlwaysAuthorization]; } } //开启定位 [self.mange startUpdatingLocation]; } -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations { CLLocation *location = [locations lastObject]; // 经纬度 CLLocationCoordinate2D coordinate = location.coordinate; NSLog(@"经度为:%f,纬度为:%f",coordinate.longitude,coordinate.latitude); //当定位成功后,这个代理只执行一次,所有停止位置更新 [manager stopUpdatingLocation]; }