123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- //
- // TZLocationManager.m
- // TZImagePickerController
- //
- // Created by 谭真 on 2017/06/03.
- // Copyright © 2017年 谭真. All rights reserved.
- // 定位管理类
- #import "TZLocationManager.h"
- #import "TZImagePickerController.h"
- @interface TZLocationManager ()<CLLocationManagerDelegate>
- @property (nonatomic, strong) CLLocationManager *locationManager;
- /// 定位成功的回调block
- @property (nonatomic, copy) void (^successBlock)(NSArray<CLLocation *> *);
- /// 编码成功的回调block
- @property (nonatomic, copy) void (^geocodeBlock)(NSArray *geocodeArray);
- /// 定位失败的回调block
- @property (nonatomic, copy) void (^failureBlock)(NSError *error);
- @end
- @implementation TZLocationManager
- + (instancetype)manager {
- static TZLocationManager *manager;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- manager = [[self alloc] init];
- manager.locationManager = [[CLLocationManager alloc] init];
- manager.locationManager.delegate = manager;
- [manager.locationManager requestWhenInUseAuthorization];
- });
- return manager;
- }
- - (void)startLocation {
- [self startLocationWithSuccessBlock:nil failureBlock:nil geocoderBlock:nil];
- }
- - (void)startLocationWithSuccessBlock:(void (^)(NSArray<CLLocation *> *))successBlock failureBlock:(void (^)(NSError *error))failureBlock {
- [self startLocationWithSuccessBlock:successBlock failureBlock:failureBlock geocoderBlock:nil];
- }
- - (void)startLocationWithGeocoderBlock:(void (^)(NSArray *geocoderArray))geocoderBlock {
- [self startLocationWithSuccessBlock:nil failureBlock:nil geocoderBlock:geocoderBlock];
- }
- - (void)startLocationWithSuccessBlock:(void (^)(NSArray<CLLocation *> *))successBlock failureBlock:(void (^)(NSError *error))failureBlock geocoderBlock:(void (^)(NSArray *geocoderArray))geocoderBlock {
- [self.locationManager startUpdatingLocation];
- _successBlock = successBlock;
- _geocodeBlock = geocoderBlock;
- _failureBlock = failureBlock;
- }
- #pragma mark - CLLocationManagerDelegate
- /// 地理位置发生改变时触发
- - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
- [manager stopUpdatingLocation];
-
- if (_successBlock) {
- _successBlock(locations);
- }
-
- if (_geocodeBlock && locations.count) {
- CLGeocoder *geocoder = [[CLGeocoder alloc] init];
- [geocoder reverseGeocodeLocation:[locations firstObject] completionHandler:^(NSArray *array, NSError *error) {
- self->_geocodeBlock(array);
- }];
- }
- }
- /// 定位失败回调方法
- - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
- NSLog(@"定位失败, 错误: %@",error);
- switch([error code]) {
- case kCLErrorDenied: { // 用户禁止了定位权限
-
- } break;
- default: break;
- }
- if (_failureBlock) {
- _failureBlock(error);
- }
- }
- @end
|