Ho appena aggiornato a Xcode 6/iOS 8 SDK e la simulazione del servizio di localizzazione nel simulatore ha iniziato a non funzionare. Stava bene prima di essere aggiornato (al momento non sono in grado di testare sul dispositivo reale). Ora, quando seleziono una posizione per la simulazione, non succede nulla. Il metodo -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
del delegato non viene chiamato. Ho riavviato Xcode, pulito la cartella di build, nulla è cambiato. Perché può accadere?La simulazione posizione Xcode 6/iOS 8 non funziona
risposta
Dato che IOS 8 è necessario chiedere l'autorizzazione prima di avviare CLLocationManager.
Stai chiamando uno di questi metodi?
[self.locationManager requestWhenInUseAuthorization]; // For foreground access
[self.locationManager requestAlwaysAuthorization]; // For background access
Se è stato creato il progetto prima XCode 6, probabilmente anche bisogno di aggiungere la voce info.plist per la nuova autorizzazione.
Per maggiori dettagli un'occhiata a questo post: Location Services not working in iOS 8
Aggiungi sotto il codice nel metodo
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
{
[self.locationManager requestWhenInUseAuthorization];
}
aggiungere sotto la linea anche al vostro file di info.plist
chiave: NSLocationWhenInUseUsageDescription
valore: usi posizione corrente
Le altre risposte sono corrette, ma ho anche dovuto reimpostare il simulatore ho potuto ottenere una posizione, mentre funzionava bene su un dispositivo. L'applicazione è stato inizialmente installato su quel simulatore prima iOS 8.
Per ripristinare il vostro simulatore:
Utilizzando Xcode 6.3.1 ho avuto la posizione di aggiornamento fermata selezione. La correzione era di eseguire un altro progetto, selezionare "Simula posizione> Non simulare posizione", quindi creare nuovamente il progetto originale per riprendere le normali impostazioni di posizione.
- (void)startLocationUpdates{
geocoder = [[CLGeocoder alloc] init];
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
[locationManager requestWhenInUseAuthorization];
[locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
CLLocation *currentLocation = newLocation;
if (currentLocation != nil) {
}
// Reverse Geocoding
[geocoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *placemarks, NSError *error) {
if (error == nil && [placemarks count] > 0) {
placemark = [placemarks lastObject];
fullAddress = [NSString stringWithFormat:@"%@,%@,%@,%@",
placemark.thoroughfare,
placemark.locality,
placemark.administrativeArea,
placemark.country];
subtitleLocation = [NSString stringWithFormat:@"PostalCode::%@",
placemark.postalCode];
} else {
// NSLog(@"%@", error.debugDescription);
}
} ];
}
- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error{
NSLog(@"Cannot find the location.");
}
Chiunque abbia problemi con questo, ho lottato per un po 'perché stavo usando '[locationManager requestWhenInUseAuthorization],' in app, ma aveva dichiarato il 'NSLocationAlwaysUsageDescription' nel file .plist (si noti la differenza di' sempre "e" quando è in uso. Questa soluzione funziona, ma assicurati di ** dichiarare il tipo di descrizione di utilizzo corretto **, "NSLocationWhenInUseUsageDescription" o "NSLocationAlwaysUsageDescription' (o forse entrambi) – 1owk3y