iOS中使用定位轻松几步搞定-获取用户的位置信息

iOS中使用定位轻松几步搞定-获取用户的位置信息 Request location

基本使用与一次定位 Basic use and location once

总所周知,iOS的权限控制非常地优秀,在提高安全性的同时,也提高了用户的使用门槛,如何能让用户优雅地正常使用位置信息,正是我们开发者需要做的。

1、请求定位权限
限制位置信息使用的情况有:定位功能未开启、内容和隐私访问限制中定位服务项不允许修改、用户拒绝了位置信息访问等。应当在定位功能开启时才请求定位权限,若未开启,应当给予适当提醒。

2、检查定位权限
在你准备正式请求定位时,还是应该先确保你拥有了位置信息访问的权限。

3、请求定位
终于可以请求定位了,别忘了实现代理方法来处理位置信息,如果定位失败也别忘了给予适当提醒,或者提出建议的操作等。

在基于 BaseViewController的控制器中添加以下代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 1、请求定位权限
    [self requestLocationAuthorization:YES];
}

// 2、检查定位权限
[self requestLocationSuccessHandler:^(CLLocationManager *locationManager) {
        locationManager.delegate = self;
        // 3、请求定位
        [locationManager requestLocation];
} failureHandler:^(CLLocationManager *locationManager, CLAuthorizationStatus authorizationStatus) {
    NSString *message;
    switch (authorizationStatus) {
        case kCLAuthorizationStatusRestricted:
            message = @"定位失败:访问限制已开启";
            break;

        case kCLAuthorizationStatusDenied:
            message = @"定位失败:定位权限已禁止";
            break;

        default:
            message = @"定位失败:其它错误";
            break;
    }
    [SVProgressHUD showErrorWithStatus:message];
}];

#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    LOG_FORMAT(@"location: %g, %g", locations.firstObject.coordinate.latitude, locations.firstObject.coordinate.longitude);
}

- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error {
   [SVProgressHUD showErrorWithStatus:error.localizedDescription];
}

在iOS14中请求精确定位 Full accuracy location

在获取定位权限成功后,通过请求精确定位方法来确保功能的有效性,如果用户之前关闭了精确定位开关,会弹框让用户临时允许一次精确定位,就像让用户允许一次定位一样。temporaryFullAccuracyPurposeKey1 在 AppConfig中定义。

[self requestLocationSuccessHandler:^(CLLocationManager *locationManager) {
    if (@available(iOS 14, *)) {
        [self requestLocationTemporaryFullAccuracyAuthorizationWithPurposeKey:temporaryFullAccuracyPurposeKey1 authorizedHandler:^{
            [self->_locationManager requestLocation];
            // do some thing here
        } deniedHandler:^{
            [SVProgressHUD showErrorWithStatus:@"要使用此功能必须开启精确定位"];
        }];
    } else {
        [self->_locationManager requestLocation];
    }
} failureHandler:nil];

多次定位 Multi times location

[self requestLocationSuccessHandler:^(CLLocationManager *locationManager) {
    locationManager.delegate = self;
    [locationManager startUpdatingLocation];
} failureHandler:nil];

#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    LOG_FORMAT(@"location: %g, %g", locations.firstObject.coordinate.latitude, locations.firstObject.coordinate.longitude);
    [manager stopUpdatingLocation];
}

相关

  • 详见极致框架官网中使用位置部分的介绍。通过极致框架官网顶部的搜索功能搜索 EFBaseViewController。

许可

  • 本文采用 BY-NC-SA 许可协议。即:署名——转载请注明出处;非商业使用;相同方式传播——再分发的文章许可与原文相同。

查看原文

你可能感兴趣的:(iOS中使用定位轻松几步搞定-获取用户的位置信息)