如何使用swift 2在应用程序中更新位置

时间:2016-11-11 05:43:54

标签: ios swift swift2 location mkmapview

我正在使用MKMapView开发应用。我想每3分钟更新一次到服务器的位置。现在,我可以使用NSTimer更新位置,但是当应用在后台时,我无法更新。我已经搜索了其他堆栈溢出的答案,但他们没有帮助。

我尝试过:

  • 我启用了后台模式和所选位置更新
  • 我将此代码包含在我的视图中,加载方法:

    self.locationManager.allowsBackgroundLocationUpdates = true
    

接下来我该怎么办?有人可以帮助我做这个吗?

1 个答案:

答案 0 :(得分:0)

计时器与运行循环一起使用。要有效地使用计时器,您应该了解运行循环的运行方式 - 请参阅RunLoop和线程编程指南。请特别注意,运行循环保持对其计时器的强引用,因此在将计时器添加到运行循环后,您不必维护自己对计时器的强引用。

计时器不是实时机制;只有当添加了计时器的其中一个运行循环模式正在运行并且能够检查计时器的触发时间是否已经过去时,它才会触发。由于典型的运行循环管理各种输入源,因此定时器的时间间隔的有效分辨率被限制在50-100毫秒的量级。如果在长时间标注期间或在运行循环处于不监视计时器的模式下发生计时器的触发时间,则计时器在下次运行循环检查计时器之前不会触发。因此,计时器可能发射的实际时间可能是计划发射时间之后的一段很长时间。From Apple official document.

当我们的应用程序在后台时调用此方法。操作系统限制我们(我相信)三十秒。三十秒后,我们的时间到了。 我们必须调用completionHandler()(或操作系统会认为我们使用了所有时间)。

尝试在

中执行任务
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
    return true
}

func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    // do background work
}

来源: - Background task.