web-dev-qa-db-fra.com

Comment obtenir un utilisateur d'emplacement avec CLLocationManager en un tournemain?

J'ai ce code sur mon contrôleur de vue mais cela ne fonctionne pas: 

 import UIKit
 import CoreLocation
 class ViewController: UIViewController, CLLocationManagerDelegate {

  var location: CLLocationManager!

 override func viewDidLoad() {
    super.viewDidLoad()

    location=CLLocationManager()
    location.delegate = self
    location.desiredAccuracy=kCLLocationAccuracyBest
    location.startUpdatingLocation()
}

 func locationManager(location:CLLocationManager, didUpdateLocations locations:AnyObject[]) {
    println("locations = \(locations)")
    label1.text = "success"
}

J'ai les permisions comment je lis dans l'autre post. mais je n'obtiens jamais, pas d'impression ..

Merci!!

14
user3745888

d'abord ajouter ces deux lignes dans le fichier plist

1) NSLocationWhenInUseUsageDescription

2) NSLocationAlwaysUsageDescription

Ensuite, ceci est un travail de classe complet

import UIKit 
import CoreLocation

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {

var window: UIWindow?
var locationManager: CLLocationManager!
var seenError : Bool = false
var locationFixAchieved : Bool = false
var locationStatus : NSString = "Not Started"

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    initLocationManager();
    return true
}

// Location Manager helper stuff
func initLocationManager() {
    seenError = false
    locationFixAchieved = false
    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.locationServicesEnabled
    locationManager.desiredAccuracy = kCLLocationAccuracyBest

    locationManager.requestAlwaysAuthorization()
}

// Location Manager Delegate stuff

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)")
        }
}
}
19
jayesh kavathiya

Voici les étapes simples à suivre pour obtenir la localisation d’utilisateur dans Swift 3.

1) Ajoutez d'abord cette ligne dans le fichier plist avec la description

 NSLocationWhenInUseUsageDescription

2) Ajoutez CoreLocation.framework dans votre projet (sous la section Build Phases-> Link Binary With Library)

3) en classe AppDelegate

   import CoreLocation

4) Créer un objet locationManager comme suit

    var locationManager:CLLocationManager!

5) Écrire le code suivant dans didFinishLaunchingWithOptions

    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = 200
    locationManager.requestWhenInUseAuthorization()
    locationManager.startUpdatingLocation()

6) Confirmez le délégué CLLocationManagerDelegate comme suit

   class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate

7) Écrire la méthode déléguée CLLocationManagerDelegate pour obtenir l'emplacement de l'utilisateur

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {

    print("location error is = \(error.localizedDescription)")

}


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

    let locValue:CLLocationCoordinate2D = (manager.location?.coordinate)!


    print("Current Locations = \(locValue.latitude) \(locValue.longitude)")
}
5
Devendra Singh

Puisque vous déclarez que l'emplacement est explicitement facultatif (CLLocationManager!), Il nécessite un initialiseur, que ce soit dans une méthode init telle que suggérée par jhurray, ou simplement inline, sous la forme:

var location: CLLocationManager! = nil

Notez que vous avez également d'autres problèmes possibles, notamment le fait qu'iOS 8 impose de nouvelles exigences pour demander à l'utilisateur l'autorisation d'utiliser CoreLocation. Voir cette question pour plus d'informations.

2
David Berry

Il s'agit du même code que ci-dessus mais nettoyé pour fonctionner avec Swift à compter de la date de cette publication. Cela a fonctionné pour moi.

Bravo à l'affiche originale.

(notez-le dans la classe que vous utiliserez pour gérer votre matériel de localisation.)

var lastLocation = CLLocation()
var locationAuthorizationStatus:CLAuthorizationStatus!
var window: UIWindow?
var locationManager: CLLocationManager!
var seenError : Bool = false
var locationFixAchieved : Bool = false
var locationStatus : NSString = "Not Started"

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    
    
    self.initLocationManager()
    
}
    // Location Manager helper stuff
    func initLocationManager() {
        seenError = false
        locationFixAchieved = false
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        
        locationManager.requestAlwaysAuthorization()
    }
    
    // Location Manager Delegate stuff
    
    func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
        locationManager.stopUpdatingLocation()
        if ((error) != nil) {
            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)")
            }
    }

2

Il doit être écrit sous la forme Func locationManager (responsable: CLLocationManager, didUpdateLocations: [CLLocation]) {

0
MacInnis

Faites ce qui suit dans viewcontroller [Utiliser Swift] - 

  class ViewController:     
  UIViewController,MKMapViewDelegate,CLLocationManagerDelegate {


  var locationManager: CLLocationManager?
  var usersCurrentLocation:CLLocationCoordinate2D?

  override func viewDidLoad() {
    super.viewDidLoad()

    self.locationManager = CLLocationManager()

    if CLLocationManager.authorizationStatus() == .NotDetermined{
        locationManager?.requestAlwaysAuthorization()
    }

    locationManager?.desiredAccuracy = kCLLocationAccuracyBest
    locationManager?.distanceFilter = 200
    locationManager?.delegate = self
    startUpdatingLocation()

    usersCurrentLocation = CLLocationCoordinate2DMake(LATTITUDE, LONGITUDE)
    let span = MKCoordinateSpanMake(0.005, 0.005)
    let region = MKCoordinateRegionMake(usersCurrentLocation!, span)
    mapview.setRegion(region, animated: true)
    mapview.delegate = self
    mapview.showsUserLocation = true

}

// MARK: méthodes CLLocationManagerDelegate

func startUpdatingLocation() {
    self.locationManager?.startUpdatingLocation()
}

func stopUpdatingLocation() {
    self.locationManager?.stopUpdatingLocation()
}

// MARK: MKMapViewDelegate

func mapView(mapView: MKMapView, didUpdateUserLocation userLocation: MKUserLocation){
    mapview.centerCoordinate = userLocation.location!.coordinate
    mapview.showsUserLocation = true
    regionWithGeofencing()

}
0
be.with.veeresh

Vous devez avoir des fonctions init.

Remplacez init (codeur :) et init (nibName: bundle :) et ajoutez tout init personnalisé que vous souhaitez. 

Comme vous avez dit que l'emplacement n'est pas facultatif, vous devez l'initialiser avant que votre super init appelle dans TOUTES vos fonctions init. 

func init() {
...
location = CLLocationManager()
// either set delegate and other stuff here or in viewDidLoad
super.init(nibName:nil, bundle:nil)
// other initialization below

}
0
jhurray