定位服务是通过GPS等方式查找定位自己的位置的,再通过地图标注出来。
在iOS中定位服务和地图开发是使用两套API分别完成的。
1、定位服务:
iOS系统提供3种不同定位途径:
1>WiFi定位:通过查询一个WiFi路由器的地理位置信息,iPhone、iPod Touch、iPad都可以采用。
2>蜂窝式移动电话基站定位:通过移动运营商基站定位
3>GPS卫星定位:通过3~4颗GPS卫星位置定位,最为准确,但是耗电量大
iOS不像Android系统在定位服务编程时可以指定采用哪种途径进行定位。iOS的API把底层这些细节屏蔽掉了,开发人员和用户并不知道现在设备采用哪种方式进行定位,iOS系统会根据设备的情况和周围环境,采用一套最佳的解决方案。具体是:如果能够GPS信息,那么设备优先采用GPS定位,否则采用WiFi或蜂窝基站定位,在WiFi和蜂窝基站之间优先使用WiFi,如果无法连接到WiFi才使用蜂窝基站定位。
1.1、定位服务编程
在iOS 6之后,定位服务主要使用CoreLocaation框架,定位时主要使用CLLocationManager、CLLocationManagerDelegate和CCLocation。
CLLocationManager类:定位服务管理类,它能够使我们获得设备的位置信息和高度信息,也可以监控设备进入某个区域,还可以帮助我们获得设备的运行方向。
CLLocationManagerDelegate类:是CLLocationManager类的委托协议。
CLLocation类:封装了位置和高度信息。
下面具体操作:
第一步,新建一个singleView的空白工程
第二步:向工程中引入framework:CoreLocation.framework
在主界面的控制器 ViewController.h 文件中,我们啥也不做,.m文件中,我们需声明一个 CLLocationManager* locationManager的属性,我们让其实现CLLocationManagerDelegate的协议,并实现代理方法didUpdateLocations和didFailWithError,如下://// ViewController.m
// CLLocationManager // // Created by apple on 14-5-11. // Copyright (c) 2014年 姚新超. All rights reserved. // #import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewController ()<CLLocationManagerDelegate>{ } @property (nonatomic,strong) CLLocationManager* locationManager; @end @implementation ViewController
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.
// 定位服务管理对象初始化
self.locationManager = [[CLLocationManager alloc] init]; // 设置代理 self.locationManager.delegate = self; // 设置定位的精准度 self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
// 设置设备移动更新位置信息的最小距离,单位是米 self.locationManager.distanceFilter = kCLDistanceFilterNone; self.locationManager.purpose = @"To provide functionality based on user's current location."; } - (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animatted];
// 开始定位
[self.locationManager startUpdatingLocation];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
// 停止定位
[self.locationManager stopUpdatingLocation];
} @end
#pragma mark - 委托方法用于实现位置的更新
// 实时调用的方法,调用频率为1s中一次 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { // 设备的当前位置 CLLocation *currLocation = [locations lastObject]; NSString *latitude = [NSString stringWithFormat:@"纬度:%3.5f",currLocation.coordinate.latitude]; NSString *longitude = [NSString stringWithFormat:@"经度:%3.5f",currLocation.coordinate.longitude]; NSString *altitude = [NSString stringWithFormat:@"高度值:%3.5f",currLocation.altitude]; } - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { NSLog(@"error : %@",error.localizedDescription); }
locationManager: didUpdateLocations:iOS 6新增方法,定位成功时调用,用于替代之前的locationManager:didUpdateToLocation:fromLocation:方法。
locationManager: didFailWithError:定位失败。