本文主要是介绍iOS8.0 定位,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在IOS8中定位功能废除了一个方法:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_6, __MAC_NA, __IPHONE_2_0, __IPHONE_6_0);
新增了两个方法:
- (void)requestWhenInUseAuthorization __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_8_0);
- (void)requestAlwaysAuthorization __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_8_0);
这两个新增的方法导致,之前写的程序在iOS8运行会出现,定位功能无法正常使用
这样让iOS8正常使用定位功能呢?
1. 你需要在info.plist表里面添加两条变量
在Info.plist中加入两个缺省没有的字段
-
NSLocationAlwaysUsageDescription
-
NSLocationWhenInUseUsageDescription
这两个字段没什么特别的意思,就是自定义提示用户授权使用地理定位功能时的提示语。
- MainViewController.h
-
- #import<UIKit/UIKit.h>
#import<CoreLocation/CoreLocation.h>
- @interface MainViewController:UIViewController<CLLocationManagerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
- @end
- MainViewController.m
-
- - (void) viewDidLoad {
-
- [super viewDidLoad];
- self.locationManager = [[CLLocationManager alloc]
- init];
- _locationManager.delegate = self;
- [_locationManager requestAlwaysAuthorization];
- _locationManager.desiredAccuracy = kCLLocationAccuracy
- Best; ①
- _locationManager.distanceFilter = 1000.0f; ②
- [_locationManger startUpdatingLocation];
- }
kCLLocationAccuracyKilometer 。精度1000 米;
kCLLocationAccuracyThreeKilometers。精度3000米;
kCLLocationAccuracyBest 。设备 使用电池供电时候,最高的精度;kCLLocationAccuracyBestForNavigation。导航情况下最高精度,一般要有外接电源时才能使用;
精度越高请求获得位置信息的时间就越短,这就意味着设备越耗电。因此一个应用应该选择适合它的精度,如果你的应用是一个车载导航应 用,kCLLocationAccuracyBestForNavigation是比较好的选择,你可以使用汽车上的电瓶为设备供电。如果你的应用为徒步 旅行者提供的导航应用,kCLLocationAccuracyHundredMeters是一个不错的选择。
第②行代码设置distanceFilter属性,它是距离过滤器,它定义了设备移动更新位置信息的最小距离,它的单位是米,本例设置了1000米。
初始化CLLocationManager完成之后,需要使用startUpdatingLocation方法开始定位服务。它是在ViewController.m的viewWillAppear:方法中,代码如下:
- - (void)viewWillAppear:(BOOL)animated
- {
- [super viewWillAppear:animated];
- //开始定位
- [_locationManager startUpdatingLocation];
- }
调用startUpdatingLocation方法定位服务就会开启,它根据设定的条件,不断请求回调新的位置信 息。因此开启这个方法一定要慎重,要在最合适的时候开启,在视图控制器的声明周期方法中viewWillAppear:是最合适的。与开启服务对应的方法 是stopUpdatingLocation方法,它的调用是在视图控制器的viewWillDisappear:方法中调用的,代码如下:
- - (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委托方法用于实现位置的更新
- - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
- {
- CLLocation * currLocation = [locations lastObject];
- // 纬度
- NSString *txtLat = [NSString stringWithFormat:@"%3.5f",
- currLocation.coordinate.latitude];
- // 经度
- NSString *txtLng = [NSString stringWithFormat:@"%3.5f",
- currLocation.coordinate.longitude];
- }
- - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
- {
- NSLog(@”error: %@”,error);
- }
这篇关于iOS8.0 定位的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!