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

Dan*_*tro 4 core-location ios swift

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

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

Com*_*eak 6

我目前正在做与我的第一个iOS项目相同的事情 - 帮助我的是: 定期iOS背景位置更新

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

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

它从一开始就不起作用,但是当我添加来自/sf/answers/1335986291/的代码作为stopUpdatingLocation()和startUpdatingLocation() - 部分的替代.

它实际上比应该更复杂,我在Android中使用的是什么 - 但事实就是如此.如果您正在为Iphone5 +开发,您也可以考虑这篇文章(我现在无法测试它,因为我只有iPhone 4S并且模拟器不支持该功能):https://stackoverflow.com/a/24666487/ 3085985.

我希望你有一些起点,我目前仍在测试我的解决方案,但它似乎工作,我现在可以看到;)

PS:我在某处读到有关睡眠超过5分钟的后台任务被取消的事情 - 因为我只等了30秒我没有这个问题,但你可能有.但是,保持位置服务运行的距离非常远,可以防止这种情况发生.

PPS:由于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()
        }
Run Code Online (Sandbox Code Playgroud)

并且不要忘记将"NSLocationAlwaysUsageDescription"添加到Info.plist中,并允许在项目功能中更新后台位置.抱歉这一堆文字,但这是一个非常复杂的话题;)

编辑:关于你的第一个评论:你应该创建一个Swift项目,例如使用单个窗口和Main.故事板添加一个开关.然后,您应该实现启用或禁用侦听器的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")
    }

 }
Run Code Online (Sandbox Code Playgroud)

并在您的viewDidLoad-Method中:

let userDefaults = NSUserDefaults.standardUserDefaults()

    var trackingActive = userDefaults.boolForKey("ODLTrackingActive")

    toggleTrackingSwitch.setOn(trackingActive, animated: false)

    // reactivate location tracking if necessary
Run Code Online (Sandbox Code Playgroud)

祝好运!