2016-07-27 106 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秒鐘,然後它又開始倒計時了。你是說只是啓用位置背景模式會給無限的背景時間?這似乎與許多關於背景模式的文獻相反。 –