iOS8.0 定位
来源:互联网 发布:范冰冰年收入知乎 编辑:程序博客网 时间:2024/04/27 23:50
在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> - @interfaceMainViewController:UIViewController<CLLocationManagerDelegate>
@property (strong, nonatomic)CLLocationManager*locationManager;
- @end
- MainViewController.m
- - (void) viewDidLoad {
- [superviewDidLoad];
- 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 定位
- 适配ios8.0/7.0定位
- IOS8定位
- iOS8定位
- IOS8定位
- iOS8定位
- IOS8 定位
- IOS:ios8.0下CLLocationManager定位服务
- 定位城市+iOS8 定位问题
- iOS8 定位问题
- ios8 定位问题解决
- iOS8 定位新增功能
- iOS8 定位问题
- iOS8定位服务
- iOS8 定位失败问题
- iOS8定位问题解决方案
- iOS8 实现定位流程
- IOS8定位服务
- java第一天--基础常识
- 一些开发网站的开源软件连接font.googleapis.com的问题
- Cocoa Keyboard Events - nextkeyview
- 常见问题之一真机调试问题
- 常用布局属性总结
- iOS8.0 定位
- 手机联系人姓名或号码过长无法导入到SIM卡
- iframe自适应
- poj 2709 - Painter
- 第10周项目1-程序填充与阅读
- 解决Myeclipse ctrl+h带来的困扰
- Amazon EC2免费部署指南
- androidwebview与js相互调用
- RYU修改监听端口 Mininet在custom自建拓扑和连接到指定控制器命令解释