フォアグラウンドとバックグラウンドの両方にあるときに、場所の更新を使用するアプリがあります。 CoreLocationフレームワークを使用して、アプリケーションを実装して、thisコードを参照として5分ごとに位置の更新をサーバーに送信しました。iOSなぜシステムがバックラウンドの場所を使用してアプリを殺すのですか
これはフォアグラウンドでうまく動作しますが、アプリがバックグラウンドになると、30分から1時間後にOSによって強制終了されます。私は、バックグラウンドでさえも、少なくとも8時間更新を取得したい。
また、アプリは1時間あたり約10%のバッテリーを使用しています。これはバックグラウンドで殺されているアプリに関連していますか?もしそうなら、どのようにしてバッテリーの問題を解決できますか?それ以外の場合は、問題が何であるか教えてください。私は次の関数を使用してバックグラウンドタスクのために
Exception Type: 00000020
Exception Codes: 0x000000008badf00d
Exception Note: SIMULATED (this is NOT a crash)
Highlighted by Thread: 2
Application Specific Information:
<BKNewProcess: 0x17e74840; com.app.app; pid: 560; hostpid: -1> has active assertions beyond permitted time:
{(
<BKProcessAssertion: 0x17d78740> id: 560-C9E81E97-90D9-4F95-871E-3DC53372F302 name: Called by UIKit, from <redacted> process: <BKNewProcess: 0x17e74840; com.app.example; pid: 560; hostpid: -1> permittedBackgroundDuration: 180.000000 reason: finishTask owner pid:560 preventSuspend preventIdleSleep preventSuspendOnSleep ,
<BKProcessAssertion: 0x17e6a870> id: 560-BD7B29FC-DABC-42FF-AF17-B277BDB1C59D name: Called by UIKit, from <redacted> process: <BKNewProcess: 0x17e74840; com.app.example; pid: 560; hostpid: -1> permittedBackgroundDuration: 180.000000 reason: finishTask owner pid:560 preventSuspend preventIdleSleep preventSuspendOnSleep
)}
:
以下は、デバイスのクラッシュログで
func backgroundTask(){
var application=UIApplication.sharedApplication()
var background_task: UIBackgroundTaskIdentifier?
background_task = application.beginBackgroundTaskWithExpirationHandler({() -> Void in
application.endBackgroundTask(background_task!)
background_task = UIBackgroundTaskInvalid
})
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {() -> Void in
//run the app without startUpdatingLocation. backgroundTimeRemaining decremented from 600.00
self.locationManager.startUpdatingLocation()
while (true) {
//backgroundTimeRemaining time does not go down.
print("Background time Remaining: \(UIApplication.sharedApplication().backgroundTimeRemaining)")
NSThread.sleepForTimeInterval(1)
break
//wait for 1 sec
}
application.endBackgroundTask(background_task!)
background_task = UIBackgroundTaskInvalid
})
}
私は質問を更新しました。クラッシュログを持つ。 – Poonam
8badf00dは、「アプリケーションがシステムイベントを起動、終了、または応答するのに時間がかかりすぎた」と知られています。 私はスレッド2のログインから、何かがメインスレッドで実行するには時間がかかりすぎることを理解しています。 –
また、アプリケーションがバックグラウンドで常に実行されている場合は、バックグラウンドモードを使用することを検討してください。バックグラウンドで長くしてください。 –