【问题标题】:IOS - Running background task for update user location using swiftIOS - 使用 swift 运行后台任务以更新用户位置
【发布时间】:2015-04-14 18:05:57
【问题描述】:

我是这里的新用户,但我已经多次使用 stackoverflow :)... 我是 android 开发人员,但现在我正在使用 swift 在 ios 应用程序中工作。我是使用 xcode 的新手,也许我的问题非常简单……太好了,我真的需要帮助。 我正在尝试实现每十分钟更新一次用户位置的背景任务。我需要获取经纬度数据,然后将此信息发送到 API Web 服务。我一直在评价backgroud docs、所有文档以及关于user location services 的所有文档。有很多信息,很漂亮的信息,但是,也许我对 android 信息很习惯,也有很多信息,但是也有很多简单的例子,那么,对我来说很容易。和previous stackoverflow question也许对我有很大帮助。

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

【问题讨论】:

    标签: ios swift core-location


    【解决方案1】:

    我目前正在做与我的第一个 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
    

    祝你好运!

    【讨论】:

    • 我应该在哪里写代码?只需创建一个 file.swift 文件并将所有内容都放入其中?...非常感谢。我总是找到代码,但从不谈论结构:)
    • 只是好奇:对于iOS 8,不是在应用程序不在前台时进行GPS跟踪的解决方案,只需在“项目设置>功能>后台模式”中检查“位置更新” ?
    猜你喜欢
    • 2015-11-26
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多