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

IOS - Running background task for update user location using swift

我是这里的新用户,但我已经多次使用 Whosebug :)...我是 android 开发人员,但现在我在 ios 应用程序中工作使用 swift。我是 xcode 的新手,也许我的问题对很多人来说都非常简单...太好了,我真的需要帮助。 我正在尝试实施每十分钟更新一次用户位置的背景任务。我需要获取纬度和经度数据,然后将此信息发送到 API 网络服务。我一直在评价 backgroud docs, all documentation, and all the documentation about user location services. There is a lot of information, pretty information, but, maybe i'm very wonted to the android information, with s lot of information too, but a lot of easy examples also, then, is very easy for me. and an previous Whosebug question也许对我有很大帮助。

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

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

从那里我找到了 Swift-https://github.com/voyage11/Location: https://github.com/silento/Location 的端口。在 voyage11 的项目中,还链接了一个博客 post,其中对正在发生的事情进行了一些说明,还链接到第二个博客,该博客介绍了如何使用 "significant location changes" 重新启动定位服务。我目前正在尝试使用 "region location monitoring" 实现此功能,但不确定它是否有效。

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

它从一开始就不起作用,但是当我添加来自 的代码作为 stopUpdatingLocation() 和 startUpdatingLocation() 部件的替代时。

它真的比它应该的更复杂,我从 Android 使用的东西 - 但它就是这样。如果你正在为 Iphone5+ 开发,你也可以考虑这个 post(我现在无法测试它,因为我只有一个 iPhone 4S 并且模拟器不支持该功能) : .

我希望你有一些起点,我目前仍在测试我的解决方案,但就我现在所见,它似乎有效;)

P.S.: 我在某处读到一些关于休眠超过 5 分钟的后台任务被取消的信息——因为我只等了 30 秒我没有这个问题,但你可能有。但也许保持位置服务 运行 非常远的距离可以防止这种情况发生。

P.P.S.: 由于 Swift 是新的,你应该习惯阅读 Objective C-代码并尝试将其翻译成 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 项目,例如使用单个 window 并在 Main 中。故事板添加一个开关。然后你应该实现一个 ToggleActionChanged 事件来启用或禁用监听器,这取决于开关的新状态。我无法解释所有基础知识,您应该观看基础教程,我喜欢 https://www.youtube.com/playlist?list=PL_4rJ_acBNMHa_RGZigG2nQI3aL1kTa4r 并且特别使用第 7 个视频作为如何构建基本应用程序的示例。唯一可以比显示的更简单的方法是使用右键单击并从故事板拖动到代码视图,而不是手动实现一些方法。有个得心应手的小助手。

对于您的位置事件侦听器,您可以添加一个新的 swift class 并将其命名为例如LocationDelegate.swift。它使它更干净一点。我为此使用了单例模式,您可以查看如何执行此操作。或者您可以使用我在上面 post 编辑的 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

祝你好运!