CoreLocation

Bonsoir à  tous,


 


J'ai voulu tester un code qui utilise CoreLocation et qui doit me donner ma position actuelle mais cela ne fonctionne pas aussi bien sur le simulateur que sur mon iPhone !


j'ai bien activé le service de localisation sur l'iPhone


pour le simulateur simulate location a bien été paramétré dans Debug!


j'ai aussi rajouté les lignes suivantes dans le fichier info.plist comme il est indiqué 



<key>NSLocationAlwaysUsageDescription</key>
<string>Will you allow this app to always know your location?</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Do you allow this app to know your current location?</string>


 



 


voici le code :


 


http://swiftdeveloperblog.com/code-examples/determine-users-current-location-example-in-swift/


 


Merci de votre aide


Réponses

  • Bonsoir,


     


    J'avais essayé de tester CoreLocation il y a quelques temps, et je crois me souvenir que çà  ne fonctionnait pas sur le simulateur. Le mieux est tout de même de tester sur le device.


  • CéroceCéroce Membre, Modérateur
    octobre 2016 modifié #3
    Je ne sais pas pour les nouvelles versions, mais je peux t'assurer qu'autrefois ça fonctionnait. À noter que le choix de la position courante se fait à  deux endroits:
    - dans Xcode au niveau des commandes de débug (à  côté des boutons pour activer les points d'arrêt, etc.)
    - dans le simulateur. Je crois me rappeler que c'est le simu qui a priorité.
    Il ne faut pas s'attendre à  ce que ça te donne la position du Mac par défaut. D'ailleurs, c'est bien pratique, puisque ça permet de s'assurer que ça fonctionne ailleurs que chez soi.

    Par ailleurs, ajoute les méthodes déléguées de CLLocationManager pour recevoir les erreurs.
  • en fait je viens de m'apercevoir que viewWillAppear n'était pas appelé, erreur de ma part !


    j'avais 



    func viewWillAppear(_ animated: Bool) { 

    au lieu de 



    override func viewWillAppear(_ animated: Bool) { 

    Merci à  tous


  • Je ne sais pas pour les nouvelles versions, mais je peux t'assurer qu'autrefois ça fonctionnait. À noter que le choix de la position courante se fait à  deux endroits:


    On peut aussi utiliser un fichier .gpx pour simuler un parcours.
  • Bonsoir,


    Je remonte le sujet car j'ai un souci, j'ai isolé dans une classe Place la localisation d'un lieu, voici la classe :



    import UIKit
    import Foundation
    import CoreLocation
    import CoreData

    class Place : NSObject, CLLocationManagerDelegate {


    var locationManager: CLLocationManager?
    var lastLocation: CLLocation?
    var delegate: LocationServiceDelegate?


    var currentStreet = String()
    var currentLocality = String()
    var currentCP = String()
    var currentStreetNumber = String()

    override init() {
    super.init()

    self.locationManager = CLLocationManager()
    guard let locationManager = self.locationManager else {
    return
    }

    if CLLocationManager.authorizationStatus() == .notDetermined {
    locationManager.requestAlwaysAuthorization()
    }

    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = 200
    locationManager.delegate = self
    }

    func startUpdatingLocation() {
    print("Starting Location Updates")
    self.locationManager?.startUpdatingLocation()
    }

    func stopUpdatingLocation() {
    print("Stop Location Updates")
    self.locationManager?.stopUpdatingLocation()
    }

    private func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    print("fonction didUpdateLocations...")
    guard let location = locations.last else {
    return
    }

    self.lastLocation = location
    print(self.lastLocation)

    }


    func displayLocationInfo(placemark: CLPlacemark) {


    if placemark.locality != nil {

    currentLocality = placemark.locality!

    }

    if placemark.postalCode != nil {

    currentCP = placemark.postalCode!

    }

    if placemark.subThoroughfare != nil {

    currentStreetNumber = placemark.subThoroughfare!

    }
    if placemark.thoroughfare != nil {

    currentStreet = placemark.thoroughfare!

    }

    }

    func retourLocation()->(locality:String, CP:String, street:String) {

    return(currentLocality,currentCP,currentStreet)
    }

    func getContext () -> NSManagedObjectContext {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    return appDelegate.persistentContainer.viewContext
    }

    func storePlace (locality: String, street: String, postal: String) {
    let context = getContext()

    //retrieve the entity that we just created
    let entity = NSEntityDescription.entity(forEntityName: "Place", in: context)

    let placeToStore = NSManagedObject(entity: entity!, insertInto: context)
    print(locality)
    //set the entity values
    placeToStore.setValue(locality, forKey: "locality")
    placeToStore.setValue(street, forKey: "street")
    placeToStore.setValue(postal, forKey: "postal")
    placeToStore.setValue(Date(), forKey: "timeStamp")

    // print(Date())

    //save the object
    do {
    try context.save()
    print("saved!")
    } catch let error as NSError {
    print("Could not save \(error), \(error.userInfo)")
    } catch {

    }
    }



    }

    Le problème est que ça ne fonctionne pas, la fonction didUpdateLocations n'est jamais appelée,


    vous auriez une idée ?


    Merci.


  • startUpdatingLocation() est bien appelée ?


  • Oui la fonction startUpdatingLocation() est bien appelée

  • heliohelio Membre
    octobre 2016 modifié #9
    J'ai trouvé la réponse à  mon problème par l'intermédiaire du lien suivant :
    http://stackoverflow.com/questions/27583011/location-class-using-cllocationmanager-in-swift

    La solution est de déclarer place dans AppDelegate, ensuite je l'utilise comme ceci :
    let delegate = UIApplication.shared.delegate as! AppDelegatedelegate.place.startUpdating()

    ça fonctionne maintenant, cependant j'ai lu que ce n'était pas génial d'utiliser let delegate = UIApplication.shared.delegate as! AppDelegate.

    Quelle est la meilleure façon de faire selon vous ?

    Merci.
Connectez-vous ou Inscrivez-vous pour répondre.