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