由于开发用公司电脑,记录比较散,这边做个草稿整理。
1.在info.plist注册权限:
iOS11后要特别注意,如果注册多了或者少了不会弹出权限提示框,这是由于系统对Privacy - Location Always Usage Description进行了优化。如果组合不对,权限为kCLAuthorizationStatusNotDetermined,需要去设置里面主动给App开启。
具体参考文章:
所以简单粗暴就是填满所有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功能需求就搭建完成了,具体参考代码以后补充。