2014-07-10 5 views
16

Sto lavorando su un pezzo di codice Swift per iOS 8. sto cercando di fare qualcosa che coinvolge la posizione, e così ho implementato il seguente nella mia rapida file di vista del regolatore:CLLocationManager iOS 8

let locationManger:CLLocationManager = CLLocationManager()

var speedReceived:Double = 0 

override func viewDidLoad() { 
    super.viewDidLoad() 
    locationManger.delegate = self 
    locationManger.desiredAccuracy = kCLLocationAccuracyBest 
    let authstate = CLLocationManager.authorizationStatus() 
    if(authstate == CLAuthorizationStatus.NotDetermined){ 
     println("Not Authorised") 
     locationManger.requestWhenInUseAuthorization() 
    } 
    // Do any additional setup after loading the view, typically from a nib. 
} 

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!){ 
    var location:CLLocation = locations[locations.count - 1] as CLLocation 
    if(location.horizontalAccuracy > 0){ 
     self.speedReceived = location.speed 
     println(self.speedReceived) 
    } 
} 

func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { 
    println("Couldn't get your location") 
} 

Tuttavia, non riesco a ottenere questo codice funzioni. Non salva la mia preferenza per l'uso della posizione. non mi chiede nemmeno di dare il permesso di accedere alla posizione. Ho provato ad aggiornare il mio info.plist. Ma non sta funzionando. A proposito, se seleziono sempre le impostazioni sulla privacy all'interno del simulatore, funziona se ritorna immediatamente all'app. qualcuno può aiutare? Sono sicuro che questo è il problema perché ottengo Non autorizzato sulla mia console.

Qualsiasi aiuto?

+0

dici che avete aggiornato il vostro info.plist - avete controllato due volte la voce? "NSLocationWhenInUseUsageDescription" deve essere presente con una stringa che descrive l'utilizzo della posizione. Un semplice errore di battitura impedirà alla tua app di richiedere l'accesso alla posizione. Inoltre dovresti sempre chiamare 'locationManager.requestWhenInUseAuthorization()', non solo quando il tuo stato non è autorizzato – Paulw11

risposta

28

Si tratta di un problema relativo a iOS 8. Devi inserire le chiavi NSLocationAlwaysUsageDescription o NSLocationWhenInUseUsageDescription nel tuo file .plist (il valore potrebbe essere un messaggio aggiuntivo che verrà presentato nell'avviso di posizione). Questi tasti sono richieste in iOS 8.

Come si dice in Apple guidelines:

Questo tasto è necessaria quando si utilizza il metodo requestAlwaysAuthorization della classe CLLocationManager di richiedere l'autorizzazione per i servizi di localizzazione . Se questa chiave non è presente e chiami il metodo requestAlwaysAuthorization, il sistema ignora la tua richiesta e impedisce all'app di utilizzare i servizi di localizzazione.

7

Ho avuto difficoltà con un problema simile, che persisteva anche dopo l'aggiunta delle chiavi NSLocationAlwaysUsageDescription/NSLocationWhenInUseUsageDescription al plist.

Alla fine, ho aggiunto il tasto "Privacy - Descrizione dell'ubicazione della posizione" al plist (oltre alle nuove chiavi) e voilà, ha funzionato! Dopo aver funzionato, sono stato in grado di rimuovere la chiave "Privacy - Descrizione dell'ubicazione della posizione" dal plist e continuare a richiedere l'autorizzazione.

4

iOS 8 ha modificato la strategia di autorizzazione della posizione. Soluzione con retrocompatibilità:

SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization"); 
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined && 
    [self.locationManager respondsToSelector:requestSelector]) { 
    [self.locationManager performSelector:requestSelector withObject:NULL]; 
} else { 
    [self.locationManager startUpdatingLocation]; 
} 

Promemoria: messa a punto chiave NSLocationWhenInUseUsageDescription in Info.plist

2

Ho avuto lo stesso problema esatto.

Per la cronaca, questa non è la risposta ufficiale. La prima risposta è quella corretta. Volevo solo aggiungere un collegamento a un progetto FOSS (Objective-C) che illustra la correzione.

Come notato, ho dovuto aggiungere la chiave. La mia app non ha bisogno di essere eseguita in background, quindi ho aggiunto la chiave NSLocationWhenInUseUsageDescription al mio info.plist.

Se si aggiunge una stringa come valore per questa chiave (opzionale - l'esistenza della chiave è sufficiente per impostare la barra), tale stringa verrà visualizzata nel popup di autorizzazione.

Ho poi aggiunto il seguente codice prima del mio [CLLocationManager startUpdating] chiama tutti:

if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) 
{ 
    [locationManager requestWhenInUseAuthorization]; 
} 

Il respondsToSelector è importante, come la chiamata è disponibile solo in iOS 8.

La prima volta che questo è chiamato, viene visualizzato l'avviso. Dopo di ciò, cade attraverso.

Nota che io chiamo requestWhenInUseAuthorization

Deve corrispondere al valore ho messo nel plist. Immagino che potresti metterli entrambi, ma non lo so. Non ho bisogno di

Il progetto è here. La maggior parte del lavoro (non molto) è nel file BMLTAppDelegate.m.

Questa è una brutta sorpresa. Molte persone non hanno idea che le loro app smetteranno di funzionare in iOS 8. Faranno la stessa cosa che ho fatto inizialmente: esegui una rapida esecuzione nel simulatore, osserva il blocco e digita fino a un baco beta.

Ora, ho un altro problema: tutte le mie app sono fisse, ma Xcode si blocca quando provo a caricare le app su App Store. Ho un RADAR aperto su di esso.

Xcode 6 è un po 'cigolante. Mi aspetto che una patch venga fuori abbastanza rapidamente.

1

Per Swift 2 ho sostituito il controllo respondsToSelector() con un controllo versione iOS. Non come elegante, ma è necessario per Xcode 7 per dare 0 errori, 0 avvertimenti

if #available(iOS 8.0, *) { 
    locationManager.requestWhenInUseAuthorization() 
} else { 
    locationManager.startUpdatingLocation() 
} 
2

Dal momento che non mi piace di modificare direttamente il plist, ho sempre concedo autorisation utilizzando l'interfaccia utente.

enter image description here

I testi in lingua olandese "Toegang è nodig" e "Toegang è noodzakelijk" vengono visualizzati nella PopUp in cui l'accesso utilizzato sovvenzioni. Puoi cambiarli in qualsiasi testo che ti piace.

Basta aggiungere alla sorgente plist,

<key>NSLocationAlwaysUsageDescription</key> 
<string>To get location</string> 
<key>NSLocationWhenInUseUsageDescription</key> 
<string>To get location</string>