iOS 8 MKMapView ошибка запроса местоположения пользователя


Я пытался переместить мое приложение iOS7 с MKMapview для поддержки iOS8. Однако я не смог получить новый запрос для пользователей, чтобы поделиться своими местоположениями, чтобы работать должным образом. Я создаю свой MKMapView на раскадровке, и делегат установлен и отлично работает на iOS7. Вот что я добавил Для поддержки совместного использования местоположения iOS8:

myMapView.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

@interface myMapView : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>

@property (strong, nonatomic) IBOutlet MKMapView *mapView;
@property (strong, nonatomic) CLLocationManager *locationManager;

myMapView.m

//Code omitted
#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
//Code omitted
- (void)viewDidLoad {
    [super viewDidLoad];
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;

    if(IS_OS_8_OR_LATER) {
        //[self.locationManager requestWhenInUseAuthorization];
        [self.locationManager requestAlwaysAuthorization];
        [self.locationManager startUpdatingLocation];
    }
    [self.mapView setShowsUserLocation:YES];
    [self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    MKCoordinateRegion region = { { 0.0, 0.0 }, { 0.0, 0.0 } };
    region.center.latitude = self.locationManager.location.coordinate.latitude;
    region.center.longitude = self.locationManager.location.coordinate.longitude;
    region.span.latitudeDelta = 0.0187f;
    region.span.longitudeDelta = 0.0137f;
    [self.mapView setRegion:region animated:YES];

    _initialPosition = NO;
}

Также я установил NSLocationAlwaysUsageDescription ключ и его значение в моем InfoPlist, который показывает правильный сообщение при запросе пользователя поделиться своим местоположением.

К сожалению, функция делегата -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations никогда не вызывается. Хотя каждый раз, когда viewController загружается, вызывается [self.locationManager startUpdatingLocation], но делегат, похоже, не отвечает на него. Есть ли проблема в том, как я устанавливаю делегат, или есть что-то еще, что я здесь упускаю?

UPDATE: похоже также, что мой файл gpx не вызывается при запуске. Я очистил и перезагрузил свой файл местоположения, даже изменил его на расположение по умолчанию, но оно не найдено: Domain=kCLErrorDomain Code=0

UPDATE 2: Вот SS из настроек, которые мне действительно удалось выполнить с запросом пользователя, но не удается получить/обновить местоположение независимо от того, сколько я обновляю. уровень конфиденциальности приложения: общий доступ к местоположению всегда http://barisaltop.com/location.png

Спасибо!

2 2

2 ответа:

У меня была такая же проблема несколько дней назад. Решением было добавление string ключей NSLocationAlwaysUsageDescription (для [CLLocationManager requestAlwaysAuthorization]) или NSLocationWhenInUseUsageDescription (для [CLLocationManager requestWhenInUseAuthorization]) к вашим вспомогательным файлам/информации.plist

Вы также можете отредактировать исходный код Info.Plist С помощью правой кнопки мыши > открыть как > исходный код и добавить следующие строки:

<!-- for requestAlwaysAuthorization -->
<key>NSLocationAlwaysUsageDescription</key>
<string>Explain for what are you using the user location</string>
<!-- for requestWhenInUseAuthorization -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>Explain for what are you using the user location</string>

Надеюсь, это поможет.

Наконец-то мне удалось запустить мой файл gpx на симуляторе. Похоже, что после установки Xcode 6 в первый раз, может возникнуть ошибка, из-за которой файлы gpx будут имитироваться. Вот как я преодолел эту проблему:

  1. я удалил свое приложение из симулятора
  2. В разделе приложение - > возможности включены фоновые режимы- > обновления местоположения
  3. запустите приложение и дайте ему установить на симулятор
  4. разрешить доступ, и я смог найти пользователя с помощью GPX
  5. После этого я отключил обновления местоположения.
Не знаю почему, но это сыграло со мной злую шутку.