IOS定位服务的应用

简介: IOS定位服务的应用

IOS定位服务的应用


一、授权的申请与设置


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


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

image.png



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


- (void)requestAlwaysAuthorization;


- (void)requestWhenInUseAuthorization;


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


二、定位服务相关方法


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

image.png



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


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


方向定位时间戳

目录
相关文章
|
10月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
966 4
|
11月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
11月前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
200 1
|
搜索推荐 API 开发工具
打造个性化天气应用:从零开始的iOS开发之旅
【8月更文挑战第31天】本文是一篇针对初学者的iOS应用开发指南,将引导读者通过Swift和iOS SDK构建一个简单而美观的天气应用。我们将探索如何利用API获取实时天气数据,并在应用中实现用户友好的界面设计。文章不仅包括代码示例,还提供了设计理念和用户体验优化的建议,旨在帮助初学者理解iOS开发的基础知识,并激发他们创造个性化应用的兴趣。
|
6月前
|
iOS开发 开发者 Windows
uniapp云打包ios应用证书的获取方法,生成指南
打包用到的一共两个文件,一个是p12格式的私钥证书,一个是证书profile文件。其中生成p12证书的时候,按照官网的教程,是需要MAC电脑来协助做的,主要是生成一些csr文件和导出p12证书等。其实这些步骤也可以借助一些其他的工具来实现,不一定使用mac电脑,用windows电脑也可以创建。
838 0
|
10月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
230 2
|
10月前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
10月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
188 1
|
11月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
160 5
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
173 32