it-swarm-eu.dev

Richiesta iOS 8WhenInUseAuthorization no Popup

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?

49
Marcus

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.

101
Groot

Prova a scrivere una NSLocationWhenInUseUsageDescription in Info.plist

19
Masatsugu Hosoi

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:

enter image description here

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:

enter image description here

E ottieni i seguenti risultati:

enter image description here

Le tre chiavi correlate 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 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.

10
serge-k

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!

3
smileBot

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:

requestWhenInUseAuthorization () non funziona in iOS 8 con NSLocationWhenInUseUsageDescription Key in Info.plist

1
Mark E

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.

0
HenryRootTwo