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中修改如下:
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController<CLLocationManagerDelegate>
{
CLLocationManager *locManager;
}
@property (retain, nonatomic) IBOutletUILabel *lonLabel;
@property (retain, nonatomic) IBOutletUILabel *latLabel;
@property (retain, nonatomic) CLLocationManager *locManager;
@end
.m文件的实现如下,具体解释在代码注释中说明
#import "ViewController.h"
@interfaceViewController ()
@end
@implementation ViewController
@synthesize lonLabel;
@synthesize latLabel;
@synthesize locManager;
- (void)viewDidLoad
{
[superviewDidLoad];
//初始化位置管理器
locManager = [[CLLocationManager alloc]init];
//设置代理
locManager.delegate = self;
//设置位置经度
locManager.desiredAccuracy = kCLLocationAccuracyBest;
//设置每隔100米更新位置
locManager.distanceFilter = 100;
//开始定位服务
[locManagerstartUpdatingLocation];
}
- (void)viewDidUnload
{
[selfsetLonLabel:nil];
[selfsetLatLabel:nil];
[superviewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
- (void)dealloc {
//停止定位服务
[locManagerstopUpdatingLocation];
[lonLabelrelease];
[latLabelrelease];
[superdealloc];
}
//协议中的方法,作用是每当位置发生更新时会调用的委托方法
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
//结构体,存储位置坐标
CLLocationCoordinate2D loc = [newLocation coordinate];
float longitude = loc.longitude;
float latitude = loc.latitude;
self.lonLabel.text = [NSStringstringWithFormat:@"%f",longitude];
self.latLabel.text = [NSStringstringWithFormat:@"%f",latitude];
}
//当位置获取或更新失败会调用的方法
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSString *errorMsg = nil;
if ([error code] == kCLErrorDenied) {
errorMsg = @"访问被拒绝";
}
if ([error code] == kCLErrorLocationUnknown) {
errorMsg = @"获取位置信息失败";
}
UIAlertView *alertView = [[UIAlertViewalloc]initWithTitle:@"Location"
message:errorMsg delegate:self cancelButtonTitle:@"Ok"otherButtonTitles:nil, nil];
[alertView show];
[alertView release];
}
@end
最后编译并运行结果如下(在模拟器上得到的经纬度):
欢迎关注我的新浪微博和我交流:@唐韧_Ryan
分享到:
相关推荐
iOS实例开发源码——JTStackController for iOS.zip
iOS实例开发源码——JTListView for iOS.zip
iOS实例开发源码——JSTokenField for iOS.zip
iOS实例开发源码——JPButton for iOS.zip
iOS实例开发源码——JSFavStarControl for iOS.zip
iOS实例开发源码——JHTickerView for iOS.zip
iOS实例开发源码——JHNotificationManager for iOS.zip
iOS实例开发源码——JMWhenTapped for iOS.zip
iOS实例开发源码——KKGridView for iOS.zip
iOS实例开发源码——JHStatusTextView for iOS.zip
iOS实例开发源码——JCTiledScrollView for iOS.zip
iOS实例开发源码——NDRotator for iOS.zip
iOS实例开发源码——PhotoAppLink for iOS.zip
iOS组件与框架——iOS SDK高级特性剖析 书的配套全部源代码
IOS实例开发源码——仿iOS原生计算器.zip
iOS开发快速入门——字节跳动.pptx
iOS8自定义控件——环形滑块,国外大神的杰作!用来借鉴学习刚好!
iOS实例开发源码——giginet-SantaRochka-952b17e.zip
IOS实例开发源码——局域网或蓝牙连接.zip
iOS实例开发源码——FRLayeredNavigationController.zip