现在的移动设备很多都提供定位服务,使用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代码如下:
#import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> #import <CoreLocation/CLLocationManagerDelegate.h> @interface ViewController : UIViewController <CLLocationManagerDelegate> //经度 @property (weak, nonatomic) IBOutlet UITextField *txtLng; //纬度 @property (weak, nonatomic) IBOutlet UITextField *txtLat; //高度 @property (weak, nonatomic) IBOutlet UITextField *txtAlt; @property(nonatomic, strong) CLLocationManager *locationManager; @end
在h文件中首先需要引入<CoreLocation/CoreLocation.h> 和<CoreLocation/CLLocationManagerDelegate.h>头文件。然后在定义ViewController 时需要声明实现CLLocationManagerDelegate协议。我们还定义了 CLLocationManager *locationManager属性。
ViewController.m的viewDidLoad代码如下:
- (void)viewDidLoad { [super viewDidLoad]; //定位服务管理对象初始化 _locationManager = [[CLLocationManager alloc] init]; _locationManager.delegate = self; _locationManager.desiredAccuracy = kCLLocationAccuracyBest; ① _locationManager.distanceFilter = 1000.0f; ② }
在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:方法中,代码如下:
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; //开始定位 [_locationManager startUpdatingLocation]; }
调用startUpdatingLocation方法定位服务就会开启,它根据设定的条件,不断请求回调新的位置信 息。因此开启这个方法一定要慎重,要在最合适的时候开启,在视图控制器的声明周期方法中viewWillAppear:是最合适的。与开启服务对应的方法 是stopUpdatingLocation方法,它的调用是在视图控制器的viewWillDisappear:方法中调用的,代码如下:
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; //停止定位 [_locationManager stopUpdatingLocation]; }
viewWillDisappear:在视图消失(应用退到后台)时调用,能够保证最及时地关闭定位服务,这是负责 任的做法。在iOS 6之后请求有所变化,定位服务应用退入台后可以延迟更新位置信息,其中 allowDeferredLocationUpdatesUntilTraveled:timeout:方法可以设置延迟更新,从而使得应用在后台不再 更新位置信息。关闭延迟更新使用disallowDeferredLocationUpdates方法实现。此外,在iOS 6之后新增 pausesLocationUpdatesAutomatically属性,它能设定自动暂停位置更新,定位服务的开启和暂停管理权交给系统,这样会更 加合理和简单。
一旦定位服务开启,并设置好了CLLocationManager委托属性delegate后,当用户设备移动到达过滤距离时,就会回调委托方法,与定位服务有关的方法有两个:
locationManager:didUpdateLocations: 定位成功,是iOS 6新方法,替代之前的locationManager:didUpdateToLocation:fromLocation:方法;
locationManager:didFailWithError: 定位失败;
实现CLLocationManager委托代码如下:
#pragma mark Core Location委托方法用于实现位置的更新 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation * currLocation = [locations lastObject]; ① _txtLat.text = [NSString stringWithFormat:@"%3.5f", currLocation.coordinate.latitude]; ② _txtLng.text = [NSString stringWithFormat:@"%3.5f", currLocation.coordinate.longitude]; ③ _txtAlt.text = [NSString stringWithFormat:@"%3.5f", currLocation.altitude]; ④ } - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { NSLog(@”error: %@”,error); }
在locationManager:didUpdateLocations:方法中参数locations是位置变 化的集合,它按照时间变化的顺序存放。如果想获得当前设备的位置,可以使用第①行的[locations lastObject]语句获得集合中最后一个 元素,它就是设备当前位置了。从集合中返回的对象类型是CLLocation,CLLocation封装了位置、高度等信息。在上面代码中我们使用了它的 两个属性:altitude和coordinate,altitude属性是高度值,coordinate是封装了经度和纬度的结构体 CLLocationCoordinate2D,CLLocationCoordinate2D定义如下:
typedef struct { CLLocationDegrees latitude; //纬度 CLLocationDegrees longitude; //经度 } CLLocationCoordinate2D;
其中latitude为经度信息,longitude为纬度信息,它们都是CLLocationDegrees类型,CLLocationDegrees是使用typedef定义的double类型。
第 ②行代码中的newLocation.coordinate.latitude表达式是获得设备当前的纬度,第③行代码中的 newLocation.coordinate.longitude表达式是获得设备当前的纬度,而获得高度可以使用第④行 newLocation.altitude表达式直接获得。
相关推荐
### IOS编程指南知识点详解 #### 一、iOS操作系统与开发环境概述 - **iOS系统**:作为苹果移动设备的操作系统,iOS提供了丰富的功能与优秀的用户体验。本指南将深入介绍iOS的核心概念及其对开发者的重要性。 - **...
### iOS开发详解 #### 一、iOS开发概述 iOS开发是指为苹果公司的移动操作系统iOS创建应用程序的过程。iOS操作系统主要用于iPhone、iPad以及iPod Touch等设备。为了开发iOS应用,开发者通常会使用两种主流的编程...
### iOS编程教程,第2版 #### 知识点概览 本教程旨在为初学者提供一条快速入门的道路,让其能够独立开发出可在市场上销售的iOS应用程序。无论是初次接触苹果编程的新手还是已有一定经验的Mac开发者,本书都能帮助...
### iOS编程(第2版)知识点总结 #### 一、书籍基本信息 - **书名**:iOS编程(第2版) - **作者**:Joe Conway & Aaron Hillegass - **出版时间**:2011年7月 - **出版社**:Big Nerd Ranch, Inc. - **版权信息**...
6. **推送通知服务**:iOS的本地和远程推送通知机制,包括APNs(Appearance Notification Service)的配置,推送通知的接收和处理,以及自定义推送处理。 7. **地图与定位服务**:集成Apple MapKit服务,实现地图显示...
### iOS Block编程要点详解 #### 简介 Block对象是一种C级别的语法和运行时特性,在iOS开发中扮演着重要角色。与标准C函数类似,Block不仅能够包含可执行代码,还能封装局部变量,这些变量根据Block的生命周期而...
### iOS编程指南知识点详解 #### 一、iOS操作系统与开发环境概述 - **标题与描述**: “iOS编程指南”旨在全面介绍iOS操作系统的基础知识及应用开发流程。 - **知识点**: - **iOS操作系统**:iOS是苹果公司为...
4. **地图和定位服务**:iOS 7增强了地图API,开发者可以学习如何集成地图到应用中,添加自定义标注,以及使用Core Location获取和使用用户的地理位置信息。 5. **测试和调试**:这一章可能会讲解如何使用Xcode的...
- **Objective-C与Swift简介**:虽然该资料提到的是iOS 6编程,但现代iOS开发主要使用Swift语言。Swift是一种更安全、更快且易于学习的编程语言。 - **Interface Builder详解**:Interface Builder是Xcode中用于构建...
在iOS开发领域,冲顶大会是...这不仅要求开发者具备扎实的iOS编程基础,还需要一定的逆向分析和自动化测试技能。通过这种方式,开发者可以深入理解应用的工作原理,并利用这些知识来实现辅助工具,提高用户的游戏体验。
### iOS课程大纲详解 #### 第一阶段:编程基础及开发环境搭建 - **目标概述**: - 熟悉Mac操作系统及其基本命令。 - 掌握Xcode开发环境的搭建与简单C语言程序的编写。 - **具体内容**: - **Y01:Mac系统安装...
"ios": 指的是这个项目是为iOS平台开发的,所以源码将使用Swift或Objective-C编写,遵循Apple的iOS开发规范和编程指南。 "avi": 这个标签可能是误输入或者不相关的,因为"avi"通常指一种视频文件格式,在这里可能是...
在iOS系统中,按键脚本通常指的是自动化工具或编程脚本,用于模拟用户与设备的交互,例如点击、滑动、输入等操作。这些脚本可以极大地提高开发者的效率,尤其是在进行UI测试或者重复性任务时。下面我们将深入探讨iOS...
### iOS核心动画编程指南知识点详解 #### 一、核心动画编程介绍 **核心动画**是iOS和macOS中用于创建动态视觉效果的核心技术之一。它为开发者提供了强大的工具集,可以轻松实现各种复杂的动画效果。核心动画框架是...
《iOS版俄罗斯方块开发详解》 iOS版的俄罗斯方块是一个经典的编程示例,它展示了游戏开发的基础原理,特别是使用Objective-C(OC)语言进行移动应用开发的技术。本项目是一个简洁的俄罗斯方块演示程序,由开发者...
- **Swift语言入门**:Swift是用于开发iOS应用程序的主要编程语言。了解Swift的基本语法、数据类型、控制结构等基础知识。 #### 2. 用户界面设计 - **Storyboard与Interface Builder**:学习如何使用Storyboard来...
### iOS工程师岗位职责详解 #### 一、总体职责概述 iOS工程师主要负责在苹果iOS操作系统上开发应用程序。根据所提供的文件信息,iOS工程师的核心职责可以概括为以下几个方面: 1. **产品研发设计与迭代升级**:...