申し訳ありませんが、行き詰まっていますが、バックグラウンドタスクを開始しようとしています(XCode8、Swift 3)
AppDelegate.Swift:
func applicationDidEnterBackground(_ application: UIApplication) {
var bgTask: UIBackgroundTaskIdentifier = 0;
bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in
print("The task has started")
application.endBackgroundTask(bgTask)
bgTask = UIBackgroundTaskInvalid
})
}
アプリに「タスクが開始されました」というメッセージが表示されたことはありません。私は何が間違っているのですか?
有効期限ハンドラブロックは、バックグラウンドで一定期間(通常は5分程度)後に呼び出されます。これは、バックグラウンドタスクの完了に時間がかかる場合に備えて、クリーンアップロジックを作成するために使用することを目的としています。
コードに問題はありません。バックグラウンドタスクが期限切れになるまでバックグラウンドで待つ必要があります。
バックグラウンドタスクの使用はすべて間違っています。次のようになります。
func applicationDidEnterBackground(_ application: UIApplication) {
var finished = false
var bgTask: UIBackgroundTaskIdentifier = 0;
bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in
// Time is up.
if bgTask != UIBackgroundTaskInvalid {
// Do something to stop our background task or the app will be killed
finished = true
}
})
// Perform your background task here
print("The task has started")
while !finished {
print("Not finished")
// when done, set finished to true
// If that doesn't happen in time, the expiration handler will do it for us
}
// Indicate that it is complete
application.endBackgroundTask(bgTask)
bgTask = UIBackgroundTaskInvalid
}
また、アプリがバックグラウンドになった場合でも、短時間実行し続けたいクラスのコードの周囲にはbeginBackgroundTask/endBackgroundTask
を使用する必要があることにも注意してください。