iOS8 定位服务
来源:互联网 发布:淘宝开店需要什么工具 编辑:程序博客网 时间:2024/06/06 19:59
在iOS8中,苹果已经强制开发者在请求定位服务时获得用户的授权,此外iOS状态栏中还有指示图标,提示用户当前应用是否正在使用定位服务。另外在iOS8中,苹果进一步改善了定位服务,让开发者请求定位服务时需要向用户提供更多的透明。此外,iOS8中还支持让应用开发者调用全新的“访问监控”功能,当用户允许后应用才能获得更多的定位数据。
iOS8以前使用CoreLocation定位
1、首先定义一个全局的变量用来记录CLLocationManager对象,引入CoreLocation.framework
使用#import <CoreLocation/CoreLocation.h>
@property (nonatomic,strong) CLLocationManager *locationManager;
2、初始化CLLocationManager并开始定位
// 实例化一个位置管理器 self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; // 设置定位精度 // kCLLocationAccuracyNearestTenMeters:精度10米 // kCLLocationAccuracyHundredMeters:精度100 米 // kCLLocationAccuracyKilometer:精度1000 米 // kCLLocationAccuracyThreeKilometers:精度3000米 // kCLLocationAccuracyBest:设备使用电池供电时候最高的精度 // kCLLocationAccuracyBestForNavigation:导航情况下最高精度,一般要有外接电源时才能使用 self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; // distanceFilter是距离过滤器,为了减少对定位装置的轮询次数,位置的改变不会每次都去通知委托,而是在移动了足够的距离时才通知委托程序 // 它的单位是米,这里设置为至少移动1000再通知委托处理更新; self.locationManager.distanceFilter = 10.0f; // 如果设为kCLDistanceFilterNone,则每秒更新一次;
3、实现CLLocationManagerDelegate的代理方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ CLLocation *currLocation = [locations lastObject]; NSLog(@"经度=%f 纬度=%f 高度=%f", currLocation.coordinate.latitude, currLocation.coordinate.longitude, currLocation.altitude);}
</pre><span style="color:rgb(34,34,34); font-family:'PT Serif',Georgia,Times,'Times New Roman',serif; font-size:18.3999996185303px; line-height:27.5999984741211px; background-color:rgb(248,248,248)">(2)获取用户位置数据失败的回调方法,在此通知用户</span><pre>
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{ if ([error code] == kCLErrorDenied) { //访问被拒绝 } if ([error code] == kCLErrorLocationUnknown) { //无法获取位置信息 }}
</pre><span style="color:rgb(34,34,34); font-family:'PT Serif',Georgia,Times,'Times New Roman',serif; font-size:18.3999996185303px; line-height:27.5999984741211px; background-color:rgb(248,248,248)">4、在</span><code style="margin:-1px 0px; padding:0px 0.3em; border:1px solid rgb(221,221,221); font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; line-height:1.5em; font-size:0.8em; vertical-align:baseline; display:inline-block; color:rgb(85,85,85)">viewWillDisappear</code><span style="color:rgb(34,34,34); font-family:'PT Serif',Georgia,Times,'Times New Roman',serif; font-size:18.3999996185303px; line-height:27.5999984741211px; background-color:rgb(248,248,248)">关闭定位</span><pre>
- (void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [_locationManager stopUpdatingLocation];}
</pre><pre name="code" class="objc">
iOS8中使用CoreLocation定位
1、在使用CoreLocation前需要调用如下函数【iOS8专用】:
</pre><p style="margin-top: 0px; margin-bottom: 1.5em; padding-top: 0px; padding-bottom: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; font-stretch: inherit; line-height: 27.5999984741211px; font-size: 18.3999996185303px; vertical-align: baseline; color: rgb(34, 34, 34); background-color: rgb(248, 248, 248);">iOS8对定位进行了一些修改,其中包括定位授权的方法,CLLocationManager增加了下面的两个方法:</p><p style="margin-top: 0px; margin-bottom: 1.5em; padding-top: 0px; padding-bottom: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; font-stretch: inherit; line-height: 27.5999984741211px; font-size: 18.3999996185303px; vertical-align: baseline; color: rgb(34, 34, 34); background-color: rgb(248, 248, 248);">(1)始终允许访问位置信息</p><p style="margin-top: 0px; margin-bottom: 1.5em; padding-top: 0px; padding-bottom: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; font-stretch: inherit; line-height: 27.5999984741211px; font-size: 18.3999996185303px; vertical-align: baseline; color: rgb(34, 34, 34); background-color: rgb(248, 248, 248);"><code style="margin: -1px 0px; padding: 0px 0.3em; border: 1px solid rgb(221, 221, 221); font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.5em; font-size: 0.8em; vertical-align: baseline; display: inline-block; color: rgb(85, 85, 85); border-radius: 0.4em; background: rgb(255, 255, 255);">- (void)requestAlwaysAuthorization;</code></p><p style="margin-top: 0px; margin-bottom: 1.5em; padding-top: 0px; padding-bottom: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; font-stretch: inherit; line-height: 27.5999984741211px; font-size: 18.3999996185303px; vertical-align: baseline; color: rgb(34, 34, 34); background-color: rgb(248, 248, 248);">(2)使用应用程序期间允许访问位置数据</p><p style="margin-top: 0px; margin-bottom: 1.5em; padding-top: 0px; padding-bottom: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; font-stretch: inherit; line-height: 27.5999984741211px; font-size: 18.3999996185303px; vertical-align: baseline; color: rgb(34, 34, 34); background-color: rgb(248, 248, 248);"><code style="margin: -1px 0px; padding: 0px 0.3em; border: 1px solid rgb(221, 221, 221); font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.5em; font-size: 0.8em; vertical-align: baseline; display: inline-block; color: rgb(85, 85, 85); border-radius: 0.4em; background: rgb(255, 255, 255);">- (void)requestWhenInUseAuthorization;</code></p><span style="color: rgb(34, 34, 34); font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; font-size: 18.3999996185303px; line-height: 27.5999984741211px; background-color: rgb(248, 248, 248);">示例如下:</span><pre name="code" class="objc"> self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; // 设置定位精度 // kCLLocationAccuracyNearestTenMeters:精度10米 // kCLLocationAccuracyHundredMeters:精度100 米 // kCLLocationAccuracyKilometer:精度1000 米 // kCLLocationAccuracyThreeKilometers:精度3000米 // kCLLocationAccuracyBest:设备使用电池供电时候最高的精度 // kCLLocationAccuracyBestForNavigation:导航情况下最高精度,一般要有外接电源时才能使用 self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; // distanceFilter是距离过滤器,为了减少对定位装置的轮询次数,位置的改变不会每次都去通知委托,而是在移动了足够的距离时才通知委托程序 // 它的单位是米,这里设置为至少移动1000再通知委托处理更新; self.locationManager.distanceFilter = 10.0f; // 如果设为kCLDistanceFilterNone,则每秒更新一次;// [self.locationManager requestWhenInUseAuthorization]; [self.locationManager requestAlwaysAuthorization];
2、在Info.plist文件中添加如下配置:
(1)NSLocationAlwaysUsageDescription
(2)NSLocationWhenInUseUsageDescription
这两个键的值就是授权alert的描述,示例配置如下[勾选Show Raw Keys/Values后进行添加
]:
本人写了个代码共享一下
//// ViewController.m// iOS8以后的定位//// Created by lxy on 15-5-21.// Copyright (c) 2015年 Shenzhen MSD Technology Co.,LTD. All rights reserved.//#import "ViewController.h"#import <CoreLocation/CoreLocation.h>@interface ViewController ()<CLLocationManagerDelegate>@property (nonatomic,copy)NSString *cityName;@property (nonatomic,strong) CLLocationManager *locationManager;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; [self initCLLocation]; }- (void)initCLLocation{ UIButton *btn = [[UIButton alloc]init]; [btn setTitle:@"开始定位" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside]; btn.backgroundColor = [UIColor cyanColor]; btn.frame = CGRectMake(100, 200, 100, 40); [self.view addSubview:btn]; // 实例化一个位置管理器 self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; // 设置定位精度 // kCLLocationAccuracyNearestTenMeters:精度10米 // kCLLocationAccuracyHundredMeters:精度100 米 // kCLLocationAccuracyKilometer:精度1000 米 // kCLLocationAccuracyThreeKilometers:精度3000米 // kCLLocationAccuracyBest:设备使用电池供电时候最高的精度 // kCLLocationAccuracyBestForNavigation:导航情况下最高精度,一般要有外接电源时才能使用 self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; // distanceFilter是距离过滤器,为了减少对定位装置的轮询次数,位置的改变不会每次都去通知委托,而是在移动了足够的距离时才通知委托程序 // 它的单位是米,这里设置为至少移动1000再通知委托处理更新; self.locationManager.distanceFilter = 10.0f; // 如果设为kCLDistanceFilterNone,则每秒更新一次; [self.locationManager requestWhenInUseAuthorization]; [self.locationManager requestAlwaysAuthorization]; }- (void)btnClick{ [self.locationManager startUpdatingLocation]; }#pragma mark - CoreLocation Delegate-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ //此处locations存储了持续更新的位置坐标值,取最后一个值为最新位置,如果不想让其持续更新位置,则在此方法中获取到一个值之后让locationManager stopUpdatingLocation CLLocation *currentLocation = [locations lastObject]; //获取当前所在的城市名 CLGeocoder *geocoder = [[CLGeocoder alloc] init]; //根据经纬度反向地理编译出地址信息 [geocoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *array, NSError *error) { if (array.count >0) { CLPlacemark *placemark = [array objectAtIndex:0]; //将获得的所有信息显示到label上 NSLog(@"%@",placemark.name); //获取城市 NSString *city = placemark.locality; if (!city) { //四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市) city = placemark.administrativeArea; } self.cityName = city; NSLog(@"---%@",self.cityName); } else if (error ==nil && [array count] ==0) { NSLog(@"No results were returned."); } else if (error !=nil) { NSLog(@"An error occurred = %@", error); } }]; //系统会一直更新数据,直到选择停止更新,因为我们只需要获得一次经纬度即可,所以获取之后就停止更新 [manager stopUpdatingLocation];}- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { if (error.code ==kCLErrorDenied) { // 提示用户出错原因,可按住Option键点击 KCLErrorDenied的查看更多出错信息,可打印error.code值查找原因所在 }}@end最后记得plist文件一定要添加
<img src="http://img.blog.csdn.net/20150611151112323?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl4aWFueXVlMTk5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />否则还是白搭的
0 0
- iOS8定位服务
- IOS8定位服务
- iOS8 定位服务
- 定位服务(基于iOS8)
- IOS8 解决定位服务无法使用
- IOS8无法启用定位的服务:CLLocationManager
- 关于ios8定位服务的新增特性
- IOS:ios8.0下CLLocationManager定位服务
- IOS8 使用CLLocationManager定位服务问题
- IOS8定位
- iOS8定位
- IOS8定位
- iOS8定位
- IOS8 定位
- ios8.0下CLLocationManager定位服务需要授权了
- ios8.0下CLLocationManager定位服务需要授权了
- iOS8 程序 系统设置-定位服务-崩溃问题
- ios8.0下CLLocationManager定位服务需要授权了
- Hipi相关操作,搜索图片
- Hessian---简单例子
- Swift基础-0006 【swift函数调用】
- 链接器做了什么
- [Java IO]基础:读取文件
- iOS8 定位服务
- 100万拍卖公司转让----新拍卖公司注册—邢雪寒I50-I045-8872
- 网络检测分析工具Colasoft Capsa Free V7.7.2 官方版
- msdn帮助,离线下载
- 中介者模式 python
- 内核efi stub loader
- union_set
- 第十二周项目3-日期时间类
- js表单印证