一尘不染

iOS-运行后台任务以使用Swift更新用户位置

swift

我是这里的新用户,但是我已经使用stackoverflow很多次了:)…我是android开发人员,但是现在我正在使用swift在ios应用程序中工作。我对使用xcode完全陌生,也许我的问题在很多方面都很简单…太好了,我真的需要帮助。我正在尝试实现一个背景任务,该任务每十分钟更新一次用户位置。我需要获取经纬度数据,并将此信息发送到API网络服务。我一直在介绍backgroud文档,所有文档以及有关用户位置服务的所有文档。有很多信息,很漂亮的信息,但是,也许我非常喜欢android信息,也有很多信息,但是对于我来说,也有很多简单的示例。也许有很多帮助。

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


阅读 353

收藏
2020-07-07

共1个答案

一尘不染

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

从那里我找到了一个https://github.com/voyage11/Location的Swift-Port:https :
//github.com/silento/Location。在voyage11的项目中,还链接了一个博客文章,该博客文章澄清了正在发生的事情,并且还链接到了第二篇文章,该文章讲述了如何使用“重大位置更改”重新启动位置服务。我目前正在尝试通过“区域位置监控”来实现此功能,但不确定是否可以正常使用。

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

它从一开始就不起作用,但是当我从添加代码以替代stopUpdatingLocation()和startUpdatingLocation()-部分时。

它确实比它应该的复杂,以及我在Android中使用的东西-确实如此。如果您正在为Iphone5 +开发,也可以考虑这篇文章(由于我只有iPhone4S,并且模拟器中不支持该功能,因此我目前无法对其进行测试)。

希望您有一些起点,我目前仍在测试我的解决方案,但是据我所知,它似乎可以正常工作;)

PS:我在某处读到一些有关后台任务的信息,这些任务休眠5分钟以上被取消-
因为我只等待30秒,所以我没有这个问题,但是您可能有。但是也许保持位置服务远距离运行可以防止这种情况发生。

PPS:随着Swift的出现,您应该习惯于阅读Objective C代码并将其转换为Swift。这通常是找到好的教程的唯一方法。

还有一件事-对于iOS8,您需要以下内容:

if (self.locationManager.respondsToSelector(Selector("requestWhenInUseAuthorization"))) {
            // on iOS8+, we need to request the location authorization ourselves -.-

            self.locationManager.requestAlwaysAuthorization()
        }

并且不要忘记在您的Info.plist中添加“
NSLocationAlwaysUsageDescription”,以及在项目功能中允许后台位置更新。很抱歉造成这样的混乱,但这是一个非常复杂的话题;)

编辑
:关于您的第一个评论:您应该创建一个Swift项目,例如,在单个窗口中并在Main中。情节提要添加一个开关。然后,您应该实现ToggleActionChanged-
event来启用或禁用侦听器,具体取决于开关的新状态。我无法解释所有基础知识,您应该观看基础教程,我喜欢https://www.youtube.com/playlist?list=PL_4rJ_acBNMHa_RGZigG2nQI3aL1kTa4r,尤其是使用第7个视频作为如何构建基本应用程序的示例。唯一比显示容易的方法是使用右键单击从情节提要板到代码视图的方式,而不是手动实现某些方法。有一个方便的助手。

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

祝好运!

2020-07-07