如何存储用户的当前位置,并在地图上显示该位置?
我可以在地图上显示预定义的坐标,只是不知道如何从设备接收信息。
我也知道我必须添加一些项目到Plist。我该怎么做呢?
如何存储用户的当前位置,并在地图上显示该位置?
我可以在地图上显示预定义的坐标,只是不知道如何从设备接收信息。
我也知道我必须添加一些项目到Plist。我该怎么做呢?
当前回答
首先导入Corelocation和MapKit库:
import MapKit
import CoreLocation
从CLLocationManagerDelegate继承到我们的类
class ViewController: UIViewController, CLLocationManagerDelegate
创建一个locationManager变量,这将是你的位置数据
var locationManager = CLLocationManager()
创建一个函数来获取位置信息,具体语法如下:
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
在函数中为用户的当前位置创建一个常量
let userLocation:CLLocation = locations[0] as CLLocation // note that locations is same as the one in the function declaration
停止更新位置,这可以防止你的设备在移动时不断地改变窗口以使你的位置居中(如果你想让它发挥其他作用,你可以省略这个)
manager.stopUpdatingLocation()
从刚刚定义的userLocatin获取用户坐标:
let coordinations = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude,longitude: userLocation.coordinate.longitude)
定义你想要缩放的地图:
let span = MKCoordinateSpanMake(0.2,0.2) 将这两个组合起来得到region:
let region = MKCoordinateRegion(center: coordinations, span: span)//this basically tells your map where to look and where from what distance
现在设置区域,并选择是否希望它与动画一起去那里
mapView.setRegion(region, animated: true)
关闭函数 }
从你的按钮或者其他你想要设置locationManagerDeleget为self的方式
现在允许显示位置
指定精度
locationManager.desiredAccuracy = kCLLocationAccuracyBest
授权:
locationManager.requestWhenInUseAuthorization()
为了能够授权位置服务,您需要将这两行添加到您的plist
位置:
locationManager.startUpdatingLocation()
显示给用户:
mapView.showsUserLocation = true
这是我的完整代码:
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)
}
}
其他回答
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)")
}
}
因为requestWhenInUseAuthorization的调用是异步的,所以应用程序在用户授予权限或拒绝它之后才调用locationManager函数。因此,在给定用户权限的情况下,在函数中放置位置获取代码是合适的。这是我找到的最好的教程。
// 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)
用法:
在类中定义字段
let getLocation = GetLocation()
通过简单的代码在类的函数中使用:
getLocation.run {
if let location = $0 {
print("location = \(location.coordinate.latitude) \(location.coordinate.longitude)")
} else {
print("Get Location failed \(getLocation.didFailWithError)")
}
}
类:
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()
}
}
不要忘记在info.plist中添加“NSLocationWhenInUseUsageDescription”。
首先导入Corelocation和MapKit库:
import MapKit
import CoreLocation
从CLLocationManagerDelegate继承到我们的类
class ViewController: UIViewController, CLLocationManagerDelegate
创建一个locationManager变量,这将是你的位置数据
var locationManager = CLLocationManager()
创建一个函数来获取位置信息,具体语法如下:
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
在函数中为用户的当前位置创建一个常量
let userLocation:CLLocation = locations[0] as CLLocation // note that locations is same as the one in the function declaration
停止更新位置,这可以防止你的设备在移动时不断地改变窗口以使你的位置居中(如果你想让它发挥其他作用,你可以省略这个)
manager.stopUpdatingLocation()
从刚刚定义的userLocatin获取用户坐标:
let coordinations = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude,longitude: userLocation.coordinate.longitude)
定义你想要缩放的地图:
let span = MKCoordinateSpanMake(0.2,0.2) 将这两个组合起来得到region:
let region = MKCoordinateRegion(center: coordinations, span: span)//this basically tells your map where to look and where from what distance
现在设置区域,并选择是否希望它与动画一起去那里
mapView.setRegion(region, animated: true)
关闭函数 }
从你的按钮或者其他你想要设置locationManagerDeleget为self的方式
现在允许显示位置
指定精度
locationManager.desiredAccuracy = kCLLocationAccuracyBest
授权:
locationManager.requestWhenInUseAuthorization()
为了能够授权位置服务,您需要将这两行添加到您的plist
位置:
locationManager.startUpdatingLocation()
显示给用户:
mapView.showsUserLocation = true
这是我的完整代码:
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)
}
}
斯威夫特3.0
如果你不想在地图中显示用户位置,而只是想将其存储在firebase或其他地方,那么请遵循以下步骤,
import MapKit
import CoreLocation
现在在你的VC上使用CLLocationManagerDelegate,你必须覆盖下面显示的最后三个方法。您可以看到requestLocation()方法如何使用这些方法获取当前用户位置。
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)")
}
}
现在,一旦用户登录到您的应用程序,您就可以编写下面的调用。当requestLocation()被调用时,它将进一步调用上面的didUpdateLocations,您可以将位置存储到Firebase或其他任何地方。
if CLLocationManager.locationServicesEnabled() {
locationManager.requestLocation();
}
如果你正在使用GeoFire,那么在上面的didUpdateLocations方法中,你可以像下面那样存储位置
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.
最后但并非最不重要的,去你的信息。plist并启用“Privacy -Location when in Use Usage Description.”
当您使用模拟器测试时,它总是给您一个自定义位置,您在模拟器中配置->调试->位置。