2014-07-20 25 views
49

Ho provato a rendere pronto AppProject per iOS 8. Avevo letto un sacco diiOS 8 requestWhenInUseAuthorization no Popup

[_locationManager requestWhenInUseAuthorization]; 

e l'entrata in plist

NSLocationWhenInUseUsageDescription 

Così ho cambiato tutte le linee di codice necessarie.

Funziona bene, ma ora ho copiato di nuovo il mio progetto dalla mia base di iOS 7 per includere nuove funzionalità. Ma quando apporto le modifiche per la Privacy posizione iOS8, la finestra popup non viene più visualizzata.

Il mio codice ha funzionato fino a quando non ho copiato.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
     <key>NSLocationWhenInUseUsageDescription</key> 
     <string>tolle sache </string> 
     <key>CFBundleDevelopmentRegion</key> 
     <string>en</string> 
     <key>CFBundleExecutable</key> 
     <string>${EXECUTABLE_NAME}</string> 
     <key>CFBundleIdentifier</key> 
     <string>fapporite.${PRODUCT_NAME:rfc1034identifier}</string> 
     <key>CFBundleInfoDictionaryVersion</key> 
     <string>6.0</string> 
     <key>CFBundlePackageType</key> 
     <string>BNDL</string> 
     <key>CFBundleShortVersionString</key> 
     <string>1.0</string> 
     <key>CFBundleSignature</key> 
     <string>????</string> 
     <key>CFBundleVersion</key> 
     <string>1</string> 
    </dict> 
</plist> 

e qui è la mia chiamata

- (instancetype)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self) { 

     _UserLocation = [[CLLocation alloc]init]; 
     _locationManager = [[CLLocationManager alloc]init]; // initializing locationManager 
     _locationManager.delegate = self; 
     _locationManager.desiredAccuracy = kCLLocationAccuracyBest; // setting the accuracy 
     [_locationManager requestWhenInUseAuthorization]; // iOS 8 MUST 
     [_locationManager startUpdatingLocation]; //requesting location updates 

     NSLog(@"passed initwithcode"); 

    } 
    return self; 
} 

Come posso risolvere questo problema?

risposta

18

provare a scrivere un NSLocationWhenInUseUsageDescription in Info.plist

+32

Questo era il problema principale per me. Dopo aver aggiunto la descrizione, la finestra di dialogo continuava a spuntare e quindi scompariva immediatamente. Correzione che richiedeva due modifiche: assicurati di richiedere l'autorizzazione in viewWillAppear: o successiva e assicurati di memorizzare un riferimento a CLLocationManager. In caso contrario, verrà deallocato e la finestra di dialogo scompare. – robotspacer

+1

Può anche aggiungerlo in viewDidLoad :, ma è importante mantenere un riferimento a CLLocationManager. – OutOnAWeekend

+0

Quindi (solo per completezza), per mantenere un riferimento, ho usato una proprietà con un forte modificatore: '@property (strong, nonatomic) CLLocationManager * locationManager;' –

101

Dalla documentazione

NSLocationWhenInUseUsageDescription (String - iOS) descrive la motivo per cui l'applicazione accede posizione dell'utente normalmente durante l'esecuzione in primo piano. Includi questa chiave quando la tua app utilizza i servizi di posizione per monitorare direttamente la posizione corrente dell'utente. Questo tasto non supporta utilizzando i servizi di localizzazione per monitorare le regioni o monitorare la posizione dell'utente utilizzando il servizio di modifica della posizione significativo. Il sistema include il valore di questa chiave nel pannello di avviso visualizzato a l'utente quando richiede il permesso di utilizzare i servizi di localizzazione.

Questa chiave è necessaria quando si utilizza il metodo requestWhenInUseAuthorization della classe CLLocationManager per richiedere l'autorizzazione per i servizi di posizione . Se la chiave non è presente quando si chiama il metodo requestWhenInUseAuthorization senza includere questa chiave, il sistema ignora la richiesta.

Questa chiave è supportata in iOS 8.0 e versioni successive. Se il file Info.plist include sia questa chiave che la chiave NSLocationUsageDescription, il sistema utilizza questa chiave e ignora la chiave NSLocationUsageDescription.

Leggi di più here.

Trovo che il modo più semplice per aggiungere questa chiave al tuo info.plist è fare clic con il tasto destro del mouse su informazioni.plist e scegli

Aprire As-> Codice Sorgente

e quindi aggiungere il seguente alla fine prima</dict></plist>

<key>NSLocationWhenInUseUsageDescription</key> 
<string></string> 

Se volete potete aggiungere un testo in mezzo <string></string> che descrive all'utente perché si desidera utilizzare la sua posizione. Questo testo verrà visualizzato sotto il testo predefinito nell'avviso.

+0

Soluzione perfetta per iOS 8! – coolcool1994

+0

L'aggiunta della chiave a Info.plist ha fatto il trucco, grazie! – Kennysmoothx

+1

@Groot signore non riesco ancora ad aprire l'avviso per la posizione di abilitazione –

10

iOS 8.3, Xcode 6.3.1, ARC abilitato

La questione è stata risolta, ma ho (2) note da aggiungere dal mio recente coinvolgimento con CLLocationManager.

1) È necessario avere le seguenti chiavi inserite nel vostro file * .plist:

enter image description here

Più comunemente chiavi utilizzate sono generici nomi più descrittivi, come "Vita privata - Posizione Utilizzo Descrizione", che è davvero la chiave "NSLocationUsageDescription".

Per vedere i nomi dei tasti "grezzi" andare a "* -Info.plist" e fare clic destro nell'area Navigator in cui sono elencati i tasti, vedere sotto:

enter image description here

e si ottiene la seguenti risultati:

enter image description here

Le tre chiavi che sono legati a questo articolo sono:

enter image description here

2) Assicurarsi di allocare e inizializzare l'implementazione di CLLocationManager prima di provare a richiedere l'autorizzazione o aggiornare il percorso.

* file h:

@interface SomeController : UIViewController <CLLocationManagerDelegate> 

@property (strong, nonatomic) CLLocationManager *locationManager; 

file * .m:

- (IBAction)locationButton:(UIButton *)sender 
{ 
    if (self.locationManager == nil) 
    { 
     self.locationManager = [[CLLocationManager alloc] init]; 
     self.locationManager.delegate = self; 
    } 
    else 
    { 
     nil; 
    } 

    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) 
    { 
     [self.locationManager requestWhenInUseAuthorization]; 
    } 
    else 
    { 
     nil; 
    } 

    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [self.locationManager startUpdatingLocation]; 
} 

Spero che questo consente di risparmiare tempo qualcuno! Grazie.

+0

Si prega di lasciare il bianco ... altrimenti le dichiarazioni in, questo è il mio stile di programmazione, sia giusto che sbagliato mi aiuta a mantenere le cose organizzate nella mia mente. Grazie. –

0

pertinenza della Guardia di Apple:

È necessario inserire la chiave requestWhenInUseAuthorization nell'iPhone Info.plist, non nell'app WatchKit.

Questo mi ha morso due volte.

3

Ecco un piccolo trucchetto. Assicurati di aggiungere le chiavi NSLocationAlwaysUsageDescription o NSLocationWhenInUseUsageDescription al pacchetto principale plist e non uno dei tuoi elenchi di destinazione del test!