IOS - 使用swift运行更新用户位置的后台任务

时间:2015-02-13 16:18:49

标签: ios swift core-location

我是这里的新用户,但我已多次使用stackoverflow:)...我是android开发人员,但现在我正在使用swift在ios应用程序中工作。我使用xcode是全新的,也许我的问题很简单很多......很棒,我真的需要帮助。 我尝试实施每10分钟更新一次用户位置的后台任务。我需要获取lat和long数据,然后将此信息发送到API Web服务。我一直在讨论backgroud docs,所有文档以及有关user location services的所有文档。有很多信息,漂亮的信息,但是,也许我非常想知道android信息,也有很多信息,但是很多简单的例子对我来说也很容易。而且previous stackoverflow question可能很有帮助。

我理解了很多概念,并且我按照文档说的那样配置了我的info.plist,但是......如何运行后台任务来获取用户位置?我必须在哪里编写后台任务代码?什么是开始?我有一个项目有三个不同的viewcontrollers,我需要用一个按钮启动服务...非常感谢,我真的需要了解这一切的起点。

1 个答案:

答案 0 :(得分:6)

我目前正在做与我的第一个iOS项目相同的事情 - 帮助我的是: Periodic iOS background location updates

从那时起,我找到了一个https://github.com/voyage11/Location的快速端口:https://github.com/silento/Location。在voyage11的项目中,还有一篇博客文章,其中有一些说明了正在发生的事情,并且还链接到第二个,它告诉我们如何使用“重要的位置变化”重新启动位置服务。我目前正试图通过“区域位置监控”来实现这一点,但不确定它是否有效。

哦,我将触发新后台任务的代码从didUpdateLocation-part移动到restartLocationUpdates-part-这样即使你没有及时获得某个位置,也可以确保你的任务重新启动。

它从一开始就不起作用,但当我从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事件,具体取决于交换机的新状态。我无法解释所有基础知识,你应该看一个基本的教程,我喜欢https://www.youtube.com/playlist?list=PL_4rJ_acBNMHa_RGZigG2nQI3aL1kTa4r并特别使用第7个视频作为如何构建基本应用程序的示例。唯一可以比显示更容易的是使用从故事板到代码视图的右键单击拖动而不是手动实现某些方法。有一个方便的助手。

对于您的位置事件侦听器,您可以添加一个新的swift类并为其命名,例如: LocationDelegate.swift。它使它更干净。我使用Singleton模式,你可以查找如何做到这一点。或者您可以使用我上面发布的github项目的结构。我无法提供完整的资源,因为您需要更改它以满足您的个人需求;)

哦,还有一件事:要记住在应用程序启动之间是否启用了您的开关,您可以使用以下内容:

   @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
祝你好运!