zoukankan      html  css  js  c++  java
  • 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设置如下:

    允许效果:

  • 相关阅读:
    软件测试
    数据库中查询json 样式的值的sql语句
    xml转json的方法
    将数据保存本地文件
    Spring 配置 web.xml (防止spring 内存溢出)
    解决maven工程 子工程中的一些配置读取进来的问题
    quartz 的简单使用
    mock 测试 MVC
    sun 证书问题解决
    将文本转换为json的工具类
  • 原文地址:https://www.cnblogs.com/mantgh/p/4097661.html
Copyright © 2011-2022 走看看