IOS定位服务的应用

简介:

IOS定位服务的应用

一、授权的申请与设置

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

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

112130_maRK_2340880.png

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

- (void)requestAlwaysAuthorization;

- (void)requestWhenInUseAuthorization;

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

二、定位服务相关方法

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

112450_1NAE_2340880.png

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

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

方向定位时间戳

目录
相关文章
|
2月前
|
搜索推荐 API 开发工具
打造个性化天气应用:从零开始的iOS开发之旅
【8月更文挑战第31天】本文是一篇针对初学者的iOS应用开发指南,将引导读者通过Swift和iOS SDK构建一个简单而美观的天气应用。我们将探索如何利用API获取实时天气数据,并在应用中实现用户友好的界面设计。文章不仅包括代码示例,还提供了设计理念和用户体验优化的建议,旨在帮助初学者理解iOS开发的基础知识,并激发他们创造个性化应用的兴趣。
|
2月前
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
10天前
|
存储 IDE 开发工具
移动应用开发之旅:打造你的首个iOS应用
【9月更文挑战第23天】在数字化浪潮中,移动应用已成为连接用户与数字世界的关键桥梁。本文将带领读者踏上开发属于自己的第一个iOS移动应用的旅程,从理解移动操作系统的核心概念出发,逐步深入到实际的应用构建过程中。通过简洁明了的语言和具体的代码示例,我们将一起探索如何在苹果的iOS平台上实现一个简单的“待办事项列表”应用,让读者不仅能够学习到编程知识,还能体会到将想法转化为现实产品的成就感。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供一个实用的指南,帮助你迈出成为移动应用开发者的第一步。
|
23天前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
47 5
|
28天前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
39 11
|
1月前
|
API iOS开发
探索iOS开发:打造你的第一个天气应用
【8月更文挑战第31天】 在这篇文章中,我们将一起潜入iOS开发的海洋,从初学者的角度出发,一步步构建我们自己的天气应用。通过实际的项目实践,你将学习到如何获取网络数据、如何在界面上展示这些数据,以及如何处理用户交互。文章以通俗易懂的语言,结合代码示例,引导你理解并实现一个简单天气应用的核心功能。无论你是编程新手还是希望扩展你的iOS开发技能,这篇文章都将为你提供宝贵的指导和启发。
|
2月前
|
存储 JSON API
探索iOS开发:打造你的第一个天气应用
【8月更文挑战第31天】在这篇文章中,我们将踏上一段激动人心的旅程,从零开始构建一个iOS天气应用。通过这一过程,我们不仅能够掌握Swift编程语言的核心概念,还能深入理解如何与API进行交互以及如何在App Store上发布我们的杰作。无论你是编程新手还是希望扩展你的技能库,这个项目都将为你提供一个实践的平台。让我们携手进入iOS开发的奇妙世界,一步步实现自己的想法,并最终将它们变为现实。
|
2月前
|
测试技术 虚拟化 iOS开发
iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone
这篇文章是iOS自动化测试方案的第二部分,详细介绍了在Xcode开发者工具中构建WebDriverAgent(WDA)应用到iPhone的全过程,包括环境准备、解决构建过程中可能遇到的错误,以及最终成功安装WDA到设备的方法。
95 0
iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone
|
2月前
|
Swift iOS开发 UED
【绝妙创意】颠覆你的视觉体验!揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【8月更文挑战第13天】本文通过一个具体案例,介绍如何使用Swift与UIKit在iOS应用中创建独特的按钮动画效果。当按钮被按下时,其形状从圆形变化为椭圆形,颜色则从蓝色渐变为绿色;释放后,动画反向恢复原状。利用UIView动画方法及弹簧动画效果,实现了平滑自然的过渡。通过调整参数,开发者可以进一步优化动画体验,增强应用的互动性和视觉吸引力。
40 7
|
25天前
|
开发工具 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的关键考量
在数字时代的浪潮中,安卓和iOS这两大操作系统如同双子星座般耀眼夺目,引领着移动应用的潮流。它们各自拥有独特的魅力和深厚的用户基础,为开发者提供了广阔的舞台。然而,正如每枚硬币都有两面,安卓与iOS在开发过程中也展现出了截然不同的特性。本文将深入剖析这两者在开发环境、编程语言、用户体验设计等方面的显著差异,并探讨如何根据目标受众和项目需求做出明智的选择。无论你是初涉移动应用开发的新手,还是寻求拓展技能边界的资深开发者,这篇文章都将为你提供宝贵的见解和实用的建议,帮助你在安卓与iOS的开发之路上更加从容自信地前行。