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()
}
これについていくつかのこと:
- スケジュールすると呼び出されます。コンソールに print ステートメントが表示されます。
- Apple の例とほぼ同じです。
- 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 の新しい に入れています。また、 と にも準拠しWKExtensionDelegate
てURLSessionDownloadDelegate
います。
事前にご協力いただきありがとうございます。