iOS 系统定位具体到省市区街道

iOS系统自带定位,用CLLocationManager就可以轻松的实现定位的操作,获得的是一组经纬度,当然,也可以根据给出的经纬度获取相应的省份、城市、街道等信息,下面就看一个根据经纬度获得城市的demo;(无聊研究的,仅供参考)

副本主要任务

  • 定位设备经纬度与所在城市

预备知识-CLLocation对象(可跳过)

CLLocation对象存储着CLLocationManager对象生成的位置数据,先介绍一下它的属性大概了解CLLocation是什么东西

用于定位的属性含义
coordinate 地理位置(经纬度)
altitude 海拔
floor 建筑内逻辑楼层
timestamp 定位时间戳
horizontalAccuracy 水平技能范围,单位米(见注1)
verticalAccuracy 海拔误差,单位米

注1:我们在地图上的点由经度和纬度确定,horizontalAccuracy表示该圆的半径是多大(单位为米),负值表示该点无效(经常用在if语句中判断点是否可用)

用于速度和方向的属性含义
speed 瞬时速度
course 设备移动方向

 

2.获取经纬度

2.1 iOS8前的BUG

我们需要在info.plist文件里添加两个字段给APP定位权限,不然在iOS8后是无法启动定位的。他们分别是

属性名含义
NSLocationWhenInUseUsageDescription 使用期间
NSLocationAlwaysUsageDescription 始终开启

添加如下:


 

上个效果图好理解点:


 



- (void)findCurrentLocation {
    self.isFirstUpdate = YES;
    // 1
    if (! [CLLocationManager locationServicesEnabled]) {
        [TSMessage showNotificationWithTitle:@"未开启定位服务"
                                    subtitle:@"请开启定位服务定位您所在城市."
                                        type:TSMessageNotificationTypeError];
    }
    // 2
    else if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        [self.locationManager requestWhenInUseAuthorization];
        [self.locationManager startUpdatingLocation];
    }
    // 3
    else {
        [self.locationManager requestAlwaysAuthorization];
        [self.locationManager startUpdatingLocation];
    }
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    if (self.isFirstUpdate) {
        // 4
        self.isFirstUpdate = NO;
        return;
    }

    // 5
    CLLocation *newLocation = [locations lastObject];

    self.currentLocation = newLocation;

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    // 反向地理编译出地址信息
    [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if (! error) {
            if ([placemarks count] > 0) {
                CLPlacemark *placemark = [placemarks firstObject];

                // 获取城市
                NSString *city = placemark.locality;
                if (! city) {
                    // 6
                    city = placemark.administrativeArea;
                }

                self.currentCity = city;
            } else if ([placemarks count] == 0) {
                [TSMessage showNotificationWithTitle:@"GPS故障"
                                            subtitle:@"定位城市失败"
                                                type:TSMessageNotificationTypeError];
            }
        } else {
            [TSMessage showNotificationWithTitle:@"网络错误"
                                        subtitle:@"请检查您的网络"
                                            type:TSMessageNotificationTypeError];
        }
    }];
    [self.locationManager stopUpdatingLocation];
}
原文地址:https://www.cnblogs.com/LynnAIQ/p/6202760.html