web-dev-qa-db-fra.com

Implémenter des méthodes CLLocationManagerDelegate dans Swift

Cela fait un moment que j'essaie de faire en sorte que cela fonctionne, et je suis venu ici pour demander comment j'utilise les méthodes CLLocationManagerDelegate dans Swift. J'ai mis ceci au sommet de ma classe:

var locationManager = CLLocationManager()

J'ai mis ce qui suit dans ma méthode viewDidLoad:

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

Et j'ai essayé d'utiliser ces méthodes de délégué sans succès:

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

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

J'ai également essayé d'utiliser @optional devant les fonctions, mais Xcode génère ensuite une erreur de compilation. Des idées?

25
user1327904

Vous devez ajouter la clé NSLocationAlwaysUsageDescription ou NSLocationWhenInUseUsageDescription à votre plist, si ce n'est déjà fait, elles sont maintenant obligatoires.


iOS8 + nécessite que l'une de ces deux chaînes soit définie pour utiliser des emplacements. Celui que vous utilisez dépend de la façon dont vous avez l'intention de demander l'emplacement.

  • Utilisez NSLocationAlwaysUsageDescription pour les applications qui souhaitent utiliser l'emplacement de l'appareil même si l'application n'est pas ouverte ni en cours d'utilisation. 

  • Utilisez NSLocationWhenInUseUsageDescription pour les applications qui souhaitent utiliser l'emplacement de l'appareil uniquement lorsque l'application est ouverte et en cours d'utilisation. 

Remarque: Lorsque vous ajoutez les chaînes, avant de générer et d'exécuter l'application, supprimez l'application de votre appareil et laissez-la effectuer une nouvelle installation. Il semble que si l’application était autorisée à utiliser des emplacements avant la mise à niveau vers iOS8, elle ne vous demandait plus votre permission et ne voyait pas que vous définissiez ces chaînes. Faire une suppression et une installation propre résout ce problème. 

La définition de l’une des chaînes ouvre une fenêtre sur l’installation/la première utilisation, dans les lignes suivantes: "Autoriser" ThisApp "à accéder à votre emplacement même lorsque vous n’utilisez pas l’application" 

Voici un Screenshot du fichier plist.

 enter image description here

57
DelightedD0D

Ajoutez d'abord ces deux lignes dans le fichier 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)")
        }
}
6
jayesh kavathiya

Pour obtenir l'emplacement actuel de l'utilisateur: -

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

Étape 2: In viewDidLoad instantiate the CLLocationManager class like,

// à utiliser en arrière-plan

self.locationManager.requestAlwaysAuthorization()

// For use in foreground

self.locationManager.requestWhenInUseAuthorization()

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

Étape 3: Maintenant implémentez les méthodes de délégué de CLLocationManager

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

    var locValue:CLLocationCoordinate2D = manager.location.coordinate

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

  }

Étape 4: N'oubliez pas d'ajouter NSLocationAlwaysUsageDescription dans Info.plist car dans iOS 8, il est obligatoire de l'ajouter. Cela demandera la permission d'utiliser l'emplacement de l'utilisateur.

4
Annu

J'ai eu le même problème. didUpdateLocations - ne fonctionnait pas. Exécutez votre application . Accédez à la page Paramètres -> Confidentialité -> Localisation et désactivez les services de localisation. didFailWithError intercepte l'erreur concernant les services de localisation absents. Puis allumez-le. Depuis ce moment, didUpdateLocations capturera des emplacements.

3
salty

C'est un peu un vieux fil de discussion, pourtant rien de ce qui précède n'a fonctionné pour moi sur Swift 2.2 xCode 7.3.1.

Le problème est que j'utilisais:

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

Et cela n'a jamais été appelé. Quand j'ai changé pour:

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

Tout a fonctionné. On dirait que le délégué n'est pas appelé lors de l'utilisation de [AnyObject]

0
Pedro Silva