zoukankan      html  css  js  c++  java
  • 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];
    
    }
     
  • 相关阅读:
    微信小程序HTTPS
    微信商城-1简介
    va_list
    Event log c++ sample.
    EVENT LOGGING
    Analyze Program Runtime Stack
    unknow table alarmtemp error when drop database (mysql)
    This application has request the Runtime to terminate it in an unusual way.
    How to check if Visual Studio 2005 SP1 is installed
    SetUnhandledExceptionFilter
  • 原文地址:https://www.cnblogs.com/ldnh/p/5334217.html
Copyright © 2011-2022 走看看