iOS 16 BGTaskScheduler报错:无已调度的指定标识符任务请求
iOS BackgroundTask 调度报错:No task request with identifier <decode: missing data> has been scheduled
我尝试为应用调度BackgroundTask刷新数据库,但通过Xcode触发后台任务时持续报错。执行以下调试命令:
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"refreshEntries"]
收到错误提示:
No task request with identifier <decode: missing data> has been scheduled
我的代码如下:
import BackgroundTasks @main struct ExpenseTrackerApp: SwiftUI.App { @Environment(\.scenePhase) private var phase var body: some Scene { WindowGroup { ContentView() } // background task scheduler .onChange(of: phase) { newPhase in switch newPhase { case .background: scheduleAppRefresh() default: break } } .backgroundTask(.appRefresh("refreshEntries")) { await refreshRecurringEntries() } } // Backgroud task func scheduleAppRefresh() { let request = BGAppRefreshTaskRequest(identifier: "refreshEntries") request.earliestBeginDate = .now.addingTimeInterval(24 * 3600) do { try BGTaskScheduler.shared.submit(request) } catch { print("Could not schedule task \(error)") } print("Background task submitted") // breakpoint goes here } func refreshRecurringEntries() async { // code that refreshes database } }
我已经尝试了以下操作但问题未解决:
- info.plist中已配置"Permitted background task scheduler identifiers"并添加"refreshEntries"
- 已添加Background modes能力,包含后台获取和后台处理
- 在提交后台请求后设置了断点
可行解决方向
缩短
earliestBeginDate时间
当前设置的24小时后触发,模拟器模拟后台任务时会忽略过久的未来任务。先把时间改短,比如Date().addingTimeInterval(60)(1分钟后),重新提交任务再尝试模拟。强制触发任务提交
调试状态下应用切换后台的时机可能有延迟,可在ContentView的onAppear里调用一次scheduleAppRefresh(),或者直接在调试控制台执行po scheduleAppRefresh()强制提交任务,再尝试模拟触发。清理模拟器缓存
模拟器缓存可能导致任务请求未正确持久化:- 卸载模拟器内的应用,重新编译安装
- 或关闭模拟器后,删除
~/Library/Developer/CoreSimulator/Devices/[对应设备ID]/data/Containers/Data/Application/[应用文件夹]下的内容
检查任务提交状态
在调试控制台执行以下命令,确认任务是否真的提交成功:e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _dumpPendingTasks]如果输出列表里没有
refreshEntries,说明提交过程存在隐藏错误,仔细查看submit方法catch块的打印信息。避免重复提交冲突
提交新任务前先取消同标识符的已有任务:func scheduleAppRefresh() { BGTaskScheduler.shared.cancelTaskRequest(withIdentifier: "refreshEntries") let request = BGAppRefreshTaskRequest(identifier: "refreshEntries") request.earliestBeginDate = .now.addingTimeInterval(60) do { try BGTaskScheduler.shared.submit(request) } catch { print("Could not schedule task \(error)") } print("Background task submitted") }
内容的提问来源于stack exchange,提问作者patrick menendez
相关产品推荐
相关产品推荐

