Domanda

Ho cercato di far funzionare questo per un po 'ora, e sono venuto qui per chiedere: come faccio a fare con l'utilizzo dei metodi CLLLocationManagerDelegate in Swift?L'ho messo in cima alla mia classe:

var locationManager = CLLocationManager()
.

Ho messo il seguente nel mio metodo viewDidLoad:

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

E ho provato a utilizzare questi metodi delegati senza risultato:

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

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

Ho anche provato a utilizzare @optional davanti alle funzioni, ma Xcode lancia quindi un errore del compilatore.Qualche idea?

È stato utile?

Soluzione

È necessario aggiungere la chiave NSLocationAlwaysUsageDescription o NSLocationWhenInUseUsageDescriptionTagCode al tuo Plist Se non lo hai già fatto, ora sono obbligatori,


.

iOS8 + richiede una di queste due stringhe da impostare per utilizzare le posizioni. Quale si utilizza dipende da come hai intenzione di chiedere la posizione.

    .
  • Utilizzare NSLocationAlwaysUsageDescription per app che desiderano utilizzare la posizione del dispositivo anche quando l'app non è aperta e utilizzata.

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

Nota: Quando si aggiungono le stringhe, prima di costruire ed eseguire, eliminare l'app dal dispositivo e lasciare che faccia una nuova installazione. Sembra che se l'app sia stata autorizzata a utilizzare le posizioni prima di essere aggiornato a IOS8 non chiede di nuovo il tuo permesso e non vede che tu possa impostare quelle stringhe. Fare un cancellazione e pulire l'installazione risolve questo.

Impostazione di una delle stringhe richiede un pop-up in installazione / primo utilizzo lungo le linee di: "Consenti" ThisApp "di accedere alla posizione anche quando non si utilizza l'app"

Ecco una schermata del file Plist .

 Inserisci la descrizione dell'immagine qui

Altri suggerimenti

Prima aggiungi questa riga in file Plist

1) Nslocationwheninuseusagescription

2) Nslocationalwaysusagescription

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)")
        }
}
.

Per ottenere la posizione corrente dell'utente: -

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

Step 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()
}
.

Step 3: Ora implementa i metodi delegati di CLLocationManager

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

    var locValue:CLLocationCoordinate2D = manager.location.coordinate

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

  }
.

Step 4: Non dimenticare di aggiungere NSLocationAlwaysUsageDescription in info.plist come in iOS 8 è obbligatorio aggiungere questo.Questo chiederà il permesso di utilizzare la posizione dell'utente.

Ho avuto lo stesso problema.DiduPdatelocazioni - non funzionava.Esegui la tua app. Vai alla pagina Impostazioni -> Privacy -> Posizione e disattivare i servizi di localizzazione.Didfailwitheirror catturerà l'errore sui servizi di localizzazione assenti.Quindi accendilo.Dal momento che quel momento had-updatelocazioni cattureranno luoghi.

Questo è un po 'di un vecchio filo, eppure nessuno dei precedenti ha funzionato per me su Swift 2.2 Xcode 7.3.1.

Il problema è che stavo usando:

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

E questo non è mai stato chiamato.Quando sono cambiato in:

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

Tutto è stato risolto.Sembra che il delegato non venga chiamato quando si utilizza [AnyObject]

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top