I've configured background task in plist.info with an identifier updateCountry and Background Modes fetch and processing as capability.
I have locationManager with these functions:
func registerBackgroundTask() {
BGTaskScheduler.shared.register(forTaskWithIdentifier: "updateCountry", using: nil) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
print("register backgoundtask")
}
}
func handleAppRefresh(task: BGAppRefreshTask) {
print("registrando pais")
scheduleBackgroundTask()
DispatchQueue.global().async {
self.detectCountry()
task.setTaskCompleted(success: true)
print("Background task completed.")
}
}
func scheduleBackgroundTask() {
print("request updateCountry")
let request = BGAppRefreshTaskRequest(identifier: "updateCountry")
request.earliestBeginDate = Date(timeIntervalSinceNow: 60 * 1) // 1 minute
do {
try BGTaskScheduler.shared.submit(request)
print("Background task scheduled successfully.")
} catch {
print("Unable to submit task: \(error)")
}
}
I'm calling this functions in this way where handleAppRefresh calls a class function to detect the country where you are and add to an array... Everything seems fine, and I have no error, but nothing is printed in the console and doesn't work or update country list...
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(container)
.backgroundTask(.appRefresh("updateCountry")) {
await locationManager.registerBackgroundTask()
}
}
Anyone knows how to fix it or where is the problem?
is the SwiftUI version of
Change your code to something like
And don't forget to call
scheduleBackgroundTask()somewhere else for the first time.When in development mode you can trigger a background task on demand by placing a breakpoint after
submitThen when you run the app and the breakpoint gets triggered type in the debugger.
with
TASK_IDENTIFIERbeing "updateCountry" in your case.https://developer.apple.com/documentation/backgroundtasks/starting_and_terminating_tasks_during_development
But something to be aware... Background Tasks won't run every minute. You can suggest that but Apple will decide when to run, dont expect anything more often than every hour.
For something like location you are better off using
LocationManager.https://developer.apple.com/documentation/corelocation/handling_location_updates_in_the_background#
And since you are monitoring "Country" "Significant Change In Location" might be the right solution.
https://developer.apple.com/documentation/corelocation/cllocationmanager/1423531-startmonitoringsignificantlocati