2010-08-04 10 views
8

I servizi di localizzazione sono disabilitati per la mia applicazione nel pannello delle impostazioni. Corro un test in viewDidLoad a mio controller di vista per vedere se sono abilitati:locationServicesEnabled passa il test quando sono disabilitati in viewDidLoad

if([CLLocationManager locationServicesEnabled]) { 
    //Do something now 
} 

Questo test passa sempre per qualche motivo. Se provo ad accedere ai servizi di localizzazione, ottengo un errore kCLErrorDenied per il responsabile della posizione. Cosa dà?

Sto usando il test sbagliato?

risposta

25

locationServicesEnabled Il metodo di classe verifica solo le impostazioni globali per i servizi di localizzazione. AFAIK, non c'è modo di testare se la tua app è stata esplicitamente negata. Dovrai attendere il fallimento della richiesta di posizione e utilizzare il metodo CLLocationManagerDelegate locationManager: didFailWithError: per fare tutto ciò che ti serve. Es .:

- (void)locationManager: (CLLocationManager *)manager 
     didFailWithError: (NSError *)error { 

    NSString *errorString; 
    [manager stopUpdatingLocation]; 
    NSLog(@"Error: %@",[error localizedDescription]); 
    switch([error code]) { 
     case kCLErrorDenied: 
      //Access denied by user 
      errorString = @"Access to Location Services denied by user"; 
      //Do something... 
      break; 
     case kCLErrorLocationUnknown: 
      //Probably temporary... 
      errorString = @"Location data unavailable"; 
      //Do something else... 
      break; 
     default: 
      errorString = @"An unknown error has occurred"; 
      break; 
     } 
    } 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:errorString delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
    [alert show]; 
    [alert release]; 
} 

Vedi la documentazione sui costanti CLError nel CLLocationManager class reference per ulteriori opzioni.

+0

Questo ha senso quindi perché restituisce sempre vero. Grazie! – Adam

+0

@ Dan, se locationServicesEnabled è false, quindi ho aspettato molto tempo, ma il metodo delegate (locationManager: didFailWithError :) non viene chiamato. qual è il motivo?? – Apple

20

iOS 4.2 ora consente di determinare se i servizi di localizzazione sono stati negati tramite il metodo CLLocationManager +authorizationStatus.

Problemi correlati