iOS高德定位

℡╲_俬逩灬. 提交于 2020-02-29 22:41:07
  1. 要定位要先了解有关定位的几个协议

    <CLLocationManagerDelegate,MKMapViewDelegate>

  2.包含两个头文件<MapKit/MapKit.h> <CoreLocation/CoreLocation.h>

 2.

#pragma mark - CLLocationDelegate
//在坐标改变的时候才会调用
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
#pragma mark - MKMapDelegate
//每次定位都会调用
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation

 3.但iOS8之后有时候定位会不成功

   需要要在info.plist加一个文件就不会有这种情况了 -- 》NSLocationAlwaysUsageDescription

4.定位测试的时候最好用真机,模拟机经常不行的。

5.现在考虑两个问题,如何提醒用户开启定位?如何提醒用户开启定位授权(光是开启定位是没用的,还需要给予定位的权限)

5.1提醒用户开启定位可以写在

if (![CLLocationManager locationServicesEnabled]||[CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorizedWhenInUse) {
        [_locationManager requestWhenInUseAuthorization];
    }else
    {
        UIAlertController * alterC = [UIAlertController alertControllerWithTitle:@"请打开定位" message:nil preferredStyle:UIAlertControllerStyleAlert];
        [alterC addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:nil]];
        [self presentViewController:alterC animated:YES completion:nil];
    }

5.2 而用户定位权限的提醒不开的话,2 里面写的两个协议里面的方法就不会调用了,那如何知道用户没有开启定位权限?

我是采用了一个时间定时器。

这只是我个人的思路 如果大家有更好的可以提意见。

思路1:因为如果说当经纬度为0 的时候就跳出一个提醒框,会有一个问题,必须设一个全局变量的经纬度,然后用于接收协议方法里的到的金纬度,如果金纬度为0,0就跳出提醒,不为0,0就不跳出,可是刚开始要先初始化这两个全局的经纬度,所以刚开始肯定是先为(0,0)才不为(0,0),所以不管给没给APP定位权限都会跳出提醒框,所以这个思路不行。

思路2:结合以上思路在加一个时间控制器,如果经纬度为(0,0)并且时间控制器不断的调用一个方法,这个方法里面加了一个参数 _value,没次都给他加一个1,设置大概时间为8秒,如果8秒后经纬度还是为(0,0)而_value的值已经大于8了,那就说明用户没有给予APP定位权限这个时候就可以跳提醒。

{
NSInteger _value;
NSTimer * _timer;
}
先给方法传入一个经纬度为0,0的值
[self cityLatitude:0 longtitude:0];

//时间控制器
    _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(cityLatitude:longtitude:) userInfo:nil repeats:YES];

//提醒打开设置--隐私--定位
- (void)cityLatitude:(CLLocationDegrees)latitiude longtitude:(CLLocationDegrees)longtitude
{
    _value++;
//    NSLog(@"%f %f %ld",latitiude,longtitude,(long)_value);
    if (_value > 8) {
        [_timer invalidate];
    }else if (latitude != 0)
    {
        [_timer invalidate];
    }
    if (_value >8 && latitiude == 0) {
        UIAlertController * alterC = [UIAlertController alertControllerWithTitle:@"请打开定位" message:@"设置->隐私->定位->打开" preferredStyle:UIAlertControllerStyleAlert];
        [alterC addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:nil]];
        [self presentViewController:alterC animated:YES completion:nil];
    }
   
}
#pragma mark - MKMapDelegate
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    //把定位经纬度发送给 根据坐标算出城市名的方法
    [self getCityNameByLatitude:userLocation.location.coordinate.latitude longtitude:userLocation.location.coordinate.longitude];
    //吧坐标发个 判断定位是否授权的方法
    [self cityLatitude:userLocation.location.coordinate.latitude longtitude:userLocation.location.coordinate.longitude];

}


根据经纬度算出用户所在城市,而经纬度就是协议方法里的得到的

- (void)getCityNameByLatitude:(CLLocationDegrees)latitude longtitude:(CLLocationDegrees)longtitude
{
    CLLocation * location = [[CLLocation alloc]initWithLatitude:latitude longitude:longtitude];
    [_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        CLPlacemark * placeMark = [placemarks firstObject];
        NSLog(@"%@",[placeMark.addressDictionary objectForKey:@"City"]);
        
        _cityModel.cityName = [placeMark.addressDictionary objectForKey:@"City"];
        [_button setTitle:_cityModel.cityName forState:UIControlStateNormal];
    }];
    [_locationManager stopUpdatingLocation];
}

Demo:http://pan.baidu.com/s/1hrdWx3Q


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!