You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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能力,包含后台获取和后台处理
  • 在提交后台请求后设置了断点

可行解决方向

  1. 缩短earliestBeginDate时间
    当前设置的24小时后触发,模拟器模拟后台任务时会忽略过久的未来任务。先把时间改短,比如Date().addingTimeInterval(60)(1分钟后),重新提交任务再尝试模拟。

  2. 强制触发任务提交
    调试状态下应用切换后台的时机可能有延迟,可在ContentView的onAppear里调用一次scheduleAppRefresh(),或者直接在调试控制台执行po scheduleAppRefresh()强制提交任务,再尝试模拟触发。

  3. 清理模拟器缓存
    模拟器缓存可能导致任务请求未正确持久化:

    • 卸载模拟器内的应用,重新编译安装
    • 或关闭模拟器后,删除~/Library/Developer/CoreSimulator/Devices/[对应设备ID]/data/Containers/Data/Application/[应用文件夹]下的内容
  4. 检查任务提交状态
    在调试控制台执行以下命令,确认任务是否真的提交成功:

    e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _dumpPendingTasks]
    

    如果输出列表里没有refreshEntries,说明提交过程存在隐藏错误,仔细查看submit方法catch块的打印信息。

  5. 避免重复提交冲突
    提交新任务前先取消同标识符的已有任务:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:40:35