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后进行添加]:

参考:http://blog.devzeng.com/blog/ios8-corelocation-framework.html

本人写了个代码共享一下

////  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
原创粉丝点击