• IOS定位服务的应用


    IOS定位服务的应用

    一、授权的申请与设置

    在IOS8之后,IOS的定位服务做了优化,若要使用定位服务,必须先获取用户的授权。

    首先需要在info.plist文件中添加一个键:NSLocationAlwaysUsageDescription或者NSLocationWhenInUseUsageDescription。其中NSLocationAlwaysUsageDescription是要始终使用定位服务,NSLocationWhenInUseUsageDescription是只在前台使用定位服务。

    IOS8中CLLocationManager新增的两个新方法:

    - (void)requestAlwaysAuthorization;

    - (void)requestWhenInUseAuthorization;

    这两个方法对应上面的两个键值,用于在代码中申请定位服务权限。

    二、定位服务相关方法

    IOS的定位服务在CoreLocation.framework框架内,首先引入这个框架:

    开启定位服务的代码非常简单,示例如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #import "ViewController.h"
    #import <CoreLocation/CoreLocation.h>
    @interface ViewController ()<CLLocationManagerDelegate>//定位服务的代理
    @end
     
    @implementation ViewController
     
    - (void)viewDidLoad {
        [super viewDidLoad];
        CLLocationManager* manager = [[CLLocationManager alloc]init];//初始化一个定位管理对象
        [manager requestWhenInUseAuthorization];//申请定位服务权限
        manager.delegate=self;//设置代理
        [manager startUpdatingLocation];//开启定位服务
    }
    //定位位置改变后调用的函数
    -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
        NSLog(@"%@",locations);
    }
    @end

    CLLocationManager相关方法解读:

    + (BOOL)locationServicesEnabled;

    判断设备是否支持定位服务

    + (BOOL)headingAvailable;

    判断设备是否支持航向信息功能(海拔,速度,方向等传感器的支持)

    + (BOOL)significantLocationChangeMonitoringAvailable;

    判断设备是否支持更新位置信息

    + (BOOL)isMonitoringAvailableForClass:(Class)regionClass;

    判断设备是否支持区域检测,regionClass是地图框架中的类。

    + (BOOL)isRangingAvailabl;

    判断设备是否支持蓝牙测距

    + (CLAuthorizationStatus)authorizationStatus;

    获得定位服务的授权状态,CLAuthorizationStatus的枚举如下:

    1
    2
    3
    4
    5
    6
    7
    typedef NS_ENUM(int, CLAuthorizationStatus) {
        kCLAuthorizationStatusNotDetermined = 0,//用户还没有做选择
        kCLAuthorizationStatusRestricted,//应用拒接使用定位服务
        kCLAuthorizationStatusDenied,//用户拒绝授权
        kCLAuthorizationStatusAuthorizedAlways,//8.0后可用,始终授权位置服务
        kCLAuthorizationStatusAuthorizedWhenInUse,//8.0后可用,只在前台授权位置服务
    };

    @property(assign, nonatomic) CLActivityType activityType;

    这个属性用来设置位置更新的模式,枚举如下:

    1
    2
    3
    4
    5
    6
    typedef NS_ENUM(NSInteger, CLActivityType) {
        CLActivityTypeOther = 1,//未知模式,默认为此
        CLActivityTypeAutomotiveNavigation,    //车辆导航模式
        CLActivityTypeFitness,                //行人模式
        CLActivityTypeOtherNavigation         //其他交通工具模式
    };

    模式的应用可以起到节省电量的作用,例如车辆导航模式,当汽车停止时,位置更新服务会暂停。

    @property(assign, nonatomic) CLLocationDistance distanceFilter;

    设置位置更新的敏感范围,单位为米。

    @property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

    设置定位服务的精确度,系统定义好的几个参数如下:

    kCLLocationAccuracyBestForNavigation;//导航最高精确
    kCLLocationAccuracyBest;//高精确
    kCLLocationAccuracyNearestTenMeters;//10米
    kCLLocationAccuracyHundredMeters;//百米
    kCLLocationAccuracyKilometer;//千米
    kCLLocationAccuracyThreeKilometers;//三公里

    @property(assign, nonatomic) BOOL pausesLocationUpdatesAutomatically;

    设置位置更新是否自动暂停

    @property(readonly, nonatomic, copy) CLLocation *location;

    最后一次更新的位置信息,只读属性

    @property(assign, nonatomic) CLLocationDegrees headingFilter;

    相关航向更新的敏感范围

    @property(assign, nonatomic) CLDeviceOrientation headingOrientation;

    定位航向时的参照方向默认为正北,枚举如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef NS_ENUM(int, CLDeviceOrientation) {
        CLDeviceOrientationUnknown = 0,//方向未知
        CLDeviceOrientationPortrait,//纵向模式
        CLDeviceOrientationPortraitUpsideDown,//纵向倒置模式
        CLDeviceOrientationLandscapeLeft,//左向横向模式
        CLDeviceOrientationLandscapeRight,//右向横向模式
        CLDeviceOrientationFaceUp,//水平屏幕向上模式
        CLDeviceOrientationFaceDown//水平屏幕下模式
    };

    @property(readonly, nonatomic, copy) CLHeading *heading;

    最后一个定位得到的航向信息

    - (void)startUpdatingLocation;

    开启定位服务

    - (void)stopUpdatingLocation;

    停止定位服务

    - (void)startUpdatingHeading;

    开启航向地理信息服务

    - (void)stopUpdatingHeading;

    停止航向地理信息服务

    三、定位服务代理的相关方法

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

    位置更新后调用的方法,数组中是所有定位到的位置信息,最后一个是最新的。

    - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading;

    航向信息更新后调用的方法

    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error;

    定位异常时调用的方法

    四、定位服务获取到的位置对象

    上面也提到,定位后返回的数组中存放的都是CLLocation对象,这里面有很详细的位置信息,属性如下:

    @property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

    经纬度属性,CLLocationCoordinate2D是一个结构体,如下:

    1
    2
    3
    4
    typedef struct {
        CLLocationDegrees latitude;//纬度
        CLLocationDegrees longitude;//经度
    } CLLocationCoordinate2D;

    @property(readonly, nonatomic) CLLocationDistance altitude;

    海拔高度,浮点型

    @property(readonly, nonatomic) CLLocationAccuracy horizontalAccuracy;

    水平方向的容错半径

    @property(readonly, nonatomic) CLLocationAccuracy verticalAccuracy;

    竖直方向的容错半径

    @property(readonly, nonatomic) CLLocationDirection course;

    设备前进的方向,取值范围为0-359.9,相对正北方向

    @property(readonly, nonatomic) CLLocationSpeed speed;

    速度,单位为m/s

    @property(readonly, nonatomic, copy) NSDate *timestamp;

    定位时的时间戳

    五、航标定位得到的航标信息对象

    CLHeading对象的属性信息:

    @property(readonly, nonatomic) CLLocationDirection magneticHeading;

    设备朝向航标方向,0为北磁极。

    @property(readonly, nonatomic) CLLocationDirection trueHeading;

    设备朝向真实方向,0被地理上的北极

    @property(readonly, nonatomic) CLLocationDirection headingAccuracy;

    方向偏差

    @property(readonly, nonatomic) CLHeadingComponentValue x;

    x轴的方向值

    @property(readonly, nonatomic) CLHeadingComponentValue y;

    y轴方向值

    @property(readonly, nonatomic) CLHeadingComponentValue z;

    z轴方向值

    @property(readonly, nonatomic, copy) NSDate *timestamp;

    方向定位时间戳

  • 相关阅读:
    互联网公司笔试常见陷阱
    华为机试题(地铁换乘,图的应用)
    容器(vector)、数组、new创建的动态数组,你到底用哪一个(执行效率分析)
    SpringMVC全局异常
    github commit contributions无记录
    elasticSearch之查询
    nginx负载均衡策略
    docker入门
    解决centos&win安装安装elasticSearch无法运行
    2017年终总结
  • 原文地址:https://www.cnblogs.com/On1Key/p/5301269.html
Copyright © 2020-2023  润新知