//
|
// 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;
|
if (iOS8Later) {
|
[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
|