现在的移动设备很多都提供定位服务,使用iOS系统的iPhone、iPod Touch和iPad都可以提供位置服务,iOS设备能提供3种不同途径进行定位:Wifi, 蜂窝式移动电话基站, GPS卫星

iOS 不像Android系统在定位服务编程时,可以指定采用哪种途径进行定位。iOS的API把底层这些细节屏蔽掉了,开发人员和用户并不知道现在设备是采用 哪种方式进行定位的,iOS系统会根据设备的情况和周围的环境,采用一套最佳的解决方案。这个方案是这样的,如果能够接收GPS信息,那么设备优先采用 GPS定位,否则采用Wifi或蜂窝基站定位,在Wifi和蜂窝基站之间优先使用Wifi,如果无法连接Wifi才使用蜂窝基站定位。

总体来说GPS定位优点是准确、覆盖面广阔,缺点是不能被遮挡(例如:在建筑物里面收不到GPS卫星信号)、GPS开启后比较费电。蜂窝基站不仅误差比较大,而且会耗费用户流量费。而Wifi定位是最经济实惠的。

定位服务编程

定 位服务在iOS 6之后API没有太大的变化,主要使用CoreLocation框架,定位时候主要使用CLLocationManager、 CLLocationManagerDelegate和CLLocation。CLLocationManager是定位服务管理类它能够给我们提供获得 设备的位置信息和高度信息,也可以监控设备进入或离开某个区域,它还可以帮助获得设备的运行方向等。CLLocationManagerDelegate 是CLLocationManager类委托协议。CLLocation类是封装了位置和高度信息。

在定位服务的应用中,第一次请求获得位置信息时候,系统会提示用户是否允许开启定位服务。用户所在的位置是比较私密的信息,应用获取这些信息用户是有知情权和否定权的。如果应用在用户不知情的情况下,而获得用户的位置信息,这在某些国家是违法的行为。

选择“不允许”,定位服务就无法获得位置信息了,如果想改变这些设置可以在系统设置应用中开启或关闭。

我们可以关闭所有的定位服务,只需要把最上面的“定位服务”开关控件关闭就可以了。下面的具体应用也可以关闭和开启。

下面我们通过一个案例介绍一下使用定位服务编程,在应用启动时候启动,进入画面时候会获得位置信息,并显示在对应的文本框中,如果设备位置发送变化,也会重新会的位置信息,并更新对应的文本框。

首先要实现定位服务的案例,需要为工程引入CoreLocation框架,添加具体步骤是选择工程中的TARGETS→WhereAmI→Build Phases→Link Binary With Libraries,选择右下角的“+”按钮,打开框架和库选择对话框

再添加对话框中选择CoreLocation.framework,点击Add按钮后添加完成。UI设计部分我们不再介绍。我们直接看看实现代码,其中主要代码是视图控制器ViewController中编写的,其中ViewController.h代码如下:

  1. #import <UIKit/UIKit.h>
  2. #import <CoreLocation/CoreLocation.h>
  3. #import <CoreLocation/CLLocationManagerDelegate.h>
  4. @interface ViewController : UIViewController <CLLocationManagerDelegate>
  5. //经度
  6. @property (weak, nonatomic) IBOutlet UITextField *txtLng;
  7. //纬度
  8. @property (weak, nonatomic) IBOutlet UITextField *txtLat;
  9. //高度
  10. @property (weak, nonatomic) IBOutlet UITextField *txtAlt;
  11. @property(nonatomic, strong) CLLocationManager *locationManager;
  12. @end

在h文件中首先需要引入<CoreLocation/CoreLocation.h> 和<CoreLocation/CLLocationManagerDelegate.h>头文件。然后在定义ViewController 时需要声明实现CLLocationManagerDelegate协议。我们还定义了 CLLocationManager *locationManager属性。

ViewController.m的viewDidLoad代码如下:

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. //定位服务管理对象初始化
  5. _locationManager = [[CLLocationManager alloc] init];
  6. _locationManager.delegate = self;
  7. _locationManager.desiredAccuracy = kCLLocationAccuracyBest; ①
  8. _locationManager.distanceFilter = 1000.0f;  ②
  9. }

在viewDidLoad方法中,主要对CLLocationManager的成员变量 _locationManager进行初始化。首先使用[[CLLocationManager alloc] init]语句实例化 CLLocationManager对象。然后_locationManager.delegate = self语句设置定位服务委托为self。第① 行代码设置desiredAccuracy属性,它是一个非常重要的属性,它的取值有6个常 量:kCLLocationAccuracyNearestTenMeters。精度10 米;kCLLocationAccuracyHundredMeters 。精度100 米;kCLLocationAccuracyKilometer 。精度1000 米;kCLLocationAccuracyThreeKilometers。精度3000米;kCLLocationAccuracyBest 。设备 使用电池供电时候,最高的精度;kCLLocationAccuracyBestForNavigation。导航情况下最高精度,一般要有外接电源时才 能使用;

精度越高请求获得位置信息的时间就越短,这就意味着设备越耗电。因此一个应用应该选择适合它的精度,如果你的应用是一个车载导航应 用,kCLLocationAccuracyBestForNavigation是比较好的选择,你可以使用汽车上的电瓶为设备供电。如果你的应用为徒步 旅行者提供的导航应用,kCLLocationAccuracyHundredMeters是一个不错的选择。

第②行代码设置distanceFilter属性,它是距离过滤器,它定义了设备移动更新位置信息的最小距离,它的单位是米,本例设置了1000米。

初始化CLLocationManager完成之后,需要使用startUpdatingLocation方法开始定位服务。它是在ViewController.m的viewWillAppear:方法中,代码如下:

  1. - (void)viewWillAppear:(BOOL)animated
  2. {
  3. [super viewWillAppear:animated];
  4. //开始定位
  5. [_locationManager startUpdatingLocation];
  6. }

调用startUpdatingLocation方法定位服务就会开启,它根据设定的条件,不断请求回调新的位置信 息。因此开启这个方法一定要慎重,要在最合适的时候开启,在视图控制器的声明周期方法中viewWillAppear:是最合适的。与开启服务对应的方法 是stopUpdatingLocation方法,它的调用是在视图控制器的viewWillDisappear:方法中调用的,代码如下:

  1. - (void)viewWillDisappear:(BOOL)animated
  2. {
  3. [super viewWillDisappear:animated];
  4. //停止定位
  5. [_locationManager stopUpdatingLocation];
  6. }

viewWillDisappear:在视图消失(应用退到后台)时调用,能够保证最及时地关闭定位服务,这是负责 任的做法。在iOS 6之后请求有所变化,定位服务应用退入台后可以延迟更新位置信息,其中 allowDeferredLocationUpdatesUntilTraveled:timeout:方法可以设置延迟更新,从而使得应用在后台不再 更新位置信息。关闭延迟更新使用disallowDeferredLocationUpdates方法实现。此外,在iOS 6之后新增 pausesLocationUpdatesAutomatically属性,它能设定自动暂停位置更新,定位服务的开启和暂停管理权交给系统,这样会更 加合理和简单。

一旦定位服务开启,并设置好了CLLocationManager委托属性delegate后,当用户设备移动到达过滤距离时,就会回调委托方法,与定位服务有关的方法有两个:

locationManager:didUpdateLocations: 定位成功,是iOS 6新方法,替代之前的locationManager:didUpdateToLocation:fromLocation:方法;

locationManager:didFailWithError: 定位失败;

实现CLLocationManager委托代码如下:

  1. #pragma mark Core Location委托方法用于实现位置的更新
  2. - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
  3. {
  4. CLLocation * currLocation = [locations lastObject]; ①
  5. _txtLat.text = [NSString stringWithFormat:@"%3.5f",
  6. currLocation.coordinate.latitude];  ②
  7. _txtLng.text = [NSString stringWithFormat:@"%3.5f",
  8. currLocation.coordinate.longitude];  ③
  9. _txtAlt.text = [NSString stringWithFormat:@"%3.5f",
  10. currLocation.altitude];  ④
  11. }
  12. - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
  13. {
  14. NSLog(@”error: %@”,error);
  15. }

在locationManager:didUpdateLocations:方法中参数locations是位置变 化的集合,它按照时间变化的顺序存放。如果想获得当前设备的位置,可以使用第①行的[locations lastObject]语句获得集合中最后一个 元素,它就是设备当前位置了。从集合中返回的对象类型是CLLocation,CLLocation封装了位置、高度等信息。在上面代码中我们使用了它的 两个属性:altitude和coordinate,altitude属性是高度值,coordinate是封装了经度和纬度的结构体 CLLocationCoordinate2D,CLLocationCoordinate2D定义如下:

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

其中latitude为经度信息,longitude为纬度信息,它们都是CLLocationDegrees类型,CLLocationDegrees是使用typedef定义的double类型。

第 ②行代码中的newLocation.coordinate.latitude表达式是获得设备当前的纬度,第③行代码中的 newLocation.coordinate.longitude表达式是获得设备当前的纬度,而获得高度可以使用第④行 newLocation.altitude表达式直接获得。

iOS 定位服务编程详解相关推荐

  1. iOS-NSThread编程详解

    note:文明看帖转载是对自己的尊重也是对学者的鼓励,欢迎批评讨论 iOS多线程-NSThread编程详解 再iOS开发中存在三种比较常用的实现多线程编程的方法,NSThread,NSOperatio ...

  2. iOS中ImageIO框架详解与应用分析

    2019独角兽企业重金招聘Python工程师标准>>> iOS中ImageIO框架详解与应用分析 一.引言 ImageIO框架提供了读取与写入图片数据的基本方法,使用它可以直接获取到 ...

  3. Oracle PL/SQL编程详解

    Oracle PL/SQL编程详解 - 古立 - 博客园 <我的网络摘抄本> 网摘/转载/备忘/随记 博客园 首页 新随笔 联系 管理 订阅 随笔- 84  文章- 0  评论- 0  & ...

  4. PHP SOCKET编程详解

    这篇文章主要介绍了PHP SOCKET编程详解,需要的朋友可以参考下 1. 预备知识 一直以来很少看到有多少人使用php的socket模块来做一些事情,大概大家都把它定位在脚本语言的范畴内吧,但是其实 ...

  5. java调用webservice_笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解...

    原标题:笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解 Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构.集群架构.分布式架构.SOA架构和微服务架构.下 ...

  6. [进阶] --- Python3 异步编程详解(史上最全篇)

    [进阶] - Python3 异步编程详解:https://blog.csdn.net/lu8000/article/details/45025987 参考:http://aosabook.org/e ...

  7. Linux 创建网页服务,Linux使用Node.js建立访问静态网页的服务实例详解

    Linux使用Node.js建立访问静态网页的服务实例详解 一.安装node.js运行所需要的环境,: 二.创建node目录(/node/www),并在目录下创建node.js服务文件server.j ...

  8. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...

  9. iOS APP上架流程详解

    iOS APP上架流程详解 青葱烈马 2016.04.28  前言:作为一名 iOS 开发工程师, APP 的上架是必备技能. iOS 上架的流程主要可以简单总结为: 一个包,两个网址,三个证书, 一 ...

最新文章

  1. 浅谈JDBC与ODBC的区别与应用
  2. 对软件工程与计算机科学之间区别的看法
  3. [机器学习] XGBoost参数调优完全指南(附Python代码)
  4. .Net Core 3.1,这匹黑马,2020年值得所有程序员重视!
  5. python打开软件输入消息_用Python编写一个私人助理程序,为我们起草电子邮件!...
  6. Linux常用命令集锦(一)
  7. 赵娜计算机,新学期 新起点 新征程——计算机学院2016级召开系列年级工作会议...
  8. Digilent提供的Pmod AD1驱动程序
  9. TED 你有拖延症吗?
  10. Linux定时任务-定时锁屏
  11. android listview 获取viewholder,Android ViewHolder 的基本使用
  12. Ant Design of Vue去掉加载遮罩
  13. 加工奶制品的生产计划
  14. QSlider功能作用和信号
  15. Mac系统关闭重启电脑后「重新打开应用及其窗口」功能的方法
  16. Mr. Ms. Mrs. Miss 的区别
  17. 微信小程序——api调用(糗事百科例子)
  18. js实现关键字匹配高亮显示
  19. Linux 中三种引号(单引号、双引号、反引号)的区别
  20. 计算机在小学学科中的应用,计算机在小学教学中的应用.pdf

热门文章

  1. ETL讲解(很详细!!!)
  2. 新手如何起步做好微商,微商如何加精准好友?微商如何选产品!如何让别人主动加微信,怎么让别人主动加我微信!
  3. 爸爸给女儿存了一份养老险,女儿50多岁时可以领取30多万
  4. Right Backup(云端数据备份软件)v8.1官方版
  5. Python random模块(获取随机数)常用方法和使用例子
  6. 在kile中为stm32移植FreeRTOS
  7. 2021年五大电子邮件威胁与零日漏洞
  8. 如何让同步/刷新的图标(el-icon-refresh)旋转起来
  9. 开发电商App哪家好
  10. MEX and Increments-(先拿一些的贪心思维)