今天我们来学习一下在iOS开发中如何使用定位功能。
PS:定位功能在模拟器上不一定起作用,所以还请在真机上测试吧
实现iOS定位功能首要步骤:当然是新建一个工程啦~ !~
步骤一:导入系统定位的类库 CoreLocation.framework
步骤二:
需要在plist文件中添加默认缺省的字段“NSLocationAlwaysUsageDescription”,这个提示是:“允许应用程序在您并未使用该应用程序时访问您的位置吗?”NSLocationAlwaysUsageDescription对应的值是告诉用户使用定位的目的或者是标记。(无论有用没用应用程序,都获得用户位置)
需要在plist文件中添加默认缺省的字段“NSLocationWhenInUsageDescription”,这个时候的提示是:“允许应用程序在您使用该应用程序时访问您的位置吗?”
接下来,上代码
步骤三:
首先在需要定位的类中导入头文件,并生成定位管理者属性
#import "ViewController.h" //系统定位的类库 #import <CoreLocation/CoreLocation.h> @interface ViewController () <CLLocationManagerDelegate> @property (nonatomic, strong) CLLocationManager *manager; @end
步骤四:
在viewDidLoad方法中,初始化定位管理者、设置代理、并开启定位功能
- (void)viewDidLoad { [super viewDidLoad]; //1.创建位置管理者 self.manager = [[CLLocationManager alloc] init]; //判断当前的系统版本号是否大于8.0 if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { //若能进入If 说明当前系统是大于8.0 //向用户请求我们的程序使用位置 [self.manager requestAlwaysAuthorization]; [self.manager requestWhenInUseAuthorization]; } //设置定位的更新距离(每移动10米更新一次,实质上是让代理方法重新走一次) self.manager.distanceFilter = 10.0f; //设置代理啊 self.manager.delegate = self; //开启定位功能 [self.manager startUpdatingLocation]; }
步骤五:
实现定位代理方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { NSLog(@"locations = %@",locations); //获得当前的卫星的位置 CLLocation *location = (CLLocation *)[locations lastObject]; //从位置信息中获取经纬度 double lat = location.coordinate.latitude; double lon = location.coordinate.longitude; NSLog(@"lat=====%f,lon+++++%f",lat,lon); //使用位置 反编码 解析 位置信息 //创建位置反编码的对象 CLGeocoder *geocoder = [[CLGeocoder alloc] init]; //使用该对象获得位置信息 [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error){ //遍历解析出来的位置信息 for (CLPlacemark *placemark in placemarks) { NSLog(@"name = %@",placemark.locality); } }]; }
得到打印的结果是
2016-01-23 08:35:24.186 LocationDemo[798:258157] locations = ( "<+22.65055322,+114.04342625> +/- 65.00m (speed -1.00 mps / course -1.00) @ 16/1/23 \U4e2d\U56fd\U6807\U51c6\U65f6\U95f4 \U4e0a\U53488:35:24" ) 2016-01-23 08:35:24.187 LocationDemo[798:258157] lat=====22.650553,lon+++++114.043426 2016-01-23 08:35:25.117 LocationDemo[798:258157] name = 深圳市
ps:反地理编码是通过经纬度得到地理位置信息
反地理编码的方法:
CLGeocoder *geocoder = [[CLGeocoder alloc] init]; //使用该对象获得位置信息 [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error){ //遍历解析出来的位置信息 for (CLPlacemark *placemark in placemarks) { NSLog(@"name = %@",placemark.locality); } }];
地理编码是通过地理位置得到经纬度信息
地理编码的方法:
[geocoder geocodeAddressString:@"深圳市" completionHandler:^(NSArray *placemarks, NSError *error) { for (CLPlacemark *placemark in placemarks) { NSLog(@"%@",placemark.location); } }];
通过触摸事件来停止更新定位
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //停止定位更新 [self.manager stopUpdatingLocation]; }
当然定位功能还有很多,例如获取手机的朝向等等,这里就不一一列举了。