2016-07-27 91 views
0

我要做到以下几点:运行的后台任务iOS中长时间与iBeacons

如果用户仍然还处于一个CLBeaconRegion的时间(大约15分钟)长一段时间,我想能够执行一段代码。如果应用程序处于前台,此问题很简单,但我无法将后台时间延长到分配的时间。因为我正在使用定位服务,所以应该允许运行如此长的后台任务。

仅在用户移动时才在后台调用didEnterRegiondidExitRegion。似乎没有任何特定于位置的API允许您根据时间进行后台任务。

确实出现了其他想要达到同样效果的类似问题,例如提到的所有线程here。然而,这似乎并没有使提出的解决方案将用于CLBeaconManager工作(这主要涉及禁用和启用CLLocationManagerbackgroundTimeRemaining足够小,但我的这个解决方案最初尝试没有成功)

另一种方式我可以在有限的范围内做到这一点,即在15分钟内安排通知,并取消didExitRegion中的通知。

但是,上面的解决方案感觉哈克或不足。有没有一种“优雅”的方式来实现我想要的?

回答

0

只要您在Info.plist中请求位置背景模式,您的backgroundTimeRemaining应该返回一个非常大的值,实质上表示无限的后台运行时间。这应该允许你在你的didEnterRegion方法中放入一块这样的代码,并让它消失。

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(15*60 * Double(NSEC_PER_SEC))) 
dispatch_after(delayTime, dispatch_get_main_queue()) { 
    print("It's been 15 minutes since we entered the beacon region.") 
} 

我注意到,你得到无限的背景下通过把位置后台模式在你的Info.plist研究运行的后台线程extend beacon ranging in the background的技术时的运行时间。你可以看看链接中的代码,看看我是如何开始我的后台线程。

+0

我在Info.plist中启用了位置背景模式。检查'didEnterRegion'中的'backgroundTimeRemaining'确实表明它是无限的。但是,一段时间后检查'backgroundTimeRemaining'表明它仍然从180秒倒计时。 –

+0

有趣。我想知道是否有区别,我有范围打开?如果这样做,也许你可以做15分钟,15分钟结束后停止。 – davidgyoung

+0

不幸的是我无法复制你的结果。 (无论如何,我不认为我会在15分钟内离开范围)Ranging给了无限的'backgroundTimeRemaining'大约5秒钟,然后它又开始倒计时了。你是说只是启用位置背景模式会给无限的背景时间?这似乎与许多关于背景模式的文献相反。 –