2014-10-01 18 views
7

il mio problema non è ottenere la latitudine e la longitudine di posizione corrente in iOS 8. Ho provato a impostare la chiave nel file .plist per iOS 8, ma non chiamare questo metodo- didUpdateToLocation: per favore aiutatelo su questo problema.come ottenere la posizione attuale lat lungo in ios 8?

il mio codice è: -

- (void)viewDidLoad 

{

[super viewDidLoad]; 
self.locationManager = [[CLLocationManager alloc] init]; 
self.locationManager.delegate = self; 

if(IS_OS_8_OR_LATER) { 
    //[self.locationManager requestWhenInUseAuthorization]; 
    [self.locationManager requestWhenInUseAuthorization]; 
    [self.locationManager startUpdatingLocation]; 
} 

}

+0

Did iOS che chiede l'autorizzazione posizione? E se provi nel simulatore, hai impostato un luogo di prova? – fluidsonic

+0

FYI - non controllare la versione di iOS. Verifica l'esistenza del metodo desiderato. – rmaddy

+0

sì ho testare il simulatore e impostare questa chiave nel file .plist NSLocationWhenInUseUsageDescription e NSLocationAlwaysUsageDescription –

risposta

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

self.locationManager.delegate = self; 
if(IS_OS_8_OR_LATER){ 
    NSUInteger code = [CLLocationManager authorizationStatus]; 
    if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) { 
     // choose one request according to your business. 
     if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){ 
      [self.locationManager requestAlwaysAuthorization]; 
     } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) { 
      [self.locationManager requestWhenInUseAuthorization]; 
     } else { 
      NSLog(@"Info.plist does not contain NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription"); 
     } 
    } 
} 
[self.locationManager startUpdatingLocation]; 
} 

#pragma mark - CLLocationManagerDelegate 
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{ 
    NSLog(@"didFailWithError: %@", error); 
    UIAlertView *errorAlert = [[UIAlertView alloc] 
           initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [errorAlert show]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    NSLog(@"didUpdateToLocation: %@", newLocation); 
    CLLocation *currentLocation = newLocation; 

    if (currentLocation != nil) { 
     longitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude]; 
     latitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude]; 
    } 
} 

in iOS 8 è necessario fare due cose in più per ottenere la posizione di lavoro: Aggiungi una chiave per il tuo Info.plist e richiesta di autorizzazione per m il responsabile della posizione che gli chiede di iniziare. Esistono due chiavi Info.plist per la nuova autorizzazione di posizione . È necessaria una o entrambe queste chiavi. Se non ci sono chiavi, puoi chiamare startUpdatingLocation ma il gestore della posizione non verrà avviato. Non invierà nemmeno un messaggio di errore al delegato (poiché non è mai stato avviato, non può riuscire ). Fallirà anche se si aggiungono una o entrambe le chiavi, ma si dimentica di di richiedere esplicitamente l'autorizzazione. Quindi la prima cosa che devi fare è quello di aggiungere una o entrambe le seguenti chiavi nel file Info.plist:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

Entrambe queste chiavi prendono una stringa

che è una descrizione del motivo per cui sono necessari servizi di localizzazione. Puoi inserire una stringa come "La posizione è necessaria per sapere dove sei" che, come in iOS 7, può essere localizzata nel file InfoPlist.strings.

enter image description here

+0

Grazie .. il suo lavoro perfettamente .. –

+0

siete i benvenuti :) –

+1

Non usare 'IS_OS_8_OR_LATER'. Esistono metodi adeguati per verificare se un'API è disponibile o meno. – rmaddy

Problemi correlati