CLLocationManager 封装

本文介绍了一个用于iOS设备的位置管理类ZJLocManager,该类通过CLLocationManager实现位置信息的获取,并提供持续定位及一次性定位的功能。文章详细展示了如何使用这个类来获取用户的位置信息,并提供了错误处理的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS的配置权限,问度娘

#import <CoreLocation/CoreLocation.h>

@interface ZJLocManager : CLLocationManager

+(instancetype)share;

/* 获取位置信息

 * @param allows 是否持续定位

 * @param successBlock 定位成功回调

 */

-(void)locationIsAllows:(BOOL) allows SuccessBlock:(void(^)(NSString * locInfo,CLLocationCoordinate2D coord))successBlock;

@end


#import "ZJLocManager.h"

static ZJLocManager * manager = nil;

@interface ZJLocManager() <CLLocationManagerDelegate>

// 持续定位回调

@property(nonatomic,copy) void(^allowsSuccessBlock)(NSString * locInfo,CLLocationCoordinate2D coord);

// 只需定位一次回调

@property(nonatomic,copy) void(^successBlock)(NSString * locInfo,CLLocationCoordinate2D coord);

@end

@implementation ZJLocManager

+(instancetype) share {

    static dispatch_once_t onceToken ;

    dispatch_once(&onceToken, ^{

        manager = [[ZJLocManager alloc] init];

        manager.desiredAccuracy = kCLLocationAccuracyBest; //定位精确度

        manager.distanceFilter  = kCLDistanceFilterNone;//实时更新定位位置

        if([manager respondsToSelector:@selector(requestAlwaysAuthorization)]){

            [manager requestAlwaysAuthorization];

        }

        //该模式是抵抗程序在后台被杀,申明不能够被暂停

        manager.pausesLocationUpdatesAutomatically = NO;

        //

        if (@available(iOS 9.0, *)) {

            manager.allowsBackgroundLocationUpdates = NO;

        }

    });

    return manager;

}

//

-(void)locationIsAllows:(BOOL)allows SuccessBlock:(void(^)(NSString * locInfo,CLLocationCoordinate2D coord))successBlock{

    [self startZJLocation];

    if(allows){

        self.allowsSuccessBlock = successBlock;

    }else{

        self.successBlock = successBlock;

    }

}

// 开始定位

-(void)startZJLocation{

    manager.delegate = self;

    [self startUpdatingLocation];

}

// 停止定位

-(void) stopZJLocation{

    manager.delegate = nil;

    [self stopUpdatingLocation];

}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {

    CLLocation *newLocation = [locations lastObject];

    CLGeocoder *geocoder = [[CLGeocoder alloc]init];

    [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray<CLPlacemark *> *_Nullable placemarks, NSError * _Nullable error) {

        CLPlacemark *place = [placemarks firstObject];

        NSDictionary *address = [place addressDictionary];

        NSString * locInfo =[NSString stringWithFormat:@"%@-%@-%@-%@-%@",[address objectForKey:@"State"],[address objectForKey:@"City"],[address objectForKey:@"SubLocality"],[address objectForKey:@"Thoroughfare"],[address objectForKey:@"Name"]];

        if(self.successBlock){

            self.successBlock(locInfo,newLocation.coordinate);

            self.successBlock = nil;

        }

        if(self.allowsSuccessBlock){

            self.allowsSuccessBlock(locInfo,newLocation.coordinate);

        }

//        for (CLPlacemark *place in placemarks) {

//        }

    }];

}

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{

    

    if ([error code] == kCLErrorDenied){

        //访问被拒绝

    }

    if ([error code] == kCLErrorLocationUnknown) {

        //无法获取位置信息

        //[MBProgressHUD showError:@"获取位置信息失败" ];

    }

    NSLog(@"获取定位信息失败");

}

@end



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值