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

我是新用户在这里,但我已经使用了很多次stackoverflow:)…我是Android开发人员,但现在我正在使用Swift的iOS应用程序工作。 我是全新的使用xcode,也许我的问题很简单,很多…很好,我真的需要帮助。 我试图实现一个背景任务,每十分钟更新一次用户位置。 我需要得到经纬度和长时间的数据,然后将这些信息发送到API Web服务。 我一直在search背景文档 ,所有文档以及有关用户位置服务的所有文档。 有很多的信息,相当多的信息,但是,也许我很喜欢android信息,也有很多信息,但是很多简单的例子对我来说也是很容易的。 和以前的stackoverflow问题可能helpme很多。

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

我目前正在做和我第一个iOS项目一样的东西 – 帮助我的是: 定期iOS背景位置更新

从那里我发现一个https://github.com/voyage11/Location的Swift-Port: https : //github.com/silento/Location 。 在远航项目11中,还有一个博客post说明了一些正在发生的事情,这也与第二篇有关,它告诉我们如何使用“重大的位置变化”重新启动位置服务。 我目前正在试图通过“地区位置监测”来实现这一点,但不知道它是否会工作。

哦,我将触发新的后台任务的代码从didUpdateLocation-part移出到了restartLocationUpdates-part – 所以你可以确定你的任务是重新启动的,即使你没有及时获得一个位置。

它从一开始就没有工作,但是当我从https://stackoverflow.com/a/19085518/3085985添加代码来替代stopUpdatingLocation()和startUpdatingLocation() – 部分时。

这实际上比我应该使用的还要复杂得多 – 但事实却是如此。 如果你正在开发Iphone5 +,你也可以考虑这个职位(我现在无法testing,因为我只有一个Iphone 4S的function不支持在模拟器中): https : //stackoverflow.com/a/24666487/ 3085985 。

我希望你有一些出发点,目前我仍然在testing我的解决scheme,但是现在看起来似乎仍然有效;)

PS:我在某处读了一些关于睡眠5分钟以上的背景任务被取消 – 因为我只等了30秒我没有这个问题,但你可能有。 但也许保持位置服务运行一个非常高的距离防止这种情况发生。

PPS:由于Swift是新的,你应该习惯于阅读Objective C-Code并试图把它转换成Swift。 通常是find好的教程的唯一途径。

还有一件事 – 对于iOS8,你需要这样的东西:

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

不要忘记将“NSLocationAlwaysUsageDescription”添加到Info.plist中,并允许在项目function中更新后台位置。 对不起,这个文本混乱,但它是一个非常复杂的话题;)

/编辑:关于你的第一个评论:你应该创build一个Swift项目,例如一个窗口,并在Main.storyboard添加一个开关。 然后,根据交换机的新状态,您应该实现启用或禁用监听器的ToggleActionChanged事件。 我不能解释所有的基础知识,你应该看一个基本的教程,我喜欢https://www.youtube.com/playlist?list=PL_4rJ_acBNMHa_RGZigG2nQI3aL1kTa4r ,特别是第7video作为一个例子如何build立一个基本的应用程序。 唯一可以做得比显示更简单的是使用右键单击从故事板拖动到代码视图,而不是手动实现一些方法。 有一个方便的助手。

对于您的位置事件侦听器,您可以添加一个新的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方法:

 let userDefaults = NSUserDefaults.standardUserDefaults() var trackingActive = userDefaults.boolForKey("ODLTrackingActive") toggleTrackingSwitch.setOn(trackingActive, animated: false) // reactivate location tracking if necessary 

祝你好运!