IOS定位服务的应用

Wesley13
• 阅读 518

IOS定位服务的应用

一、授权的申请与设置

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

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

IOS定位服务的应用

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

- (void)requestAlwaysAuthorization;

- (void)requestWhenInUseAuthorization;

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

二、定位服务相关方法

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

IOS定位服务的应用

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

#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的枚举如下:

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

@property(assign, nonatomic) CLActivityType activityType;

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

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;

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

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是一个结构体,如下:

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;

方向定位时间戳

如有疏漏 欢迎指正

学习使用 欢迎转载

专注技术,热爱生活,交流技术,也做朋友。

——珲少 QQ群:203317592

点赞
收藏
评论区
推荐文章
技术小男生 技术小男生
6个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
6个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
凯文86 凯文86
2年前
Spring Cloud OAuth2 微服务认证授权
OAuth2.0是用于授权的行业标准协议,它致力于简化客户端开发人员的工作,同时为Web应用、桌面应用、移动应用等各种客户端应用提供了特定的授权流程。本文讲解如何使用OAuth2协议来授权客户端应用访问SpringCloud微服务。微服务认证授权概述单点登录相比于单体应用,微服务应用需要在多个服务之间共享
Wesley13 Wesley13
1年前
iOS定位原理以及纠偏的一些建议
介绍之前,先声明一下关于地图加加的“偏移修正”功能,地图加加可以对齐中国地区(地点、线路和照片的)坐标和中国地图之间的偏移,这个是我国测绘法规要求的一个数学意义的偏移,每个地方的偏移是固定的,法定的,和当前定位的方式、定位的精度与准确度没有任何关系。即地图加加只对齐偏移,并不能提升、降低或者改变iOS定位的速度、精度和规则,也没有任何App可以做到或者
Wesley13 Wesley13
1年前
IOS之地图和定位应用开发
11.1iOS定位服务iOS中有三个定位服务组件:  Wifi定位,通过查询一个Wifi路由器的地理位置的信息。比较省电,iPodtouch和iPad也可以采用。  蜂窝基站定位,通过移动运用商基站定位。也适合有3G版本的iPodtouch和iPad。  GPS卫星定位,通过34颗GPS定位位置
Stella981 Stella981
1年前
PhoneGap设置Icon
参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi
Stella981 Stella981
1年前
Python自动化测试PO模式
页面元素定位信息页面元素定位信息文件leadscloud_logininput_user_namexpath//@id'main'/div/div2/div2/div2/div/form/div1/div/div/inputinput_user_passwordx
Stella981 Stella981
1年前
App的定位和目标
 在企业开发App之前,就应该明白好App的定位和目的。下面就App的定位和目的做剖析:  首先我们要明白,App的定位是指企业预估App在用户心目中的位置和形象。而目的是指企业希望经过这个App完成的什么效果。  App的定位和目的是相辅相成的关系,目的是定位的引导,定位精确才能完成目的。对于App的定位来说,有企业战略工具、企业员
Stella981 Stella981
1年前
Dubbo 整合 Pinpoint 做分布式服务请求跟踪
在使用Dubbo进行服务化或者整合应用后,假设某个服务后台日志显示有异常,这个服务又被多个应用调用的情况下,我们通常很难判断是哪个应用调用的,问题的起因是什么,因此我们需要一套分布式跟踪系统来快速定位问题,Pinpoint可以帮助我们快速定位问题(当然,解决方案也不止这一种)。什么是Pinpoint摘自Pinpoint学习笔记
Stella981 Stella981
1年前
CSS的相对定位和绝对定位(position)
什么是定位呢?定位(position),故名思议,就是确定元素在页面中的位置。CSS的常用定位有两种,一种是相对定位,一种是绝对定位。下面我们看例子1.<html2.<head3.<style4.div0{5./设置背景色为黄色/6.backgrou