为什么CoreLocation无法获取新的GPS数据,而Mapkit显示这个旧的GPS数据

时间:2018-03-09 14:24:35

标签: ios swift mapkit core-location

我正在使用MapKit和核心位置来显示我当前的GPS位置。 代码工作正常,但有一些问题。

问题如下:

  1. 我在路边的开放区域打开我的应用程序。该应用程序可以获取我当前的GPS位置并将其显示在地图上。
  2. 我带着应用程序进入建筑物。在内部时,我启动页面以显示GPS位置。它显示了我以前的GPS位置。据我所知,当我在建筑物内时,Mapkit和Corelocation不应该能够获得GPS。但在这种情况下,它会显示我以前的GPS数据!
  3. 我带着应用程序走出大楼。在开放空间中,我启动页面以显示我当前的GPS位置,但应用程序无法获取我的新GPS位置,但显示以前的GPS数据。在这种情况下,应用程序应该获取新的GPS位置。我必须尝试几次才能启动页面(从GPS-VC导航到home-VC,从主页点击一个按钮启动GPS-VC以获得GPS)。
  4. 为什么即使我在开放空间中信号强度很好,GPS也会如此慢?

    调用这些方法有什么不同:

    1. LocationManager.startUpdatingLocation()
    2. LocationManager.requestLocation()
    3. 这里是代码:

      @IBOutlet weak var Map: MKMapView!
      
      var locationMgr : CLLocationManager!
      
      override func viewDidload(){
      
          if(CLLocationManager.locationServicesEnabled() )
          {
             locationMgr = CLLocationManager()
             locationMgr.delegate = self
             locationMgr.desriedAccuracy = kCLLocationAccuracyBest
             locationMgr.requestWhenInuseAuthorization()
             locationMgr.startUpdatingLocation()
          }
      }
      
      func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
          let userLoction: CLLocation = locations[0]
      
          let latitude = userLoction.coordinate.latitude
          let longitude = userLoction.coordinate.longitude
      
          let latDelta: CLLocationDegrees = 0.05
          let lonDelta: CLLocationDegrees = 0.05
      
          let span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)
          let location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)
          let region: MKCoordinateRegion = MKCoordinateRegionMake(location, span)
      
          let dropin = MKPointAnnotation()
          dropin.coordinate = location
          droping.title = "Here"
      
          self.Map.setRegion(region, animated: true)
          self.Map.addAnnotation(dropin)
          self.Map.showsUserLocation = true
      }
      

1 个答案:

答案 0 :(得分:0)

我不确定这会解决您的所有3个问题但我在您的委托方法中发现了以下问题:

  1. locations数组按升序时间顺序排序,所以locations.last将包含最近的位置。
  2. 可以使用旧的缓存值调用此方法,因此您需要检查位置的时间戳以确定它是否值得使用。