现在的移动设备很多都提供定位服务,使用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定位服务编程详解的更多相关文章

  1. iOS定位服务编程详解

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

  2. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  3. ORACLE PL/SQL编程详解(转)

    原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...

  4. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

    原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...

  5. Log4J:Log4J三大组件:Logger+Appender+Layout 格式化编程详解

    快速了解Log4J Log4J的三个组件: Logger:日志记录器,负责收集处理日志记录     (如何处理日志) Appender:日志输出目的地,负责日志的输出  (输出到什么 地方) Layo ...

  6. HBase 协处理器编程详解,第二部分:客户端代码编写

    实现 Client 端代码 HBase 提供了客户端 Java 包 org.apache.hadoop.hbase.client.coprocessor.它提供以下三种方法来调用协处理器提供的服务: ...

  7. Linux的SOCKET编程详解(转)

    Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系 ...

  8. 【ARM-Linux开发】Linux的SOCKET编程详解

    Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系 ...

  9. Linux串口编程详解(转)

    串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...

随机推荐

  1. This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分 解决方案

    但web启用了md5加密后 有可能出现这样的错误 This implementation is not part of the Windows Platform FIPS validated cryp ...

  2. org.apache.catalina.mbeans.ServerLifecycleListener

    Tomcat 启动报错: java.lang.ClassNotFoundException: org.apache.catalina.mbeans.ServerLifecycleListener at ...

  3. (高精度运算4.7.27)UVA 10494 If We Were a Child Again(大数除法&&大数取余)

    package com.njupt.acm; import java.math.BigInteger; import java.util.Scanner; public class UVA_10494 ...

  4. Android ListView标题置顶效果实现

    一. 有图有真相     二.实现: 1. 基于ListView分类效果 2. TitleView即标题的处理(创建) 3. 处理TitleView的三种状态 三.源码: 例子下载 实现可以看代码,具 ...

  5. TP第2个项目总结

    1.参数尼玛传接受要非数字方法 $id = $this->_get('id','intval',0); $field_wc = $this->_get('wc_field'); 2.参数不 ...

  6. impdp的一些实际问题解决方法

    之前在http://blog.csdn.net/bisal/article/details/19067515写过一篇关于expdp和impdp的实践的帖子.今天碰到个问题,有些内容没有介绍全,这里再补 ...

  7. css常用知识

    1.基本语法规范p {color:#ff0000;background:#ffffff}a.其中"p"称为"选择器"(selectors),指明我们要给&quo ...

  8. 快速排序算法-C语言实现

    注:本篇内容为翻译,之所以选择这篇进行翻译原因是该文章含有动画,能够更加直观地展示快速排序.同时,可以仔细看一下代码,代码中把结构化的思想给予了更加充分地表现.按照功能进行模块划分的思想得到了彻底地贯 ...

  9. mongodb目录

    1. mongodb 数据库操作--备份 还原 导出 导入 2. ubuntu下mongodb启动脚本 3. mongodb实现远程连接 4. 用java在客户端读取mongodb中的数据并发送至服务 ...

  10. Linux下mongodb安装

    1>设置mongoDB目录   cd /home/apps 附:centOS下创建目录命令 mkdir /home/apps   2>下载mongodb   curl -O http:// ...