我目前正在做与我的第一个 iOS 项目相同的事情 - 对我有帮助的是:
Periodic iOS background location updates
从那里我找到了https://github.com/voyage11/Location 的 Swift 端口:https://github.com/silento/Location。在 voyage11 的项目中,还链接了一篇博客文章,该文章稍微澄清了正在发生的事情,并且还链接到第二篇文章,该文章讲述了如何使用“重大位置更改”重新启动位置服务。我目前正在尝试通过“区域位置监控”来实现这一点,但不确定它是否会起作用。
哦,我将触发新后台任务的代码从 didUpdateLocation 部分移到了 restartLocationUpdates 部分 - 这样即使您没有及时获得位置,您也可以确保您的任务已重新启动。
它从一开始就不起作用,但是当我添加来自 https://stackoverflow.com/a/19085518/3085985 的代码作为 stopUpdatingLocation() 和 startUpdatingLocation() 的替代品时。
它确实比它应该的复杂,而且我在 Android 上使用的东西 - 但它就是这样。如果你正在为 Iphone5+ 开发,你也可以考虑这篇文章(我现在无法测试它,因为我只有 iPhone 4S 并且模拟器不支持该功能):https://stackoverflow.com/a/24666487/3085985。
我希望你有一些起点,我目前仍在测试我的解决方案,但据我现在所见,它似乎可以工作;)
P.S.:我在某处读到了一些关于休眠超过 5 分钟的后台任务被取消的信息 - 因为我只等待 30 秒,所以我没有这个问题,但你可能有。但也许让定位服务以非常远的距离运行可以防止这种情况发生。
P.P.S.:由于 Swift 是新的,你应该习惯于阅读 Objective C-Code 并尝试将其翻译成 Swift。它通常是找到好的教程的唯一方法。
还有一件事——对于 iOS8,你需要类似的东西:
if (self.locationManager.respondsToSelector(Selector("requestWhenInUseAuthorization"))) {
// on iOS8+, we need to request the location authorization ourselves -.-
self.locationManager.requestAlwaysAuthorization()
}
不要忘记将“NSLocationAlwaysUsageDescription”添加到您的 Info.plist 中,并允许在您的项目功能中进行后台位置更新。
对不起,这乱七八糟的文字,但这是一个非常复杂的话题;)
编辑:关于您的第一条评论:
您应该创建一个 Swift 项目,例如有一个单一的窗口和主要。故事板添加一个开关。然后你应该实现一个 ToggleActionChanged-event 启用或禁用侦听器,具体取决于开关的新状态。我无法解释所有的基础知识,你应该看一个基础教程,我喜欢https://www.youtube.com/playlist?list=PL_4rJ_acBNMHa_RGZigG2nQI3aL1kTa4r,并特别使用第 7 个视频作为如何构建基本应用程序的示例。唯一比这里显示的更容易的是使用右键单击从情节提要拖动到代码视图,而不是手动实现某些方法。有一个方便的助手。
对于您的位置事件侦听器,您可以添加一个新的 swift 类并将其命名为例如LocationDelegate.swift 。它使它更干净一些。我为此使用了单例模式,您可以查看如何执行此操作。或者你可以使用我上面发布的 github-project 的结构。我无法提供完整的源代码,因为您需要对其进行更改以符合您的个人需求;)
哦,还有一件事:要记住是否在应用程序启动之间启用了切换,您可以使用以下内容:
@IBAction func toggleTrackingChanged(sender: UISwitch) {
// This is your method for when the switch changed... put your location activation/deactivation here
let userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setBool(sender.on, forKey: "ODLTrackingActive")
}
}
在你的 viewDidLoad-Method 中:
let userDefaults = NSUserDefaults.standardUserDefaults()
var trackingActive = userDefaults.boolForKey("ODLTrackingActive")
toggleTrackingSwitch.setOn(trackingActive, animated: false)
// reactivate location tracking if necessary
祝你好运!