How do I schedule a background task in my SwiftUI-based Watch app? When I call the following method:
WKApplication.shared() .scheduleBackgroundRefresh( withPreferredDate: Date.init(timeIntervalSinceNow: 15.0 * 60.0), userInfo: "MY_FIRST_UPDATE" as NSSecureCoding & NSObjectProtocol) { error in if error != nil { // Handle the scheduling error. fatalError("*** An error occurred while scheduling the background refresh task. ***") } print("*** Scheduled! ***") }
the app crashes:
2023-06-21 16:04:48.730140+0900 MyWatchApp[416:109084] [default] -[WKApplication scheduleBackgroundRefreshWithPreferredDate:userInfo:scheduledCompletion:]:131: Critical failure. Simulating crash: Condition failed:"NO". -[WKApplication scheduleBackgroundRefreshWithPreferredDate:userInfo:scheduledCompletion:] requires that your WKApplicationDelegate (null) implement handleBackgroundTasks:
My app is defined as follows:
@main struct MyWatchApp: App { @WKExtensionDelegateAdaptor(ExtensionDelegate.self) var delegate @StateObject var viewModel = MainViewModel.shared var body: some Scene { WindowGroup { ContentView() ... // bunch of stuff here } .backgroundTask(.appRefresh) { context in // I want to perform background task here await viewModel.handleBackgroundRefresh() } } } class ExtensionDelegate: NSObject, WKExtensionDelegate { func applicationDidFinishLaunching() { ... } func applicationDidBecomeActive() { ... } func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) { // just in case, though this is not helping... } }
I'm just following your instructions here:
https://developer.apple.com/documentation/watchkit/background_execution/using_background_tasks
Do I need to put some entry in my Info.plist? Or any capability I need to add? (I've added "Background Modes" with "Remote notifications" checked because I'm using CloudKit)
Any help is very much appreciated!