iOS6定位服务编程详解
现在的移动设备很多都提供定位服务,使用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表达式直接获得。
iOS6定位服务编程详解的更多相关文章
- iOS定位服务编程详解
现在的移动设备很多都提供定位服务,使用iOS系统的iPhone.iPod Touch和iPad都可以提供位置服务,iOS设备能提供3种不同途径进行定位:Wifi, 蜂窝式移动电话基站, GPS卫星 i ...
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- ORACLE PL/SQL编程详解(转)
原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...
- Log4J:Log4J三大组件:Logger+Appender+Layout 格式化编程详解
快速了解Log4J Log4J的三个组件: Logger:日志记录器,负责收集处理日志记录 (如何处理日志) Appender:日志输出目的地,负责日志的输出 (输出到什么 地方) Layo ...
- HBase 协处理器编程详解,第二部分:客户端代码编写
实现 Client 端代码 HBase 提供了客户端 Java 包 org.apache.hadoop.hbase.client.coprocessor.它提供以下三种方法来调用协处理器提供的服务: ...
- Linux的SOCKET编程详解(转)
Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系 ...
- 【ARM-Linux开发】Linux的SOCKET编程详解
Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系 ...
- Linux串口编程详解(转)
串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...
随机推荐
- Codeforces Round #338 (Div. 2) B. Longtail Hedgehog dp
B. Longtail Hedgehog 题目连接: http://www.codeforces.com/contest/615/problem/B Description This Christma ...
- JavaScript Modules
One of the first challenges developers new to JavaScript who are building large applications will ha ...
- java最简单的方式实现httpget和httppost请求
java实现httpget和httppost请求的方式多种多样,个人总结了一种最简单的方式,仅仅需几行代码,就能够完美的实现. 此处须要用到两个jar包,httpclient-4.3.1.jar.ht ...
- js代码的一些小技巧
1. 数组中通过赋值语句来改变值 var a = 1; var msg = ["value0","value1"]; for(var i = 0;i<10 ...
- 如何快速掌握CSS(各种CSS工具)
CSS中的大量属性难以记忆,通过组合多种CSS工具,可以快速学习常见样式,并提高设计效率.这里给大家推荐一些比较好的在线工具,通过所见即所得图形化界面设计样式,直接得到对应的CSS代码.相比臃肿的集成 ...
- SMO优化算法(Sequential minimal optimization)
原文:http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html SMO算法由Microsoft Research的John C. ...
- 数据挖掘算法-Apriori Algorithm(关联规则)
http://www.cnblogs.com/jingwhale/p/4618351.html Apriori algorithm是关联规则里一项基本算法.是由Rakesh Agrawal和Ramak ...
- Working with MTD Devices
转:http://www.linuxforu.com/2012/01/working-with-mtd-devices/ Working with MTD Devices By Mohan Lal J ...
- 企业级搜索引擎Solr 第三章 索引数据(Indexing Data)[3]
转载:http://quweiprotoss.wap.blog.163.com/ Solr Cell是一个针对Tika的简单适配器,它由一个SAX ContentHandler组成,ContentHa ...
- iOS7.1 编译报错 解决方案 体会
iOS升级到 iOS 7.1 了 ,开发人员必须与时俱进.果断下载更新了xcode5.1版本 ,试运行了一下已上线的应用,哇 报错了!好头疼 贴下报错地方: 都是关于第三方类库报的错 比如parse. ...