iOS定位:获取当前行政区简单总结

1,413 阅读2分钟

由于开发用公司电脑,记录比较散,这边做个草稿整理。

1.在info.plist注册权限:

iOS11后要特别注意,如果注册多了或者少了不会弹出权限提示框,这是由于系统对Privacy - Location Always Usage Description进行了优化。如果组合不对,权限为kCLAuthorizationStatusNotDetermined,需要去设置里面主动给App开启。

具体参考文章:

关于iOS 11不能定位问题的解决方法

所以简单粗暴就是填满所有Privacy - Location ...

或者只需要偶尔定位,就开启Privacy - Location When In Use Usage Description就够了。

2.获取定位:

#import <CoreLocation/CoreLocation.h> 就行

进行地理编码或者反地理编码。

这边最好封装一个单例管理类,具体代码GitHub找。

typedef void(^LocationBlock)( CLLocation * _Nullable location,CLPlacemark *_Nullable placemark,NSString *_Nullable error);
@interface LocationManager : NSObject
+ (instancetype)sharedManager;
- (void)getCurrentLocation:(LocationBlock)block;
@end

由于工作中需要获取行政区:

省市区对应administrativeArea、locality、subLocality,考虑到有直辖市,iOS会给空值,直辖市省市应该是一个值,所以要手动赋值,参考代码如下。

    [[LocationManager sharedManager] getCurrentLocation:^(CLLocation * _Nullable location, CLPlacemark * _Nullable placemark, NSString * _Nullable error) {
        if (placemark) {
            //四大直辖市
            if ([NSString isEmpty:placemark.administrativeArea]) {
                self.province = placemark.locality;
            } else {
                self.province = placemark.administrativeArea;
            }
            if ([NSString isEmpty:placemark.locality]) {
                 self.city = placemark.administrativeArea;
            } else {
                self.city = placemark.locality;
            }
            self.area = placemark.subLocality;
            NSString *location = [NSString stringWithFormat:@"%@-%@-%@",self.province,self.city,self.area];
            self.localityLabel.text = location;
            [self getAeraListWithProvince:self.province city:self.city region:self.area];
        
        } else {
            if (error) {
                [self showToast:error];
            }
        }
    }];



3.地理位置选择器:

具体代码Github找,根据行政区滚动到picker对应的位置,需要增加接口,可以提供接口如下,仅供参考:

@interface AddressPicker : UIView
/**是否自动打开上次结果,默认为YES*/
@property (nonatomic, assign) BOOL isAutoOpenLast;
/** 实现点击按钮代理*/
@property (nonatomic ,weak) id<AddressPickerDelegate> delegate;
/**处理无定位*/
- (void)handleNoneLocality;
/**处理省市区定位*/
- (void)handleLocalityWithProvince:(NSString *)province city:(NSString *)city region:(NSString *)region;
/**处理最后一次打开定位*/
- (void)handleIsAutoOpenLast;
@end


好了,一个从权限到定位到行政区包括picker选择的iOS功能需求就搭建完成了,具体参考代码以后补充。