- [Запрос CLLocationManagerWhenInUseAuthorization] или - [Ошибка запроса CLLocationManagerAlwaysAuthorization]
Это мой код, отображающий как предупреждение, так и синюю точку для текущей позиции на карте:
MapName.h
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
@interface MapName : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>
@property (strong, nonatomic) IBOutlet MKMapView *MapName;
@property (strong, nonatomic) CLLocationManager *locationManager;
@end
MapName.m
- (void)viewDidLoad
{
[super viewDidLoad];
self.locationManager = [[CLLocationManager alloc]init];
self.locationManager.delegate = self;
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];
//Center the map
[self gotoLocation];
//Show current position
_MapName.showsUserLocation = YES;
}
Я добавил ключ NSLocationWhenIsUseUsageDescription
в качестве строки в Info.plist.
Я по-прежнему получаю ту же ошибку на Xcode.
Ответы
Ответ 1
Это связано с обоими:
[self.locationManager startUpdatingLocation];
и
_MapName.showsUserLocation = YES;
Вам нужно проверить, предоставил ли пользователь разрешение, прежде чем вы их вызовете. Также убедитесь, что вы отключили местоположение пользователя в MKMapKit на раскадровке (мне потребовались дни для отслеживания).
Сделайте что-то вроде:
CLAuthorizationStatus authorizationStatus= [CLLocationManager authorizationStatus];
if (authorizationStatus == kCLAuthorizationStatusAuthorized ||
authorizationStatus == kCLAuthorizationStatusAuthorizedAlways ||
authorizationStatus == kCLAuthorizationStatusAuthorizedWhenInUse) {
[self.locationManager startUpdatingLocation];
_MapName.showsUserLocation = YES;
}
В зависимости от вашего приложения вы не можете запрашивать разрешения пользователя при запуске, так как это не рекомендуется.
Ответ 2
Сообщение об ошибке довольно буквальное. Не вызывайте [self.locationManager startUpdatingLocation]
, пока не получите авторизацию. Ваш [self.locationManager requestWhenInUseAuthorization]
, для документов, является асинхронным.
Если текущим статусом авторизации является kCLAuthorizationStatusNotDetermined
, этот метод выполняется асинхронно и запрашивает у пользователя разрешение на использование приложений для определения местоположения.
Это означает, что вы одновременно запрашиваете доступ, а также запускаете сканирование в одно и то же время.
Вместо этого попробуйте реализовать -[CLLocationManagerDelegate locationManager:didChangeAuthorizationStatus:]
и начать сканирование там после того, как будет определено, что у вас есть авторизация.
Ответ 3
Быстро:
let locationManager: CLLocationManager = CLLocationManager()
let authorizationStatus = CLLocationManager.authorizationStatus()
override func viewDidLoad() {
super.viewDidLoad()
if(authorizationStatus == .AuthorizedWhenInUse || authorizationStatus == .AuthorizedAlways) {
locationManager.startUpdatingLocation()
}
else
{
locationManager.requestWhenInUseAuthorization()
}
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
}
Не забудьте добавить в файл Info.plist следующие ключи:
![введите описание изображения здесь]()
Ответ 4
Ключевое слово в файле информации ( "В" вместо "Is" ):
NSLocationWhenInUseUsageDescription
Ответ 5
Этот способ работает без ошибок в Xcode6:
AppDelegate.h
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) UIWindow *window;
@end
AppDelegate.m
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize locationManager = _locationManager;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//Current position
self.locationManager = [[CLLocationManager alloc] init];
[self.locationManager requestWhenInUseAuthorization];
return YES;
}
@end
Предупреждающее сообщение показывает, когда вы открываете приложение в первый раз
Ответ 6
Основываясь на ответе Джерома, я перевел ответ, который работал у меня в Свифт.
let authorizationStatus = CLLocationManager.authorizationStatus()
if(authorizationStatus == .AuthorizedWhenInUse || authorizationStatus == .AuthorizedAlways) {
self.findMyLocation()
}
Примечание. Из того, что я прочитал в документах, в Swift нет эквивалента kCLAuthorizationStatusAuthorized
.