Hi Kevin, thanks for the quick response/suggestion!
We tried submitting a replacement task with .queue when Camera expired the running task, but encountered a foreground-check error.
Device: iPhone14,3, iOS 26.6.1 (23G83), externally powered.
Our sequence was:
While our app was foregrounded, register a unique replacement task identifier and create its request with strategy = .queue.
Start the original task, background our app, then open Camera.
In the original task’s expiration handler, submit the prepared replacement before calling setTaskCompleted on the original task.
Close Camera normally after 90 seconds and observe for 15 minutes without reopening our app.
In two valid trials, BGTaskScheduler.shared.submit(...) returned without throwing, but the replacement’s launch handler never ran. Our app process remained alive. Ordinary processing/refresh tasks ran separately.
In the second trial, dasd logged this error for the exact replacement identifier at 2026-10-29 16:19:50.896323 UTC:
bgContinuedProcessing-io.korom.krm.extended-hosting.A6008727-F8B5-423C-8C30-5E68965F03AD: Foregrounded apps (<private>) don't include expected identifier: <private>
This looks related to the missing-error behavior discussed in thread 807370. We therefore aren’t treating the successful API return as proof that iOS actually admitted the replacement to its queue.
Is queued resubmission from an expiration handler supported while the app is backgrounded on this iOS version? If so, what request/submission sequence avoids this foreground check?
These tests used our ongoing-hosting app; we still haven’t established a standalone finite-work reproduction.
Topic:
App & System Services
SubTopic:
Processes & Concurrency
Tags: