CoreLocation定位技术

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];

}

 

 
posted @ 2016-03-29 19:44  往事亦如风  阅读(1072)  评论(0编辑  收藏  举报