• 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];
    
    }
     
  • 相关阅读:
    中断 异常 系统调用的比较
    线性结构-线性表
    数据结构引例
    友链
    投喂
    给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列
    C++类内存分布
    内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
    C++内存管理学习笔记(7)
    C++内存管理学习笔记(6)
  • 原文地址:https://www.cnblogs.com/ldnh/p/5334217.html
Copyright © 2020-2023  润新知