- [Запрос 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.