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类是封装了位置和高度信息。

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

1

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

2

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

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

3

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

4

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

1
2
3
4
5
6
7
8
9
10
11
12
# 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代码如下:

1
2
3
4
5
6
7
8
9
- ( 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:方法中,代码如下:



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

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

1
2
3
4
5
6
- ( 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委托方法用于实现位置的更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- ( 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定义如下:

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

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

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



本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1243806,如需转载请自行联系原作者

相关文章
|
2月前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
4月前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
75 11
|
5月前
|
Swift iOS开发 UED
【绝妙创意】颠覆你的视觉体验!揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【8月更文挑战第13天】本文通过一个具体案例,介绍如何使用Swift与UIKit在iOS应用中创建独特的按钮动画效果。当按钮被按下时,其形状从圆形变化为椭圆形,颜色则从蓝色渐变为绿色;释放后,动画反向恢复原状。利用UIView动画方法及弹簧动画效果,实现了平滑自然的过渡。通过调整参数,开发者可以进一步优化动画体验,增强应用的互动性和视觉吸引力。
64 7
|
5月前
|
安全 测试技术 调度
iOS开发-多线程编程
【8月更文挑战第12天】在iOS开发中,属性的内存管理至关重要,直接影响应用性能与稳定性。主要策略包括:`strong`(强引用),保持对象不被释放;`weak`(弱引用),不保持对象,有助于避免循环引用;`assign`(赋值),适用于基本数据类型及非指针对象类型;`copy`(复制),复制对象而非引用,确保不变性。内存管理基于引用计数,利用自动引用计数(ARC)自动管理对象生命周期。此外,需注意避免循环引用,特别是在block中。最佳实践包括理解各策略、避免不必要的强引用、及时释放不再使用的对象、注意block中的内存管理,并使用工具进行内存分析。正确管理内存能显著提升应用质量。
|
6月前
|
移动开发 开发工具 Android开发
探索安卓与iOS开发的差异:平台特性与编程实践
【7月更文挑战第8天】在移动开发的广阔天地中,安卓和iOS这两大操作系统各自占据着半壁江山。它们在用户界面设计、系统架构及开发工具上展现出截然不同的特色。本文将深入探讨这两个平台在技术实现和开发生态上的关键差异,并分享一些实用的开发技巧,旨在为跨平台开发者提供有价值的见解和建议。
|
6月前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析:选择适合自己的编程平台
移动应用开发的两大阵营——安卓和iOS,各自拥有不同的开发环境和工具集。本文通过深入比较这两个平台的编程语言、集成开发环境(IDE)、用户界面设计、测试框架以及部署流程,旨在为开发者提供一个全面的视角来选择最符合个人或项目需求的开发环境。
|
7月前
|
安全 IDE Android开发
探索Android与iOS开发的差异:平台特性与编程实践
【6月更文挑战第17天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据半壁江山。它们在用户群体、系统架构以及开发环境上的差异,为开发者带来了不同的挑战和机遇。本文深入探讨了这两个平台在技术实现、界面设计、性能优化等方面的主要区别,并提供了实用的开发建议,旨在帮助开发者更好地理解各自平台的特性,从而创造出更加优秀的移动应用。
|
8月前
|
定位技术 开发工具 iOS开发
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
76 0
|
iOS开发
实战编程·使用SwiftUI从0到1完成一款iOS笔记App(五)(3)
实战编程·使用SwiftUI从0到1完成一款iOS笔记App(五)
168 0
|
前端开发 数据处理 iOS开发
实战编程·使用SwiftUI从0到1完成一款iOS笔记App(五)(2)
实战编程·使用SwiftUI从0到1完成一款iOS笔记App(五)
96 0