我的简单地图项目没有在模拟器中获取并显示我的位置

Posted

技术标签:

【中文标题】我的简单地图项目没有在模拟器中获取并显示我的位置【英文标题】:My simple map project doesn't get & show my location in simulator 【发布时间】:2016-07-14 23:45:23 【问题描述】:

我正在使用 XCode v7.2.1,模拟器 v9.2。

我有一个 UIViewController,它显示了一张地图,应该可以获取我的位置并将其显示在地图上:

import UIKit
import MapKit

class LocationVC: UIViewController, MKMapViewDelegate 
    @IBOutlet weak var map: MKMapView!

    let locationManager = CLLocationManager()

    override func viewDidLoad() 
        super.viewDidLoad()

        map.delegate = self
    

    override func viewDidAppear(animated: Bool) 
        if CLLocationManager.authorizationStatus() == .AuthorizedWhenInUse 
            map.showsUserLocation = true
         else 
            locationManager.requestWhenInUseAuthorization()
        
    


我在info.plist中添加了NSLocationWhenInUseUsageDescription,如下图所示:

我还选择了Debug -> Location -> Custom Location ... 并设置芬兰赫尔辛基的经纬度如下图:

当我运行我的应用程序时,会显示地图,但它没有获取我的位置。为什么? (我的意思是我在地图的任何地方都看不到蓝点)。

===== 更新 ====

当我的应用程序运行时,我也尝试了this,但它也无济于事。

【问题讨论】:

无论如何你都应该设置showsUserLocation = true,而不是按条件设置 我想先征得用户的许可,然后再显示位置。无论如何,我的条件代码也没有错。 考虑以下情况:用户打开控制器,同意使用位置,你执行requestWhenInUseAuthorization() 但之后没有任何反应,没有更多的代码在地图上显示位置,所以用户只会看到蓝点下次他打开这个控制器时 但问题是模拟器也没有弹出询问用户许可的对话框。 locationManager 根本不起作用,这是我的问题等待答案。 您能否将delegate 添加到locationManager 并查看委托方法中发生了什么? 【参考方案1】:

您正在请求用户的位置,但实际上并未对响应进行任何操作。成为位置经理的代表并响应授权更改。

此代码在 7.2.1 上适用于我(在 Debug -> Location 中选择“Apple”后):

import UIKit
import MapKit

class ViewController: UIViewController, CLLocationManagerDelegate 
    @IBOutlet weak var map: MKMapView!

    let locationManager = CLLocationManager()

    override func viewDidLoad() 
        super.viewDidLoad()

        locationManager.delegate = self
    

    override func viewDidAppear(animated: Bool) 
        super.viewDidAppear(animated)

        if CLLocationManager.authorizationStatus() == .AuthorizedWhenInUse 
            map.showsUserLocation = true
         else 
            locationManager.requestWhenInUseAuthorization()
        
    

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) 
        guard status == .AuthorizedWhenInUse else  print("not enabled"); return 
        map.showsUserLocation = true
    

【讨论】:

如果我们正在更新代理中的用户位置。为什么我们也需要更新 viewwillappear 中的位置?有必要吗?如果是,你能解释一下吗?我是 ios 开发新手,请帮助我。 在 viewDidAppear 中有两个分支。 A) 如果用户已经授权应用查看他们的位置,那么立即开始在地图上显示位置。 B) 如果用户没有授权该应用查看他们的位置,则请求许可,如果获得许可,则在地图上显示该位置【参考方案2】:

我同意@Casey 的回答,但有时您需要使用CLLocationManagerDelegate 方法做更多的事情。

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    if let location = locations.first 
       //reset mapView's center in case your custom location was wrong.
        map.centerCoordinate = location.coordinate
       //mannual call show annotations to avoid some bugs
        map.showAnnotations(map.annotations, animated: true)
    

【讨论】:

【参考方案3】:

你只需要添加

locationManager.delegate = self
mapView.showsUserLocation = true

【讨论】:

以上是关于我的简单地图项目没有在模拟器中获取并显示我的位置的主要内容,如果未能解决你的问题,请参考以下文章

Android模拟器谷歌地图显示错误的位置

Google地图商店定位器在laravel项目中不起作用

快速显示用户位置

如何在我的应用程序视图中显示地图?

StringBuilder 没有附加位置地址

phonegap 中的地理位置无法在模拟器上运行