web-dev-qa-db-ja.com

iOS 13-BGTaskSchedulerの使用が常に機能しない

問題:アプリがバックグラウンドに移行してから5秒後に単純な関数を実行したいと思います。

IOS 13をサポートするには BGTaskScheduler を実装する必要がありました。BackgroundTaskの古い実装は、古いiOSバージョンで動作します。

リクエストに応じて、バックグラウンドモードを追加しました(この関数で小さなBLE操作を実行するため、BLEアクセサリがチェックされています)。

enter image description here

次に、ドキュメントに従ってInfo.plistを準備しました(Identifier is fakeちょうどStackOverflowの質問のために):

enter image description here

didFinishLaunchingWithOptionsが終了する前に、BackgroundTaskを登録します。

if #available(iOS 13.0, *) {
        BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.example.MyID", using: .global()) { (task) in
            print("My backgroundTask is executed NOW!")
            task.expirationHandler = {
                task.setTaskCompleted(success: true)
            }
        }
    }

アプリがdidEnterBackgroundメソッドを実行すると、BackgroundTaskRequestが送信されます。

if #available(iOS 13.0, *) {
            do {
                let request = BGAppRefreshTaskRequest(identifier: "com.example.MyID")
                request.earliestBeginDate = Calendar.current.date(byAdding: .second, value: 5, to: Date())
                try BGTaskScheduler.shared.submit(request)

                print("Submitted task request")
            } catch {
                print("Failed to submit BGTask")
            }
        } 

ここでの問題は、それが非常に一貫していないことです。 Appleタスクが指定された日付より前に実行されないことを保証しますが、正確な時間に実行されることを保証しません(私は少し遅れて大丈夫です)。ただし、私はアプリを実行しましたが、(earliestBeginDateを使用して)タスクリクエストに遅延を指定したかどうかに関係なく、100%動作しませんでした。 26秒かかりましたが、3回目neverがクロージャに到着しました。

BackgroundTaskを間違った方法で実装していますか?私はインターネット上でいくつかの回答を検索しましたが、この問題を抱えている人は見つかりませんでした。

6
Bar Malka

Badhanganeshが言ったように、システムがそうすることを決定したときだけタスクが実行されるようです。 Appleは WWWDC 2019、セッション#707)の間にそれを言った

2
Bar Malka