2016-07-27 4 views
0

とiOS版で長時間バックグラウンドタスクを実行する:ユーザーが長時間(約15分)CLBeaconRegionにまだ残っている場合私は次の操作を実行したいiBeacons

、私はなりたいですいくつかのコードを実行することができます。アプリがフォアグラウンドにある場合、この問題は簡単ですが、割り当てられた時間までバックグラウンドの時間を延長するのに問題があります。私は位置情報サービスを利用しているので、このような長いバックグラウンドタスクを実行することは許されるべきです。

didEnterRegiondidExitRegionの両方が、ユーザーの移動時にのみバックグラウンドで呼び出されます。時間に関するバックグラウンドタスクを実行できる場所固有のAPIはありません。

同じことを達成したいと思う他の類似の質問、例えばhereのすべてのスレッドが表示されます。しかし、別の方法を

(基本的に無効とbackgroundTimeRemainingが十分に小さいですが、このソリューションで私の最初の試みはうまくいかなかったときCLLocationManagerを有効にする必要がある)提案されたソリューションは、CLBeaconManagerのために働くだろうとは思えません限られた範囲でこれを行うことができます.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.") 
} 

私はあなたがextend beacon ranging in the backgroundにバックグラウンドスレッドを実行する技術を研究するとき、あなたのInfo.plistに位置バックグラウンドモードを置くことによって、無限のバックグラウンドで実行時間を得ることに気づきました。リンクのコードを見ると、バックグラウンドスレッドをどのように開始したかを確認できます。

+0

Info.plistでロケーションバックグラウンドモードが有効になっています。 'didEnterRegion'の' backgroundTimeRemaining'をチェックすると、それは無限であると言います。しかし、後で 'backgroundTimeRemaining'をチェックすると、それはまだ180秒からカウントダウンしていることがわかります。興味深い。 –

+0

その違いが私が範囲を広げていたのではないかと思いますか?それがうまくいくならば、15分のレンジングを行うことができ、15分が終わったら停止することができます。 – davidgyoung

+0

残念ながら私は結果を再現することができませんでした。 (私は15分間に合うと思っていません)Rangingは無限の「backgroundTimeRemaining」を約5秒間与えてから再びカウントダウンを開始しました。ロケーションバックグラウンドモードを有効にするだけで無限のバックグラウンド時間が得られると言っていますか?それは背景モードに関する多くの文献に反するようです。 –

関連する問題