2014-12-29 13 views
7

AGGIORNAMENTO: QUESTO NON È UN DUPLICATO. Ho già aggiunto la chiave richiesta a info.plist come indicato nella mia domanda originale e il problema rimane. Ho provato tutte e tre le chiavi in ​​varie combinazioni.Non viene richiesto di abilitare i servizi di localizzazione nell'app

Prima che qualcuno si arrabbi, ho letto molti post del forum Apple Dev e ho inserito post di overflow e non riesco a capire perché la mia app si rifiuta di chiedere all'utente di consentire l'autorizzazione When In Use.

ho aggiunto la seguente chiave al mio file Info.plist con un valore stringa di accompagnamento:

NSLocationWhenInUseUsageDescription 

Ho quindi scritto (sia in Swift e Obj-C), il codice che dovrebbe richiedere all'utente:

@property CLLocationManager *location; 
... 
@synthesize location; 
... 
location = [[CLLocationManager alloc] init]; 
location.delegate = self; 

location.desiredAccuracy = kCLLocationAccuracyBest; 
location.distanceFilter = kCLDistanceFilterNone; 

[location requestWhenInUseAuthorization]; 
[location startUpdatingLocation]; 


I'm using the following CLLocationManagerDelegate methods. 
- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
- (void) locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status 

Questo è stato sostanzialmente copiato direttamente dal codice di esempio "LocateMe" di Apple.

Indipendentemente dalle varie sequenze o modifiche secondarie che provo, l'app non richiede mai l'autorizzazione. Ho utilizzato un'istruzione switch per determinare lo stato di [CLLocationManager authorizationStatus], ma ricevo continuamente una risposta "Non determinata".

if ([CLLocationManager locationServicesEnabled]) { 
     switch ([CLLocationManager authorizationStatus]) { 
      case kCLAuthorizationStatusAuthorizedAlways: 
       NSLog(@"Always Authorized"); 
       break; 
      case kCLAuthorizationStatusDenied: 
       NSLog(@"Denied"); 
       break; 
      case kCLAuthorizationStatusAuthorizedWhenInUse: 
       NSLog(@"Authorized in Use"); 
       break; 
      case kCLAuthorizationStatusNotDetermined: 
       NSLog(@"Not Determined"); 
       break; 
      case kCLAuthorizationStatusRestricted: 
       NSLog(@"Restricted"); 
       break; 
     } 

    } 

Qualsiasi aiuto sarebbe molto apprezzato. Sto eseguendo Xcode 6.2 (6C101) con il dispositivo fisico iOS 8.1.2 e il simulatore iOS 8.2 (12D5452a) per il test.

+0

@ n00bProgrammer Non vedo l'opzione di ripristino disponibile nella scheda Impostazioni> Ripristina del simulatore. Inoltre, ho scritto due programmi, uno in Swift e uno in Obj-C ed entrambi fanno la stessa cosa. Ho anche provato con un dispositivo fisico e ho ottenuto gli stessi risultati. Non ho ancora provato a ripristinare l'hardware. – Andrew

risposta

1

sacco di confronti utili qui: http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

Inoltre, il tempo domanda stupida: si mescolano _location e self.location ma non mostri la tua proprietà/codice sintetizzato. Sei sicuro di operare sullo stesso oggetto?

+0

Ho modificato il codice per aggiungere @synthesize e modificare la proprietà per utilizzare semplicemente il valore 'location'. Anche. Ho letto questa pagina, ma per qualche motivo non aiuta il mio problema. 'NSLocationWhenInUseUsageDescription' è un valore String nel mio file Info.plist. – Andrew

+0

Ecco uno snip di un mio progetto attivo che richiede correttamente. Ad eccezione del test di compatibilità iOS7/8, fondamentalmente corrisponde al tuo. '_locationManager = [[Allocazione CLLocationManager] init]; _locationManager.delegate = self; if ([_locationManager rispondeToSelector: @selector (requestWhenInUseAuthorization)]) { [_locationManager requestWhenInUseAuthorization]; } [_locationManager startUpdatingLocation]; ' Huh. Modalità Guess: controlla Impostazioni> Privacy> Servizi di localizzazione. Ci sono già delle impostazioni per la tua app? –

+0

Nessuna impostazione mostrata e lo stato CLAuthorization è 'Non determinato' – Andrew

1

ho scoperto che nel file info.plst non è possibile utilizzare il privata - Posizione chiave Utilizzo Descrizione, è necessario disporre di una chiave denominata NSLocationWhenInUseUsageDescription e un valore. Sono stato in grado di ottenere il vostro codice di lavoro con l'aggiunta di questa chiave nella mia info.plist

enter image description here

#import <MapKit/MapKit.h> 

@interface ViewController() 

@property CLLocationManager * location; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _location = [[CLLocationManager alloc] init]; 

    self.location.delegate = self; 
    self.location.desiredAccuracy = kCLLocationAccuracyBest; 
    self.location.distanceFilter = kCLDistanceFilterNone; 

    [_location requestWhenInUseAuthorization]; 
    [self.location startUpdatingLocation]; 
} 
+0

Tuttavia sto testando su 8.1, non 8.2. –

+0

Ho provato questo utilizzando i tre diversi tasti disponibili in vari modi sperando di farlo funzionare - a un certo punto, uno dei miei progetti ha iniziato magicamente a funzionare, ma non posso replicare quelle modifiche a questo semplice progetto (chi è il solo scopo è questo test) per renderlo tempestivo. – Andrew

2

Ho affrontato lo stesso identico problema, dopo aver scavato per due giorni, si è scoperto che l'app non legge dal file info.plist che è incluso nel pacchetto nel riquadro del navigatore del progetto, perché è stato localizzato in un'altra internazionalizzazione lingua e di base viene utilizzato, il che significa in Finder ci saranno 3 file Info.plist:

1- sotto cartella Test

2- sotto cartella base.lproj

3- sotto ar .lprj (ar si riferisce alla lingua araba).

il progetto legge dalla versione di base.lproj che non è inclusa nel pacchetto nel riquadro del navigatore del progetto.

quello che ho fatto è che ho preso una copia di backup del file plist che voglio (numero 2 sopra), e rimosso la localizzazione sulle informazioni.file plist che si trova all'interno del navigatore di progetto e ha scelto di eliminare dal disco per eliminarlo completamente, quindi ho preso la copia di backup e inserito nella root del progetto in Finder e importarlo nuovamente in Xcode, e ora il progetto legge dal nuovo info.plist il file e la chiave NSLocationWhenInUseUsageDescription attiva l'avviso di autorizzazione dell'utente all'avvio dell'app.

spero che questo aiuti.

0

Può essere sciocco, ma ho appena trascorso quasi 2 ore in doppio e triplo controllando tutte le risposte che sono riuscito a trovare sui permessi di CLLocationManager.

Mi sono sentito stupido quando ho finalmente capito che avevo 2 file info.plist e stavo usando quello sbagliato!

È possibile controllare le impostazioni di costruzione del progetto - c'è un valore chiamato Info.plist File.

Voglio solo lasciarlo qui per i futuri lettori.

0

Se le impostazioni di posizione nel simulatore iPhone sono state modificate, il prompt potrebbe non essere visualizzato. Ad esempio, se hai già impostato le autorizzazioni di posizione tramite Consenti posizioni accedi al prompt di iOS e hai preso una decisione, questo è memorizzato nelle impostazioni di Privacy per il simulatore iPhone e quindi le chiamate successive a locationManager.requestAlwaysAuthorization() o locationManager.requestWhenInUseAuthorization() non visualizzeranno il prompt iOS perché hai già definito la tua privacy -> Impostazioni di posizione per la tua app.

Per annullare le impostazioni per un simulatore di iPhone: "iOS Simulator" -> "Reset Content and Settings..."

Inoltre ho fatto una generazione pulita in Xcode e uscire e riavviato il simulatore di iPhone ad un certo punto, potrei sbagliarmi su questa parte essere di alcun aiuto ...