我想实现长时间运行的后台计时器,它会定期将用户的位置发送给服务器。
为此,我为location
设置了UIBackgroundModes
模式,并在应用程序转到后台时调用beginBackgroundTaskWithExpirationHandler
。
对于CLLocationManager
,我使用startUpdatingLocation
方法(不想使用重大更改,因为我需要高精度位置)。
但是在应用程序进入后台后大约26分钟,它停止向服务器发送位置。但该应用程序没有崩溃,所以在我将应用程序带到前台后,它可以恢复其计时器。
26分钟来自实验,iOS 6.1,iPhone 5。
以下是一些问题,
我无法理解为什么它在26分钟而不是10分钟后暂停,这被称为后台任务的时间限制。
在16分钟之前,backgroundTimeRemaining
方法返回double max value。但是在16分钟后,它从600
开始减少,因此它会在10分钟后暂停后台任务。
我已经尝试在过期处理程序中调用beginBackgroundTaskWithExpirationHandler
,但没有用。
如果有人对这个问题有所了解,将不胜感激。
答案 0 :(得分:6)
https://github.com/voyage11/Location
使用此代码。您可以设置要调用它的时间间隔。我已经尝试了很多代码,但我发现这是最准确和最少的电池问题。这对于后台定位服务也很棒。 :)
答案 1 :(得分:-1)
如果您已成功设置UIBackgroundModes
,则应用程序可以在您移动时在后台运行很长时间。但是,如果您停止移动超过10分钟(可能更多),该应用程序将被系统暂停。如果位置更新,您的应用程序将处于唤醒状态,但此唤醒时间将非常短,因此您必须进行校准
处理位置更新的beginBackgroundTaskWithExpirationHandler
方法。