如何存储用户的当前位置,并在地图上显示该位置?

我可以在地图上显示预定义的坐标,只是不知道如何从设备接收信息。

我也知道我必须添加一些项目到Plist。我该怎么做呢?


当前回答

之前所有的答案都没有正确地遵循正确的步骤。当设置CLLocationManager时,您不需要最初调用CLLocationManager. locationservicesenabled()或locationManager.requestWhenInUseAuthorization()。你不应该调用startUpdatingLocation(),直到你已经验证你有授权。

要开始,如果还没有完成,请添加所需的隐私设置。选择你的应用目标,然后转到信息选项卡。在“自定义iOS目标属性”部分右键单击并选择“添加行”。向下滚动到“隐私”条目,并选择其中之一:

"隐私-使用时的位置使用说明" "隐私-位置始终使用说明" 隐私-使用时的位置使用说明

这取决于你的应用程序的需求。对于这个值,确保你输入了一个句子,向用户解释为什么你的应用程序需要访问他们的位置。如果所提供的描述对用户没有用处,你的应用可能会被苹果拒绝。

然后使用以下(大量注释)代码作为示例,在视图控制器中获取用户的位置:

import UIKit
import CoreLocation

class ViewController: UIViewController {
    var locationManager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Setup the location manager
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation // Or other desired accuracy

        // That's it for the initial setup. Everything else is handled in the
        // locationManagerDidChangeAuthorization delegate method.
    }
}

extension ViewController: CLLocationManagerDelegate {
    // This is called as soon as the location manager is setup (in viewDidLoad)
    // This is called when the user responds to the privacy dialog
    // This is called if the user changes the privacy setting in the Settings app
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        switch manager.authorizationStatus {
        case .notDetermined:
            // Request the appropriate authorization based on the needs of the app
            manager.requestWhenInUseAuthorization()
            // manager.requestAlwaysAuthorization()
        case .restricted:
            print("Sorry, restricted")
            // Optional: Offer to take user to app's settings screen
        case .denied:
            print("Sorry, denied")
            // Optional: Offer to take user to app's settings screen
        case .authorizedAlways, .authorizedWhenInUse:
            // The app has permission so start getting location updates
            manager.startUpdatingLocation()
        @unknown default:
            print("Unknown status")
        }
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        print("Received \(locations.count) locations")

        // Some location updates can be invalid or have insufficient accuracy.
        // Find the first location that has sufficient horizontal accuracy.
        // If the manager's desiredAccuracy is one of kCLLocationAccuracyNearestTenMeters,
        // kCLLocationAccuracyHundredMeters, kCLLocationAccuracyKilometer, or kCLLocationAccuracyThreeKilometers
        // then you can use $0.horizontalAccuracy <= manager.desiredAccuracy. Otherwise enter the number of meters desired.
        if let location = locations.first(where: { $0.horizontalAccuracy <= 40 }) {
            print("Good location found: \(location)")
            // Call the following if you don't need any more updates
            manager.stopUpdatingLocation()

            // Do something useful with the found location
            // - show on a map
            // - Reverse geocode to get the address
            // - send to server
        }
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Location manager error: \(error)")
    }
}

其他回答

用法:

在类中定义字段

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”。

之前所有的答案都没有正确地遵循正确的步骤。当设置CLLocationManager时,您不需要最初调用CLLocationManager. locationservicesenabled()或locationManager.requestWhenInUseAuthorization()。你不应该调用startUpdatingLocation(),直到你已经验证你有授权。

要开始,如果还没有完成,请添加所需的隐私设置。选择你的应用目标,然后转到信息选项卡。在“自定义iOS目标属性”部分右键单击并选择“添加行”。向下滚动到“隐私”条目,并选择其中之一:

"隐私-使用时的位置使用说明" "隐私-位置始终使用说明" 隐私-使用时的位置使用说明

这取决于你的应用程序的需求。对于这个值,确保你输入了一个句子,向用户解释为什么你的应用程序需要访问他们的位置。如果所提供的描述对用户没有用处,你的应用可能会被苹果拒绝。

然后使用以下(大量注释)代码作为示例,在视图控制器中获取用户的位置:

import UIKit
import CoreLocation

class ViewController: UIViewController {
    var locationManager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Setup the location manager
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation // Or other desired accuracy

        // That's it for the initial setup. Everything else is handled in the
        // locationManagerDidChangeAuthorization delegate method.
    }
}

extension ViewController: CLLocationManagerDelegate {
    // This is called as soon as the location manager is setup (in viewDidLoad)
    // This is called when the user responds to the privacy dialog
    // This is called if the user changes the privacy setting in the Settings app
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        switch manager.authorizationStatus {
        case .notDetermined:
            // Request the appropriate authorization based on the needs of the app
            manager.requestWhenInUseAuthorization()
            // manager.requestAlwaysAuthorization()
        case .restricted:
            print("Sorry, restricted")
            // Optional: Offer to take user to app's settings screen
        case .denied:
            print("Sorry, denied")
            // Optional: Offer to take user to app's settings screen
        case .authorizedAlways, .authorizedWhenInUse:
            // The app has permission so start getting location updates
            manager.startUpdatingLocation()
        @unknown default:
            print("Unknown status")
        }
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        print("Received \(locations.count) locations")

        // Some location updates can be invalid or have insufficient accuracy.
        // Find the first location that has sufficient horizontal accuracy.
        // If the manager's desiredAccuracy is one of kCLLocationAccuracyNearestTenMeters,
        // kCLLocationAccuracyHundredMeters, kCLLocationAccuracyKilometer, or kCLLocationAccuracyThreeKilometers
        // then you can use $0.horizontalAccuracy <= manager.desiredAccuracy. Otherwise enter the number of meters desired.
        if let location = locations.first(where: { $0.horizontalAccuracy <= 40 }) {
            print("Good location found: \(location)")
            // Call the following if you don't need any more updates
            manager.stopUpdatingLocation()

            // Do something useful with the found location
            // - show on a map
            // - Reverse geocode to get the address
            // - send to server
        }
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Location manager error: \(error)")
    }
}

要获取用户的当前位置,你需要声明:

let locationManager = CLLocationManager()

在viewDidLoad()中,你必须实例化CLLocationManager类,就像这样:

// 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()
}

然后在CLLocationManagerDelegate方法中,你可以获得用户当前的位置坐标:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
    print("locations = \(locValue.latitude) \(locValue.longitude)")
}

在信息中。plist你必须添加NSLocationAlwaysUsageDescription 和你的自定义警报消息像;AppName(演示应用程序)想使用您的当前位置。

下面是一个适用于我的复制粘贴示例。

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)")
    }
}

NSLocationWhenInUseUsageDescription =请求权限使用位置服务时,应用程序是在后台。在你的plist文件中。

如果这是工作,然后请投票的答案。