Comment puis-je enregistrer l'emplacement actuel de l'utilisateur et l'afficher sur une carte?
Je suis capable d'afficher des coordonnées prédéfinies sur une carte, je ne sais tout simplement pas comment recevoir des informations de l'appareil.
De plus, je sais que je dois ajouter quelques éléments dans une pliste. Comment puis je faire ça?
Pour obtenir l'emplacement actuel d'un utilisateur, vous devez déclarer:
let locationManager = CLLocationManager()
Dans viewDidLoad()
, vous devez instancier la classe CLLocationManager
, comme suit:
// Ask for Authorisation from the User.
self.locationManager.requestAlwaysAuthorization()
// For use in foreground
self.locationManager.requestWhenInUseAuthorization()
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}
Ensuite, dans la méthode CLLocationManagerDelegate, vous pouvez obtenir les coordonnées de l'emplacement actuel de l'utilisateur:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
print("locations = \(locValue.latitude) \(locValue.longitude)")
}
Dans le fichier info.plist, vous devrez ajouter NSLocationAlwaysUsageDescription
Et votre message d’alerte personnalisé comme; AppName (application de démonstration) aimerait utiliser votre position actuelle.
vous devriez faire ces étapes:
CoreLocation.framework
à BuildPhases -> Lier binaire avec bibliothèques (n'est plus nécessaire à partir de XCode 7.2.1)CoreLocation
dans votre classe - probablement ViewController.SwiftCLLocationManagerDelegate
à votre déclaration de classeNSLocationWhenInUseUsageDescription
et NSLocationAlwaysUsageDescription
à la liste d'adressesgestionnaire de site init:
locationManager = CLLocationManager()
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
obtenir l'emplacement de l'utilisateur par:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let locValue:CLLocationCoordinate2D = manager.location!.coordinate
print("locations = \(locValue.latitude) \(locValue.longitude)")
}
Voici comment je suis
obtenir la position actuelle et s'afficher sur la carte dans Swift 2.0
Assurez-vous que vous avez ajouté le framework CoreLocation et MapKit à votre projet} (Cela n'est pas obligatoire avec XCode 7.2.1)
import Foundation
import CoreLocation
import MapKit
class DiscoverViewController : UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var map: MKMapView!
var locationManager: CLLocationManager!
override func viewDidLoad()
{
super.viewDidLoad()
if (CLLocationManager.locationServicesEnabled())
{
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
let location = locations.last! as CLLocation
let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
self.map.setRegion(region, animated: true)
}
}
Voici l'écran de résultat
NSLocationWhenInUseUsageDescription = Demander l'autorisation d'utiliser le service de localisation lorsque les applications sont en arrière-plan. dans votre fichier plist.
Si cela fonctionne, votez s'il vous plaît sur la réponse.
Première bibliothèque d'importation Corelocation et MapKit:
import MapKit
import CoreLocation
hériter de CLLocationManagerDelegate à notre classe
class ViewController: UIViewController, CLLocationManagerDelegate
créer une variable locationManager, ce seront vos données de localisation
var locationManager = CLLocationManager()
créer une fonction pour obtenir les informations de localisation, soyez précis cette syntaxe exacte fonctionne:
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
dans votre fonction créer une constante pour l'emplacement actuel des utilisateurs
let userLocation:CLLocation = locations[0] as CLLocation // note that locations is same as the one in the function declaration
arrêter la mise à jour de l'emplacement, cela empêche votre appareil de changer constamment de fenêtre pour centrer votre emplacement pendant le déplacement (vous pouvez l'omettre si vous souhaitez qu'il fonctionne autrement)
manager.stopUpdatingLocation()
obtenir les coordonnées des utilisateurs de userLocatin que vous avez défini
let coordinations = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude,longitude: userLocation.coordinate.longitude)
définissez le niveau de zoom souhaité pour votre carte:
let span = MKCoordinateSpanMake(0.2,0.2)
combinez ces deux pour obtenir la région:
let region = MKCoordinateRegion(center: coordinations, span: span)//this basically tells your map where to look and where from what distance
maintenant définir la région et choisissez si vous voulez y aller avec animation ou non
mapView.setRegion(region, animated: true)
fermez votre fonction }
à partir de votre bouton ou d’une autre manière, vous souhaitez définir le paramètre locationManagerDeleget
permet maintenant d'afficher l'emplacement
désigner la précision
locationManager.desiredAccuracy = kCLLocationAccuracyBest
autoriser:
locationManager.requestWhenInUseAuthorization()
pour pouvoir autoriser le service de localisation, vous devez ajouter ces deux lignes à votre plist
obtenir l'emplacement:
locationManager.startUpdatingLocation()
montrez-le à l'utilisateur:
mapView.showsUserLocation = true
Ceci est mon code complet:
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var mapView: MKMapView!
var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func locateMe(sender: UIBarButtonItem) {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
mapView.showsUserLocation = true
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocation:CLLocation = locations[0] as CLLocation
manager.stopUpdatingLocation()
let coordinations = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude,longitude: userLocation.coordinate.longitude)
let span = MKCoordinateSpanMake(0.2,0.2)
let region = MKCoordinateRegion(center: coordinations, span: span)
mapView.setRegion(region, animated: true)
}
}
Swift 3.0
Si vous ne souhaitez pas afficher l'emplacement de l'utilisateur sur la carte, mais que vous souhaitez simplement le stocker dans Firebase ou ailleurs, suivez ces étapes:
import MapKit
import CoreLocation
Maintenant, utilisez CLLocationManagerDelegate sur votre VC et vous devez remplacer les trois dernières méthodes présentées ci-dessous. Vous pouvez voir comment la méthode requestLocation () vous permet d'obtenir l'emplacement actuel de l'utilisateur à l'aide de ces méthodes.
class MyVc: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
isAuthorizedtoGetUserLocation()
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
}
}
//if we have no permission to access user location, then ask user for permission.
func isAuthorizedtoGetUserLocation() {
if CLLocationManager.authorizationStatus() != .authorizedWhenInUse {
locationManager.requestWhenInUseAuthorization()
}
}
//this method will be called each time when a user change his location access preference.
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedWhenInUse {
print("User allowed us to access location")
//do whatever init activities here.
}
}
//this method is called by the framework on locationManager.requestLocation();
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print("Did location updates is called")
//store the user location here to firebase or somewhere
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("Did location updates is called but failed getting location \(error)")
}
}
Vous pouvez maintenant coder l'appel ci-dessous dès que l'utilisateur se connecte à votre application. Lorsque requestLocation () est appelé, il appelle en outre didUpdateLocations ci-dessus et vous pouvez stocker l'emplacement sur Firebase ou ailleurs.
if CLLocationManager.locationServicesEnabled() {
locationManager.requestLocation();
}
si vous utilisez GeoFire, dans la méthode didUpdateLocations ci-dessus, vous pouvez stocker l'emplacement comme ci-dessous.
geoFire?.setLocation(locations.first, forKey: uid) where uid is the user id who logged in to the app. I think you will know how to get UID based on your app sign in implementation.
Dernier point mais non le moindre, accédez à votre Info.plist et activez «Confidentialité-Emplacement lors de l'utilisation de la description d'utilisation».
Lorsque vous utilisez le simulateur pour le tester, vous obtenez toujours un emplacement personnalisé que vous avez configuré dans Simulator -> Debug -> Location.
Bibliothèque d'importation comme:
import CoreLocation
définir le délégué:
CLLocationManagerDelegate
Prenez variable comme:
var locationManager:CLLocationManager!
Sur viewDidLoad (), écrivez ce joli code:
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
if CLLocationManager.locationServicesEnabled(){
locationManager.startUpdatingLocation()
}
Écrire des méthodes de délégué CLLocation:
//MARK: - location delegate methods
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocation :CLLocation = locations[0] as CLLocation
print("user latitude = \(userLocation.coordinate.latitude)")
print("user longitude = \(userLocation.coordinate.longitude)")
self.labelLat.text = "\(userLocation.coordinate.latitude)"
self.labelLongi.text = "\(userLocation.coordinate.longitude)"
let geocoder = CLGeocoder()
geocoder.reverseGeocodeLocation(userLocation) { (placemarks, error) in
if (error != nil){
print("error in reverseGeocode")
}
let placemark = placemarks! as [CLPlacemark]
if placemark.count>0{
let placemark = placemarks![0]
print(placemark.locality!)
print(placemark.administrativeArea!)
print(placemark.country!)
self.labelAdd.text = "\(placemark.locality!), \(placemark.administrativeArea!), \(placemark.country!)"
}
}
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("Error \(error)")
}
Définissez maintenant l'autorisation d'accès à l'emplacement. Ajoutez donc cette valeur clé dans votre fichier info.plist
<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>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Do you allow this app to know your current location?</string>
100% travaille sans aucun problème. TESTÉ
ajoutez d'abord deux cadres dans votre projet
1: MapKit
2: Corelocation (n'est plus nécessaire à partir de XCode 7.2.1)
Définir dans votre classe
var manager:CLLocationManager!
var myLocations: [CLLocation] = []
puis dans le code de la méthode viewDidLoad cela
manager = CLLocationManager()
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.requestAlwaysAuthorization()
manager.startUpdatingLocation()
//Setup our Map View
mapobj.showsUserLocation = true
n'oubliez pas d'ajouter ces deux valeurs dans le fichier plist
1: NSLocationWhenInUseUsageDescription
2: NSLocationAlwaysUsageDescription
override func viewDidLoad() {
super.viewDidLoad()
locationManager.requestWhenInUseAuthorization();
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}
else{
print("Location service disabled");
}
}
Ceci est votre méthode de chargement de vue et dans la classe ViewController inclut également la méthode de mise à jour mapStart comme suit
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
var locValue : CLLocationCoordinate2D = manager.location.coordinate;
let span2 = MKCoordinateSpanMake(1, 1)
let long = locValue.longitude;
let lat = locValue.latitude;
print(long);
print(lat);
let loadlocation = CLLocationCoordinate2D(
latitude: lat, longitude: long
)
mapView.centerCoordinate = loadlocation;
locationManager.stopUpdatingLocation();
}
Aussi n'oubliez pas d'ajouter CoreLocation.FrameWork et MapKit.Framework dans votre projet (n'est plus nécessaire depuis XCode 7.2.1 )
import CoreLocation
import UIKit
class ViewController: UIViewController, CLLocationManagerDelegate {
var locationManager: CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status != .authorizedWhenInUse {return}
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
let locValue: CLLocationCoordinate2D = manager.location!.coordinate
print("locations = \(locValue.latitude) \(locValue.longitude)")
}
}
Comme l'appel à requestWhenInUseAuthorization
est asynchrone, l'application appelle la fonction locationManager
une fois que l'utilisateur a accordé ou refusé l'autorisation. Par conséquent, il est approprié de placer le code d’obtention de votre emplacement dans cette fonction, avec l’autorisation donnée à l’utilisateur. Ceci est le meilleur tutoriel sur ce que j'ai trouvé à ce sujet .
Usage:
Définir le champ en classe
let getLocation = GetLocation()
Utilisation en fonction de la classe par code simple:
getLocation.run {
if let location = $0 {
print("location = \(location.coordinate.latitude) \(location.coordinate.longitude)")
} else {
print("Get Location failed \(getLocation.didFailWithError)")
}
}
Classe:
import CoreLocation
public class GetLocation: NSObject, CLLocationManagerDelegate {
let manager = CLLocationManager()
var locationCallback: ((CLLocation?) -> Void)!
var locationServicesEnabled = false
var didFailWithError: Error?
public func run(callback: @escaping (CLLocation?) -> Void) {
locationCallback = callback
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
manager.requestWhenInUseAuthorization()
locationServicesEnabled = CLLocationManager.locationServicesEnabled()
if locationServicesEnabled { manager.startUpdatingLocation() }
else { locationCallback(nil) }
}
public func locationManager(_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]) {
locationCallback(locations.last!)
manager.stopUpdatingLocation()
}
public func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
didFailWithError = error
locationCallback(nil)
manager.stopUpdatingLocation()
}
deinit {
manager.stopUpdatingLocation()
}
}
// its with strongboard
@IBOutlet weak var mapView: MKMapView!
//12.9767415,77.6903967 - exact location latitude n longitude location
let cooridinate = CLLocationCoordinate2D(latitude: 12.9767415 , longitude: 77.6903967)
let spanDegree = MKCoordinateSpan(latitudeDelta: 0.2,longitudeDelta: 0.2)
let region = MKCoordinateRegion(center: cooridinate , span: spanDegree)
mapView.setRegion(region, animated: true)
100% travaillant dans iOS Swift 4 de: Parmar Sajjad
Étape 1: Allez sur GoogleDeveloper Api Console et créez votre ApiKey.
Étape 2: Goto Project installe le pod GoogleMaps de Cocoapods
étape 3: Goto AppDelegate.Swift importer GoogleMaps et
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
GMSServices.provideAPIKey("ApiKey")
return true
}
étape 4: Importation UIKit Importation GoogleMaps ViewController de classe: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var mapview: UIView!
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManagerSetting()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func locationManagerSetting() {
self.locationManager.delegate = self
self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
self.locationManager.requestWhenInUseAuthorization()
self.locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
self.showCurrentLocationonMap()
self.locationManager.stopUpdatingLocation()
}
func showCurrentLocationonMap() {
let
cameraposition = GMSCameraPosition.camera(withLatitude: (self.locationManager.location?.coordinate.latitude)! , longitude: (self.locationManager.location?.coordinate.longitude)!, zoom: 18)
let mapviewposition = GMSMapView.map(withFrame: CGRect(x: 0, y: 0, width: self.mapview.frame.size.width, height: self.mapview.frame.size.height), camera: cameraposition)
mapviewposition.settings.myLocationButton = true
mapviewposition.isMyLocationEnabled = true
let marker = GMSMarker()
marker.position = cameraposition.target
marker.snippet = "Macczeb Technologies"
marker.appearAnimation = GMSMarkerAnimation.pop
marker.map = mapviewposition
self.mapview.addSubview(mapviewposition)
}
}
étape 5: ouvrez le fichier info.plist et ajoutez-le ci-dessous Confidentialité - Emplacement en cours d'utilisation Description de l'utilisation ...... sous le nom de base d'un fichier de storyboard
étape 6: courir
voici un exemple de copier-coller qui a fonctionné pour moi.
http://swiftdeveloperblog.com/code-examples/determine-users-current-location-example-in-Swift/
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
var locationManager:CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
determineMyCurrentLocation()
}
func determineMyCurrentLocation() {
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
if CLLocationManager.locationServicesEnabled() {
locationManager.startUpdatingLocation()
//locationManager.startUpdatingHeading()
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocation:CLLocation = locations[0] as CLLocation
// Call stopUpdatingLocation() to stop listening for location updates,
// other wise this function will be called every time when user location changes.
// manager.stopUpdatingLocation()
print("user latitude = \(userLocation.coordinate.latitude)")
print("user longitude = \(userLocation.coordinate.longitude)")
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error)
{
print("Error \(error)")
}
}