9

Web サービスからスケジュールされたデータを取得するための複雑さに取り組んでいます。20 ~ 30 分ごとに (または手動で)、これを行うために WKRefreshBackgroundTask をスケジュールしています。

Apple が提案したように、OS がバックグラウンド経由でこのデータのフェッチを処理するようにしますNSURLSession

これは、必要なデータをダウンロードするために使用する関数です。

func scheduleURLSession()
{
    print("\nScheduling URL Session...")

    let backgroundSessionConfig:URLSessionConfiguration = URLSessionConfiguration.background(withIdentifier: NSUUID().uuidString)
    backgroundSessionConfig.sessionSendsLaunchEvents = true

    let backgroundSession = URLSession(configuration: backgroundSessionConfig)

    let downloadTask = backgroundSession.downloadTask(with: URL(string: "https://www.myserver.com/somedata")!)
    downloadTask.resume()
}

これについていくつかのこと:

  1. スケジュールすると呼び出されます。コンソールに print ステートメントが表示されます。
  2. Apple の例とほぼ同じです。
  3. URLは省略しました。同じ URL が iOS/watchOS アプリで正常に機能するため、問題はありません。

問題は、タスクを呼び出しresume()て、完了時にアプリを起動できるようにしているにもかかわらず、どちらも実行していないように見えることです。

完了すると、WKExtensionDelegate ハンドラーに戻ります。

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>)

としてWKURLSessionRefreshBackgroundTaskですが、そうではありません。

私のコードは、Apple のサンプル コードと同じで、別のセッションを作成しますが、WKURLSessionRefreshBackgroundTaskの識別子を介してセッションに再参加します。これは、ダウンロードされたデータを処理するためにデリゲートが設定される場所です。コードを確認してください:

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
    for task in backgroundTasks {
        switch task {

        case let backgroundTask as WKApplicationRefreshBackgroundTask:
            print("\nWatchKit - WKApplicationRefreshBackgroundTask")
            // self.updateComplicationDataArrivalTimes(backgroundTask)
            self.scheduleURLSession()
            backgroundTask.setTaskCompleted()

        case let snapshotTask as WKSnapshotRefreshBackgroundTask:
            // Snapshot tasks have a unique completion call, make sure to set your expiration date
            print("\nWatchKit - WKSnapshotRefreshBackgroundTask")
            snapshotTask.setTaskCompleted(restoredDefaultState: true, estimatedSnapshotExpiration: Date.distantFuture, userInfo: nil)

        case let connectivityTask as WKWatchConnectivityRefreshBackgroundTask:
            print("\nWatchKit - WKWatchConnectivityRefreshBackgroundTask")
            connectivityTask.setTaskCompleted()

        case let urlSessionTask as WKURLSessionRefreshBackgroundTask:
            print("\nWatchKit - WKURLSessionRefreshBackgroundTask")
            let backgroundConfigObject = URLSessionConfiguration.background(withIdentifier: urlSessionTask.sessionIdentifier)
            let backgroundSession = URLSession(configuration: backgroundConfigObject, delegate: self, delegateQueue: nil)

            print("Rejoining session ", backgroundSession)
            urlSessionTask.setTaskCompleted()

        default:
            // make sure to complete unhandled task types
            task.setTaskCompleted()
        }
    }
}

しかし、再び、それは二度と戻ってこないようです。コードがこのプロジェクトの Apple のサンプル コードと同じであるにもかかわらず、これが機能している理由を理解できないようです: WatchBackgroundRefresh: Using WKRefreshBackgroundTask to update WatchKit apps in the background

プロジェクトに欠けている設定はありますか? このコードはすべてExtensionDelegate、watchOS 3 の新しい に入れています。また、 と にも準拠しWKExtensionDelegateURLSessionDownloadDelegateいます。

事前にご協力いただきありがとうございます。

4

2 に答える 2