2014-06-05 7 views
25

Ho cercato di farlo funzionare per un po 'ora, e sono venuto qui a chiedere- come faccio a utilizzare i metodi CLLocationManagerDelegate in Swift? Ho messo questo in cima alla mia classe:Implementare i metodi CLLocationManagerDelegate in Swift

var locationManager = CLLocationManager() 

ho messo il seguente nel mio viewDidLoad metodo:

locationManager.delegate = self 
locationManager.distanceFilter = kCLDistanceFilterNone 
locationManager.desiredAccuracy = kCLLocationAccuracyBest 
locationManager.startUpdatingLocation() 

E ho provato ad utilizzare questi metodi delegato senza alcun risultato:

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) { 
    locationReceived = true 
} 

func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { 
    locationReceived = false 
} 

ho anche provato ad utilizzare @optional davanti alle funzioni, ma Xcode poi getta un errore di compilazione. Qualche idea?

+0

Sembra che funzioni con il tuo codice, ottieni la finestra di dialogo che chiede se la tua app può utilizzare la tua posizione? – voidref

+0

@voidref Ora che lo menzioni, non sto ottenendo il dialogo. È un po 'strano ... Ho appena controllato le impostazioni e l'app ha anche il permesso di accedere alla posizione. –

risposta

57

è necessario aggiungere la chiave NSLocationAlwaysUsageDescription o NSLocationWhenInUseUsageDescription al plist se non l'hai già fatto, ora sono obbligatorie,


iOS 8 + richiede una di queste due stringhe da impostare per utilizzare posizioni. Quale usi dipende da come intendi chiedere la posizione.

  • Usa NSLocationAlwaysUsageDescription per le applicazioni che vogliono utilizzare la posizione del dispositivo anche quando l'applicazione non è aperta e in uso.

  • Utilizzare NSLocationWhenInUseUsageDescription per le app che desiderano utilizzare la posizione del dispositivo solo quando l'app è aperta e in uso.

Nota: quando si aggiungono le corde, prima di costruire ed eseguire, eliminare l'applicazione dal tuo dispositivo e lasciate fare una nuova installazione. Sembra che se l'app è stata autorizzata a utilizzare le posizioni prima di eseguire l'aggiornamento a iOS8, non chiede più la tua autorizzazione e non vede che hai impostato quelle stringhe. Fare un'eliminazione e un'installazione pulita risolve questo problema.

impostazione di entrambi delle stringhe istruzioni visualizzate un pop up su install/primo utilizzo lungo le linee di: "Consenti 'ThisApp' per accedere alla tua posizione anche quando non si sta utilizzando l'App"

Ecco un Schermata del file plist.

enter image description here

+0

[vuoi dire così] (http://imgur.com/5CA1tKK)? Questo non ha fatto apparire la finestra di dialogo. –

+1

No, a quanto pare iOS8 richiede che una di queste altre due stringhe sia impostata (vedere la mia modifica). Quello che usi dovrebbe essere basato sul modo in cui intendi chiedere la posizione da quello che ho capito, ma non ho trovato alcuna informazione più specifica. Nell'interesse di una completa rivelazione, non ho ancora ottenuto il mio funzionamento anche dopo aver aggiunto le stringhe come mostrato (il mio problema sembra essere altrove Sto cercando di far funzionare il mio senza in questo momento), volevo solo menzionare le stringhe da quando sono ora necessario. – DelightedD0D

+0

Inoltre, quando aggiungi le stringhe, prima di creare ed eseguire, elimina l'app dal dispositivo e fagli fare una nuova installazione. Sembra che se l'app è stata autorizzata a utilizzare le posizioni prima di eseguire l'aggiornamento a iOS8, non richiede ancora la tua autorizzazione e non vede che hai impostato quelle stringhe. Facendo una cancellazione e un'installazione pulita l'ho risolto per me, finalmente funzionante di nuovo! – DelightedD0D

3

Ho avuto lo stesso problema. didUpdateLocations - non funzionava. Esegui la tua app. Vai alla pagina Impostazioni -> Privacy -> Posizione e disattiva i servizi di localizzazione. didFailWithError rileverà l'errore relativo ai Location Services assenti. Quindi accenderlo. Da quel momento didUpdateLocations catturerà le posizioni.

+0

Sembra funzionare una volta, ma quando riavvio l'app da Xcode, torno a non ricevere aggiornamenti sulla posizione. – FiddleMeRagged

+1

Sì, lo so. Ma suppongo che sia il problema con XCode 6. Aspettiamo la beta 2 :) – salty

5

Prima aggiungi questa linea due in un file plist

1) NSLocationWhenInUseUsageDescription

2) NSLocationAlwaysUsageDescription

import CoreLocation 

class ViewController: UIViewController, CLLocationManagerDelegate 

var seenError : Bool = false 
var locationFixAchieved : Bool = false 
var locationStatus : NSString = "Not Started" 

var locationManager: CLLocationManager! 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

    func initLocationManager() { 
    seenError = false 
    locationFixAchieved = false 
    locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.locationServicesEnabled 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.requestAlwaysAuthorization() 
} 

    func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { 
    locationManager.stopUpdatingLocation() 
    if (error) { 
     if (seenError == false) { 
      seenError = true 
      print(error) 
     } 
    } 
} 

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) { 
    if (locationFixAchieved == false) { 
     locationFixAchieved = true 
     var locationArray = locations as NSArray 
     var locationObj = locationArray.lastObject as CLLocation 
     var coord = locationObj.coordinate 

     println(coord.latitude) 
     println(coord.longitude) 
    } 
} 

func locationManager(manager: CLLocationManager!, 
    didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
     var shouldIAllow = false 

     switch status { 
     case CLAuthorizationStatus.Restricted: 
      locationStatus = "Restricted Access to location" 
     case CLAuthorizationStatus.Denied: 
      locationStatus = "User denied access to location" 
     case CLAuthorizationStatus.NotDetermined: 
      locationStatus = "Status not determined" 
     default: 
      locationStatus = "Allowed to location Access" 
      shouldIAllow = true 
     } 
     NSNotificationCenter.defaultCenter().postNotificationName("LabelHasbeenUpdated", object: nil) 
     if (shouldIAllow == true) { 
      NSLog("Location to Allowed") 
      // Start location services 
      locationManager.startUpdatingLocation() 
     } else { 
      NSLog("Denied access: \(locationStatus)") 
     } 
} 
4

Per ottenere Utente Current Location: -

Fase 1:let locationManager = CLLocationManager() // make object of CLLocationManager class.

Fase 2:In viewDidLoad instantiate the CLLocationManager class like,

// Per l'uso in background

self.locationManager.requestAlwaysAuthorization() 

// For use in foreground 

self.locationManager.requestWhenInUseAuthorization() 

if (CLLocationManager.locationServicesEnabled()) 
{ 
locationManager.delegate = self 
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters 
locationManager.startUpdatingLocation() 
} 

Fase 3: ora implementare i metodi delegato di CLLocationManager

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { 

    var locValue:CLLocationCoordinate2D = manager.location.coordinate 

    println("locations = \(locValue.latitude) \(locValue.longitude)") 

    } 

Fase 4: Non dimenticare di aggiungere NSLocationAlwaysUsageDescription in Info.plist come in iOS 8 è obbligatorio aggiungerlo. Questo chiederà il permesso di usare la posizione dell'utente.

0

Questo è un po 'vecchio thread, ma nessuno dei precedenti ha funzionato per me su Swift 2.2 xCode 7.3.1.

Il problema è che stava usando:

func locationManager(manager: CLLocationManager!, didUpdateLocation locations: [AnyObject]!) { 
    print("Got location") 
    locationManager.stopUpdatingLocation() 
} 

E questo non è mai stato chiamato. Quando ho cambiato:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    print("Got location") 
    locationManager.stopUpdatingLocation() 
} 

Tutto ha funzionato. Sembra che il delegato non venga chiamato quando si utilizza [AnyObject]