iOS开发手记-iOS8中使用定位服务解决方案

问题描述:

在iOS8之前,app第一次开始定位服务时,系统会弹出一个提示框来让用户选择是否允许使用定位信息。但iOS8后,app将不会出现这个弹窗。第一次运行之后,在设置->隐私->定位服务中,你的app没有任何设置,既不是“永不”,也不是“始终”。

代码如下:

#import "XYZFirstViewController.h"

@interface XYZFirstViewController ()
- (IBAction)LocateButtonClick:(id)sender;
@end

@implementation XYZFirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startLocate) name:@"startLocateNotification" object:nil];
    _locationManager=[[CLLocationManager alloc] init];
    _locationManager.delegate=self;
    _locationManager.desiredAccuracy=kCLLocationAccuracyBest;
    _locationManager.distanceFilter=1000.0f;
    _mapView.mapType=MKMapTypeStandard;
    _mapView.delegate=self;

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [_locationManager startUpdatingLocation];
}

-(void) viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [_locationManager stopUpdatingLocation];
}

-(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *currentLocation=[locations lastObject];
    _currentLocation=currentLocation;
    self.currentLocationLabel.text=[NSString stringWithFormat:@"%3.5f,%3.5f,%3.5f", currentLocation.coordinate.longitude,currentLocation.coordinate.latitude,currentLocation.altitude];
    MKCoordinateRegion region=MKCoordinateRegionMakeWithDistance(currentLocation.coordinate, 1000, 1000);
    [_mapView setRegion:region animated:YES];
    MKPointAnnotation *point=[[MKPointAnnotation alloc] init];
    point.coordinate=_currentLocation.coordinate;
    point.title=@"my location";
    [_mapView addAnnotation:point];
}

-(void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"error:%@",error);
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

- (IBAction)LocateButtonClick:(id)sender {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"startLocateNotification" object:self ];
}

-(void) startLocate
{
    CLGeocoder *geocoder=[[CLGeocoder alloc]init];
    [geocoder reverseGeocodeLocation:_currentLocation completionHandler:^(NSArray *placeMarks, NSError *error)
     {
        if([placeMarks count]>0)
        {
            NSLog(@"%@",placeMarks);
            CLPlacemark *placeMark=placeMarks[0];
            NSDictionary *addressDictonary=placeMark.addressDictionary;
            _currentAddressLabel.text=[NSString stringWithFormat:@"%@,%@,%@",[addressDictonary objectForKey:(NSString *)kABPersonAddressStateKey],[addressDictonary objectForKey:(NSString *)kABPersonAddressCityKey],[addressDictonary objectForKey:(NSString *) kABPersonAddressStreetKey] ];
        }
     }];

}
@end

解决方案:

以上代码在iOS8之后需要手动调用CLLocationManager对象的requestAlwaysAuthorization/

requestWhenInUseAuthorization方法。 调用该方法需要在Info.plist中设置NSLocationAlwaysUsageDescription/NSLocationWhenInUseUsageDescription的值,这个值会显示在系统提示框中。

代码如下:

-(void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [_locationManager requestWhenInUseAuthorization];
    [_locationManager startUpdatingLocation];
}

info.plist设置如下:

允许效果:

时间: 2024-10-16 06:51:38

iOS开发手记-iOS8中使用定位服务解决方案的相关文章

iOS8中的定位服务

My app that worked fine in iOS 7 doesn't work with the iOS 8 SDK. CLLocationManager doesn't return a location, and I don't see my app under Settings > Location Services either. I did a Google search on the issue but nothing came up, what could be wro

iOS 开发指南 第16章 定位服务与地图应用

1 定位服务编码 使用Core Location框架 CLLocationManger:用于定位服务管理类,能够给我们提供位置信息和高度信息,也可以监控设备进入或离开某个区域,还可以获得设备的运行方向等. CLLocation:封装了位置和高度信息. CLLocationMangerDelegate 准备:加载Core Location框架 修改工程配置:Supporting Files-Info.pist添加NSLocationAlwaysUSageDescription和NSLocation

iOS 开发指南 第16章 定位服务与地图应用之使用苹果地图

1 显示地图 MKMapView MKMapViewDelegate 准备:加载MapKit.framework 设置地图样式 代理-实现代理方法 - (void)viewDidLoad { [super viewDidLoad]; 设置样式,枚举类型MKMapType self.mapView.mapType = MKMapTypeStandard; // self.mapView.mapType = MKMapTypeSatellite; 将当前视图控制器赋值给地图视图的delegate属性

IOS开发之 ---- iOS8中提示框的使用UIAlertController(UIAlertView和UIActionSheet二合一)

群号:49690168 转:http://blog.csdn.net/liangliang103377/article/details/40078015 iOS8推出了几个新的“controller”,主要是把类似之前的UIAlertView变成了UIAlertController,这不经意的改变,貌似把我之前理解的“controller”一下子推翻了-但是也无所谓,有新东西不怕,学会使用了就行.接下来会探讨一下这些个新的Controller. - (void)showOkayCancelAle

iOS 开发 关于应用中使用拨打电话那点事

一.利用openURL(tel) 特点: 直接拨打, 不弹出提示. 并且, 拨打完以后, 留在通讯录中, 不返回到原来的应用. - (void)callPhone:(NSString *)phoneNumber {     //phoneNumber = "18369......"     NSMutableString * str=[[NSMutableString alloc] initWithFormat:@"tel:%@",phoneNumber];    

iOS开发之CoreLocaiton框架使用(定位服务)

前言 在iOS开发中,定位和地图功能是比较常用的功能之一,要想加入这2大功能,必须基于2个框架进行开发. (1) CoreLocation:用于地理定位,地理编码,区域监听等(着重功能实现). (2) MapKit:用于地图展示,例如大头针,路线.覆盖层展示等(着重界面展示). 这篇文章我们来着重的介绍下CoreLocation框架 简介 CoreLocaiton框架是百度地图的定位也是在苹果API的基础上进行了封装. CoreLocation框架使用前提 导入框架(Xcode5.0之后可以省略

iOS8 程序 系统设置-定位服务-崩溃问题

关于iOS8的定位问题这里我就不详细说了,只针对我遇到的问题来说明一下,不过也不用担心,我会为你推荐一篇文章. iOS8 系统定位问题:传送门 好了,下面开始说我遇到的问题, 经过一番调试,iOS8已经可以定位成功,但是我遇到了一个比较奇怪的问题. 在系统设置-->隐私-->定位服务中,点击其中自己的程序进行设置,然后系统设置就会直接崩溃. 然后我就参照上一篇文章进行对比,最后发现了一个可疑的地方. 正常情况下在 项目info.plist中 添加的两个字段是string类型的. 但是我设置的却

iOS开发实战——CollectionView中cell的间距设置

我在前面多篇博客中详细讲解了CollectionView的使用与自定义CollectionViewCell的设计,可以参考<iOS开发实战--CollectionView点击事件与键盘隐藏结合案例><iOS高级开发--CollectionView修改cell的文本及模型重构>这几篇博客.但是今天还是需要来讲讲CollectionView实现中的一个小小的坑,这是我最近在网上浏览时发现很多开发者经常犯的错,所以我觉得有必要来好好谈一谈. 一个CollectionView控件中,两个c

CentOS----宿主机无法访问虚拟机中的web服务解决方案

宿主机无法访问虚拟机中的web服务 在Windows7宿主机中的VMware虚拟机中安装了CentOS6.5操作系统,并且基于Nginx搭建了Web服务器,网页刚刚搭建好的时候,通过宿主机的浏览器可以访问虚拟机中的网页.但是过了一会儿,就无法访问了,这个问题困扰了自己好几天,每次只好通过虚拟机快照返回到刚刚建立好web服务的那一步,这样就能访问了,但过了一会儿又不能访问了. 后来通过网上查找资料,终于明白了,是一位CentOS6.5的防火墙没有开通web服务的80端口,屏蔽了外部的访问.有两种方