web-dev-qa-db-ja.com

beginBackgroundTaskを開始できませんSwift 3

申し訳ありませんが、行き詰まっていますが、バックグラウンドタスクを開始しようとしています(XCode8、Swift 3)

ここからの例:https://developer.Apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/ BackgroundExecution.html#// Apple_ref/doc/uid/TP40007072-CH4-SW

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
    })
}

アプリに「タスクが開始されました」というメッセージが表示されたことはありません。私は何が間違っているのですか?

7
Alex

有効期限ハンドラブロックは、バックグラウンドで一定期間(通常は5分程度)後に呼び出されます。これは、バックグラウンドタスクの完了に時間がかかる場合に備えて、クリーンアップロジックを作成するために使用することを目的としています。

コードに問題はありません。バックグラウンドタスクが期限切れになるまでバックグラウンドで待つ必要があります。

2
Puneet Sharma

バックグラウンドタスクの使用はすべて間違っています。次のようになります。

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を使用する必要があることにも注意してください。

7
rmaddy