Swift + didUpdateUserLocation没有被调用

我无法调用MKMapView委托方法didUpdateUserLocation

我到目前为止做了什么:

  1. 在项目中添加框架MapKit.framwork

  2. 通过import MapKitimport MapKit视图控制器中的框架

  3. 添encryption钥在plist文件中

    <key>NSLocationAlwaysUsageDescription</key> <true/>

  4. 代码在视图控制器

增加了委托didUpdateUserLocation方法来检查位置是否更新,但从来没有调用。

 // MARK: - MapView delegate methods func mapView(mapView: MKMapView!, regionDidChangeAnimated animated: Bool) { // Calling... } func mapView(mapView: MKMapView!, didUpdateUserLocation userLocation: MKUserLocation!) { // Not getting called } // MARK: - View lifeCycle methods override func viewDidLoad() { super.viewDidLoad() var locationManager = CLLocationManager() locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.requestWhenInUseAuthorization() locationManager.startUpdatingLocation() self.mapView.delegate = self self.mapView.showsUserLocation = true self.mapView.pitchEnabled = true self.mapView.showsBuildings = true } 

我已经使用模拟器和更改模拟器自定义位置来检查是否被调用? 方法regionDidChangeAnimated被称为完美!

同样的事情适用于iOS7。 Swift地图位置更新还有什么额外的努力?

编辑: Plist键

在这里输入图像说明

还没有提示权限提醒。

  1. 你必须保持对CLLocationManager的引用。
  2. 您必须等待locationManager(_:didChangeAuthorizationStatus:)调用的委托方法,之后.startUpdatingLocation()showsUserLocation = true
  3. 根据文件 : NSLocationWhenInUseUsageDescription值types是String。

尝试:

 class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate { @IBOutlet weak var mapView: MKMapView! var locationManager = CLLocationManager() // MARK: - View lifeCycle methods override func viewDidLoad() { super.viewDidLoad() self.locationManager.delegate = self self.locationManager.desiredAccuracy = kCLLocationAccuracyBest self.locationManager.requestWhenInUseAuthorization() self.mapView.delegate = self self.mapView.pitchEnabled = true self.mapView.showsBuildings = true } // MARK: - LocationManager delegate methods func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { switch status { case .Authorized, .AuthorizedWhenInUse: manager.startUpdatingLocation() self.mapView.showsUserLocation = true default: break } } // MARK: - MapView delegate methods func mapView(mapView: MKMapView!, didUpdateUserLocation userLocation: MKUserLocation!) { println(userLocation) // Not getting called } } 

除了我想在这里总结的其他答案:

你已经把NSLocationAlwaysUsageDescription的关键字NSLocationAlwaysUsageDescription你的info.plist 。 当系统提示用户请求位置服务权限时,该键的value必须是包含问题文本的string

根据密钥,您必须通过调用请求许可

 locationManager.requestWhenInUseAuthorization() 

你可能已经回答了这个问题,所以你的答案可能已经保存在用户的喜好中。 最好的方法是从模拟器中彻底卸载应用程序并重新安装,以便再次询问。

对于在iOS 8上运行的应用程序,您需要在plist文件中添加两个键:

NSLocationAlwaysUsageDescription(你已经有这个)

NSLocationWhenInUseUsageDescription

此外,你将需要包装检查如果应用程序在iOS8下运行,如果是这样添加下两行。 如果是iOS 7或以下,则需要跳过这两行。 如果您忘记这样做,应用程序将崩溃在较低的版本。

 // You have this check locationManager.requestWhenInUseAuthorization() // Add this one locationManager.requestAlwaysAuthorization() 

问题是你在使用授权时要求的

 locationManager.requestWhenInUseAuthorization() 

并在pList中添加始终授权的<key>NSLocationAlwaysUsageDescription</key> 。 您需要使用NSLocationWhenInUseUsageDescription

修复!

在ios8之后,MKMapView并没有自动加载LocationCoordinate,如果我们想用MKMapView来加载更精确的位置,使用“-mapView:didUpdateUserLocation”:

前提: 1.设置mapView委托。 2.setShowsUserLocation:YES 3.mapView必须在一个容器(addSubview:mapView)!!!!!

例:

 self.mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)]; _mapView.delegate = self; [_mapView setShowsUserLocation:YES]; [[UIApplication sharedApplication].keyWindow addSubview:_mapView]; 

我将MapView添加到Window,因为UtilSingleton中的代码可以添加到您的控制器视图中。

尝试所有以上答案后,如果“didUpdateUserLocation”委托没有被调用,然后select模拟器点击debugging从菜单栏select位置,然后select苹果。 我试过所有的答案,但位置被设置为自定义,所以我把它改为苹果和调用委托方法。 之后,我再次将其设置为自定义,现在显示位置。