ios - 如何使用 swift 2 在后台应用程序时更新位置

标签 ios swift swift2 location mkmapview

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

我尝试过的:

  • 我打开了后台模式并选择了位置更新
  • 我将此代码包含到我的 View 确实加载方法中:

    self.locationManager.allowsBackgroundLocationUpdates = true
    

接下来我可以做什么?有人可以帮我做这个吗?

最佳答案

计时器与运行循环结合使用。要有效地使用计时器,您应该了解运行循环的运行方式 - 请参阅 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.

关于ios - 如何使用 swift 2 在后台应用程序时更新位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40541825/

相关文章:

ios - swift :How can i remove the outlets from code?

ios - 将 UIImageView 从 subview 动画到父 View

ios - AVPlayer 无明显原因暂停

ios - Swift - UIBarButtonItem.customView - 重置为原始状态

ios - 循环以从 viewDidLoad 上的文档目录设置 UIImages

xcode - 为什么我不能让我的类方法定义为索引包含变量的实例数组?

xcode - 如何在 macOS Swift 中保存 NSTextField 内容?

ios - 当我展示我的 UIImagePickerController 时,什么也没有出现

ios - Swift 2.0 无法使用类型为 ([AnyObject],(_) -> _) 的参数列表调用 'map'

swift - 在 UITableViewCell Swift 2 中运行 Segue