iOS Periodic Task Not Triggering callbackDispatcher on Real Device but Works on Simulator
App does not trigger the callbackDispatcher method on a real iOS device. However, the task works as expected on the iOS simulator.
Steps to Reproduce: 1. Schedule the task with a repeat interval (e.g., 15 min). 2.Deploy the app to a real iOS device and wait for the periodic task to trigger. 3.The task not trigger callbackDispatcher on the real device.
Test Methods: - Waited more than an hour to see if the task triggers on the real device. - Used Xcode's Debug -> Simulate background fetch to manually trigger the task.
Results: - The task triggers and executes callbackDispatcher as expected on the iOS simulator. - The task does not trigger at all on the real device, even after waiting or simulating a background fetch in Xcode.
Expected Behavior - The periodic task should trigger the callbackDispatcher method both on the iOS simulator and real devices.
Flutter version: 3.24.3
WorkManager version:
git: url: https://github.com/fluttercommunity/flutter_workmanager.git
ref: b783000
iOS version: 17.5.1
Device: 11 Pro Max
did this work, ?
@arun-gautham Yes, it's work. I solved my problem with restarting the device
I did exactly what @rapkatt showed in the first comment and the periodic task is not triggered at all ...
@rapkatt does it still work for you with the latest iOS? @arun-gautham did you manage to make it work for your part?
Please read apples documentation about background tasks. There is no BG-scheduler in iOS which safely starts your preferred update task . It's an normal apple behavior. https://developer.apple.com/documentation/uikit/using-background-tasks-to-update-your-app
Yes I got it to work perfectly fine
Yes I got it to work perfectly fine
did you get callbackDispatcher to work with Workmanager().registerPeriodicTask ? how?
Note the key "offcloud-file-upload" , update it as per your app
info plist:
<key>UIBackgroundModes</key>
<array>
<string>processing</string>
</array>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>offcloud-file-upload</string>
</array>
Appdeletegate.swift override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
WorkmanagerPlugin.setPluginRegistrantCallback {registry in
GeneratedPluginRegistrant.register(with: registry)
}
**WorkmanagerPlugin.registerBGProcessingTask(withIdentifier: "offcloud-file-upload")
return super.application(application, didFinishLaunchingWithOptions: launchOptions)**
}
flutter
Workmanager().registerOneOffTask(
"offcloud-file-upload",
"offcloud-file-upload",
constraints: Constraints(
// connected or metered mark the task as requiring internet
networkType: NetworkType.connected,
// require suffucinat power
requiresBatteryNotLow: true,
),
@arun-gautham
Your example is OneOffTask, not PeriodicTask.
Are you sure that you did test using "PeriodicTask"?
Actually no , I did a cron that kicks off a one off task. and as this did serve my purpose, How ever I can give the periodic task a try as well in couple of days.
@rapkatt and @arun-gautham, are you both bots or something? 😄
@rapkatt: Honestly, I tried restarting five different devices with exact same setup, and it still didn't work, even on the emulators and after multiple restarts.
@arun-gautham: You keep mentioning it works without pointing out that you are referring to OneOffTask, but you're missing the crucial point that this entire discussion is based on Periodic Tasks. This is very misleading.
Yes I got it to work perfectly fine
Note the key "offcloud-file-upload" , update it as per your app
info plist:
<key>UIBackgroundModes</key> <array> <string>processing</string> </array> <key>BGTaskSchedulerPermittedIdentifiers</key> <array> <string>offcloud-file-upload</string> </array>Appdeletegate.swift override func application(
_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { GeneratedPluginRegistrant.register(with: self) WorkmanagerPlugin.setPluginRegistrantCallback {registry in GeneratedPluginRegistrant.register(with: registry) } **WorkmanagerPlugin.registerBGProcessingTask(withIdentifier: "offcloud-file-upload") return super.application(application, didFinishLaunchingWithOptions: launchOptions)** }flutter
Workmanager().registerOneOffTask( "offcloud-file-upload", "offcloud-file-upload", constraints: Constraints( // connected or metered mark the task as requiring internet networkType: NetworkType.connected, // require suffucinat power requiresBatteryNotLow: true, ),
@arun-gautham Yes, it's work. I solved my problem with restarting the device
@jawad111
I think, he did test using "cron" and "workmanager" as mentioned. (cron is for a repeat, and workmanager is for a background execution)
But, the "cron" may not work in background: https://github.com/agilord/cron/issues/48#issue-2000358497.
Hi @jawad111 , I hope you're doing well. I’ve been exploring ways to run background tasks on iOS but haven’t had success so far despite trying several methods. Could you kindly provide some guidance or suggest any alternative approaches? I’d really appreciate your help.
Thanks in advance!
For me it is not working even on simulator, the oneOffTask runs but the periodic ones are not.
Hi @jawad111 , I hope you're doing well. I’ve been exploring ways to run background tasks on iOS but haven’t had success so far despite trying several methods. Could you kindly provide some guidance or suggest any alternative approaches? I’d really appreciate your help.
Thanks in advance!
Hi @Luqmanasif6
I apologize for the delayed response. Please take a look at this Gem article, which includes working code. It provides more in-depth information than Apple’s documentation.
Best practice: iOS background processing - Background App Refresh Task
This still seems to be a problem. Either the documentation does not clearly explain what should be done to trigger this background fetch or the functionality is broken. Can we please get some assistance on this?
After a lot of circus , i used the register-task to do the trick. Now my job runs even when screen is locked
This is what i dis as the schedule task didnt run
I use the background task to upload files one at a time. When app starts it runs a task , if files in queue this tSk schedules a next task. This happens till all files are uploaded. Id there are no files , nothing is scheduled. If i add few more files to queue . The task is scheduled during the adding files to queue call .