Emplacement principal ne fonctionne pas dans iOS 8

J'essaie d'utiliser la surveillance de changement de position significative dans iOS 8, mais la méthode didUpdateLocations n'est jamais appelée. Voici le code pour configurer le gestionnaire de localization:

- (void)viewDidLoad { [super viewDidLoad]; CLLocationManager *locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; [locationManager requestWhenInUseAuthorization]; [locationManager startMonitoringSignificantLocationChanges]; } 

Malgré l'appel de requestWhenInUseAuthorization , rien ne requestWhenInUseAuthorization pour requestr à l'user de l'autoriser. J'ai placé NSLocationWhenInUseUsageDescription, et cela ne fonctionne toujours pas. didChangeAuthorizationStatus et didFailWithError sont jamais non plus appelés. EDIT: J'ai été en mesure de l'get pour requestr à l'user d'autoriser les services de localization, mais même si vous click Autoriser, il ne montre jamais l'location.

Il y a actuellement un bug dans iOS8 beta5 qui désactive toujours le service de geolocation pour votre application (du less pour le mien).

Allez dans les settings > Privacy > Location services > Your app > Always .

Mais je ne sais pas pourquoi, mais même si vous le réglez sur Always ce paramètre se désactive automatiquement, alors soyez patient et revenez souvent dans les parameters pour configurer à nouveau l'location de votre application.

Essayez de déclarer CLLocationManager *locationManager dans votre file d'en-tête, puis cela fonctionne. À less que je l'ai déclaré comme variable globale, il ne request pas d'autorisation et ne met pas à jour l'location.

.h

 #import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> @interface ViewController : UIViewController <CLLocationManagerDelegate> { CLLocationManager *locationManager; } 

.m

 - (void)viewDidLoad { [super viewDidLoad]; locationManager = [[CLLocationManager alloc] init]; [locationManager setDelegate:(id)self]; [locationManager requestWhenInUseAuthorization]; [locationManager startMonitoringSignificantLocationChanges]; [locationManager startUpdatingLocation]; } 

Déléguer les methods

 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { NSLog(@"Getting Location"); } -(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { NSLog(@"%@", error.localizedDescription); } 

info.plis

entrez la description de l'image ici

dans le file .plist append entrez la description de l'image ici

 locationManager = [[CLLocationManager alloc] init]; [locationManager setDelegate:self]; [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters]; if(IS_OS_8_OR_LATER) { if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { [locationManager requestWhenInUseAuthorization]; } } [locationManager startUpdatingLocation]; - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { currentLocation = [locations lastObject]; } 

Toutes les étapes semblent complètes mais exécutées : startUpdatingLocation uniquement après avoir vérifié : didChangeAuthorizationStatus .

À ce stade, assurez-vous que le paramètre authorizationStatus n'est pas kCLAuthorizationStatusNotDetermined ou kCLAuthorizationStatusDenied .

Si c'est le cas, vérifiez les inputs de string dans info.plist.

Si vous pensez que tout est correct, assurez-vous de désinstaller l'application de l'appareil. Effectuez une génération propre, puis exécutez l'application sur l'appareil.

J'ai eu un problème similaire migrant mon application vers iOS 8. Comme le code original basé sur l'exemple de code fourni par Apple https://developer.apple.com/library/ios/samplecode/GeocoderDemo/Introduction/Intro.html J'ai vérifié si il avait été mis à jour et il l'avait fait. La principale différence est dans cette fonction le bit pertinent pour iOS 8, a été commenté. Cela a fonctionné pour moi.

 - (void)startUpdatingCurrentLocation { // if location services are ressortingcted do nothing if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusRessortingcted ) { return; } // if locationManager does not currently exist, create it if (self.locationManager == nil) { _locationManager = [[CLLocationManager alloc] init]; [self.locationManager setDelegate:self]; self.locationManager.distanceFilter = 10.0f; // we don't need to be any more accurate than 10m } // for iOS 8, specific user level permission is required, // "when-in-use" authorization grants access to the user's location // // important: be sure to include NSLocationWhenInUseUsageDescription along with its // explanation ssortingng in your Info.plist or startUpdatingLocation will not work. // if ([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { [_locationManager requestWhenInUseAuthorization]; } [_locationManager startUpdatingLocation]; [self showCurrentLocationSpinner:YES]; } 

Essayer

  1. Mode d'arrière-plan activé dans les capacités

  2. #import <CoreLocation/CoreLocation.h>

  3. <CLLocationManagerDelegate>

  4. locationManager = [[CLLocationManager alloc] init]; [locationManager setDelegate:(id)self]; [locationManager requestWhenInUseAuthorization];

    C'est au début de l'application

  5. NSLocationWhenInUseUsageDescription dans plist

  6. Essayez de CMD + SHIFT + K

  7. Essayez d'éteindre l'iPhone et ensuite allumer – il avait de l'argent dans iOS 8 – donc après 5 fois – application ne request pas la permission de Core Location – qui m'a aidé

La raison probable, pourquoi la boîte de dialog d'autorisation n'est pas affichée avec le code OPs, est que le gestionnaire de localization doit traîner pour que cela fonctionne.

Utilisez une propriété ou une variable statique pour conserver locationManager en memory.

Peut-être que c'est à cause du WhenInUseAuthorization n'est pas suffisant pour les mises à jour " Changement d'location significatif ".

Quand j'utilise AlwaysAuthorization , ça marche.

Je ne peux pas le find dans les docs. Mais vous pouvez vérifier http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/ . Sous l'en-tête "Types d'autorisation", il est indiqué que les mises à jour importantes de l'location nécessitent une autorisation AlwaysAuthorization.