Ho provato a preparare il mio AppProject iOS 8. Ne avevo letto molto
[_locationManager requestWhenInUseAuthorization];
e la voce in plist
NSLocationWhenInUseUsageDescription
Quindi ho modificato tutte le righe 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 della posizione di iOS8, il popup non appare più.
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>
ed ecco 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?
Dalla documentazione
NSLocationWhenInUseUsageDescription (String - iOS) descrive il motivo per cui l'app accede normalmente alla posizione dell'utente mentre è in esecuzione in primo piano. Includi questa chiave quando la tua app utilizza i servizi di localizzazione per tracciare direttamente la posizione corrente dell'utente. Questa chiave non supporta l'utilizzo dei servizi di localizzazione per monitorare le regioni o monitorare la posizione dell'utente utilizzando il servizio di modifica della posizione significativa. Il sistema include il valore di questa chiave nel pannello di avviso visualizzato all'utente quando si richiede l'autorizzazione per utilizzare i servizi di localizzazione.
Questa chiave è richiesta quando si utilizza il metodo requestWhenInUseAuthorization della classe CLLocationManager per richiedere l'autorizzazione per i servizi di localizzazione. 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 sia la chiave NSLocationUsageDescription, il sistema utilizza questa chiave e ignora la chiave NSLocationUsageDescription.
Leggi a riguardo qui .
Trovo che il modo più semplice per aggiungere questa chiave al tuo info.plist sia quello di fare clic con il tasto destro del mouse su info.plist e scegliere
Apri come-> Codice sorgente
e poi aggiungi quanto segue alla fine prima </dict></plist>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
Se lo desideri, puoi aggiungere un testo tra <string></string>
che descrive all'utente il motivo per cui desideri utilizzare la sua posizione. Questo testo verrà visualizzato sotto il testo predefinito nell'avviso.
Prova a scrivere una NSLocationWhenInUseUsageDescription in Info.plist
iOS 8.3, Xcode 6.3.1, ARC abilitato
La domanda è stata risolta, ma ho (2) note da aggiungere dal mio recente coinvolgimento con CLLocationManager.
1) È necessario inserire le seguenti chiavi nel file * .plist:
Le chiavi più comunemente utilizzate hanno nomi generici più descrittivi, come "Privacy - Descrizione dell'uso della posizione", che in realtà è la chiave "NSLocationUsageDescription".
Per vedere i nomi "grezzi" delle chiavi, vai su "* -Info.plist" e fai clic con il pulsante destro del mouse nell'area del Navigatore in cui sono elencate le chiavi, vedi sotto:
E ottieni i seguenti risultati:
Le tre chiavi correlate a questo articolo sono:
2) Assicurarsi di allocare e inizializzare l'implementazione di CLLocationManager prima di provare a richiedere l'autorizzazione o aggiornare la posizione.
* .h file:
@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 risparmi tempo a qualcuno! Grazie.
Ecco un po 'di gotcha. Assicurati di aggiungere le chiavi NSLocationAlwaysUsageDescription o NSLocationWhenInUseUsageDescription al plist principale del bundle e non uno dei tuoi target di test!
Lo stesso problema era causato dal fatto che stavo istanziando CLLocationManager
in una var locale all'interno di un metodo, risolto trasformando CLLocationManager
in una proprietà di classe.
Dopo un po 'ho trovato la soluzione qui, ma la lascio qui poiché questo è il primo risultato in Google, spero di farti risparmiare un po' di tempo:
Appartenente a Apple Watch:
Devi inserire la chiave requestWhenInUseAuthorization
nel Info.plist
Dell'iPhone, non nell'app WatchKit.
Questo mi ha morso due volte ora.