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<CLLocation *> *)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<CLLocation *> *)locations {
LOG_FORMAT(@"location: %g, %g", locations.firstObject.coordinate.latitude, locations.firstObject.coordinate.longitude);
[manager stopUpdatingLocation];
}
相关
- 详见极致框架官网<extreme.framework/EFBaseViewController.h>中使用位置部分的介绍。通过极致框架官网顶部的搜索功能搜索 EFBaseViewController。
许可
- 本文采用 BY-NC-SA 许可协议。即:署名——转载请注明出处;非商业使用;相同方式传播——再分发的文章许可与原文相同。
网友评论