系统的coreLocation的使用

来源:互联网 发布:公司数据分析报告 编辑:程序博客网 时间:2024/06/03 16:17

iOS支持三种检测当前位置的方式:手机基站、Wi-Fi、和GPS,其中GPS是经度最高的,同时也是最耗费手机电量的。一般情况下在室内是无法通过GPS获取位置信息的,通过Wi-Fi获取位置的原理是通过网络提供商的IP地址信息来获取位置,经度不是很高,最后是通过手机基站获取位置,手机开机后会连接附近的基站塔获取信号,通过基站可以得到手机所在的位置信息,基站越密集,所获取的位置信息经度就越高。


IOS SDK提供的Core Location能比较好的提供获取位置信息的功能,获取位置信息涉及如下几个类,CLLocationManager(位置管理器), CLLocation, CLLocationManagerdelegate(协议、提供委托方法),CLLocationCoodinate2D(存储坐标位置)

另外CLLocationManager还有几个属性;

desiredAccuracy:位置的精度属性

取值有如下几种:

kCLLocationAccuracyBest

精确度最佳

kCLLocationAccuracynearestTenMeters

精确度10m以内

kCLLocationAccuracyHundredMeters

精确度100m以内

kCLLocationAccuracyKilometer

精确度1000m以内

kCLLocationAccuracyThreeKilometers

精确度3000m以内


distanceFilter:横向移动多少距离后更新位置信息

delegate:响应CLLocationManagerdelegate的对象


下面来构建一个获取位置的例子:

首先建立一个Single View Application工程,然后引入CoreLocation.framework,并在ViewController.h中修改如下:

[cpp] view plain copy
  1. #import <UIKit/UIKit.h>  
  2. #import <CoreLocation/CoreLocation.h>  
  3.   
  4. @interface ViewController : UIViewController<CLLocationManagerDelegate>  
  5. {  
  6.     CLLocationManager *locManager;  
  7. }  
  8.   
  9. @property (retain, nonatomic) IBOutletUILabel *lonLabel;  
  10. @property (retain, nonatomic) IBOutletUILabel *latLabel;  
  11. @property (retain, nonatomic) CLLocationManager *locManager;  
  12.   
  13. @end  

.m文件的实现如下,具体解释在代码注释中说明

[cpp] view plain copy
  1. #import "ViewController.h"  
  2.   
  3. @interfaceViewController ()  
  4.   
  5. @end  
  6.   
  7. @implementation ViewController  
  8. @synthesize lonLabel;  
  9. @synthesize latLabel;  
  10. @synthesize locManager;  
  11.   
  12. - (void)viewDidLoad  
  13. {  
  14.     [superviewDidLoad];  
  15.       
  16.     //初始化位置管理器  
  17.     locManager = [[CLLocationManager alloc]init];  
  18.     //设置代理  
  19.     locManager.delegate = self;  
  20.     //设置位置经度  
  21.     locManager.desiredAccuracy = kCLLocationAccuracyBest;  
  22.     //设置每隔100米更新位置  
  23.     locManager.distanceFilter = 100;  
  24.     //开始定位服务  
  25.     [locManagerstartUpdatingLocation];  
  26. }  
  27.   
  28. - (void)viewDidUnload  
  29. {  
  30.     [selfsetLonLabel:nil];  
  31.     [selfsetLatLabel:nil];  
  32.     [superviewDidUnload];  
  33.     // Release any retained subviews of the main view.  
  34. }  
  35.   
  36. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  37. {  
  38.     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
  39. }  
  40.   
  41. - (void)dealloc {  
  42.     //停止定位服务  
  43.     [locManagerstopUpdatingLocation];  
  44.     [lonLabelrelease];  
  45.     [latLabelrelease];  
  46.     [superdealloc];  
  47. }  
  48.   
  49. //协议中的方法,作用是每当位置发生更新时会调用的委托方法  
  50. -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation  
  51. {  
  52.     //结构体,存储位置坐标  
  53.     CLLocationCoordinate2D loc = [newLocation coordinate];  
  54.     float longitude = loc.longitude;  
  55.     float latitude = loc.latitude;  
  56.     self.lonLabel.text = [NSStringstringWithFormat:@"%f",longitude];  
  57.     self.latLabel.text = [NSStringstringWithFormat:@"%f",latitude];  
  58.       
  59. }  
  60.   
  61. //当位置获取或更新失败会调用的方法  
  62. -(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error  
  63. {  
  64.     NSString *errorMsg = nil;  
  65.     if ([error code] == kCLErrorDenied) {  
  66.         errorMsg = @"访问被拒绝";  
  67.     }  
  68.     if ([error code] == kCLErrorLocationUnknown) {  
  69.         errorMsg = @"获取位置信息失败";  
  70.     }  
  71.       
  72.     UIAlertView *alertView = [[UIAlertViewalloc]initWithTitle:@"Location"   
  73.                                                    message:errorMsg delegate:self cancelButtonTitle:@"Ok"otherButtonTitles:nil, nil];  
  74.     [alertView show];  
  75.     [alertView release];  
  76. }  
  77.   
  78. @end  

最后编译并运行结果如下(在模拟器上得到的经纬度):

0 0
原创粉丝点击