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设置如下:

    允许效果:

  • 相关阅读:
    oracle的根容器下新建pdb容器及本地用户
    oracle监听配置与防火墙问题
    oracle问题:ORA-09817及解决办法
    Oracle:Ora-01652无法通过128(在temp表空间中)扩展temp段的过程-解决步骤
    oracle:ORA-14765建索引阻塞创建分区及处理步骤
    oracle-组合索引字段位置与查询效率之间的关系
    hbase的split策略和预分区
    启动hbase后hmaster自动关闭
    hive一级分区、二级分区、动态分区
    hive beeline连接和交互shell连接
  • 原文地址:https://www.cnblogs.com/mantgh/p/4097661.html
Copyright © 2011-2022 走看看