尝试使用 BGAppRefreshTask 并收到错误没有安排带有标识符 <解码:丢失数据> 的任务请求

Con*_*ous 12 xcode ios swift

我不断收到错误消息

\n
\n

No task request with identifier <decode: missing data> has been scheduled

\n
\n

在我的调试器输出中,所以我决定尝试运行 Apple 提供的示例代码并得到了相同的错误。我已经尝试了多台计算机和 Xcode 版本、来自不同来源的多个示例项目,但没有任何效果。

\n

我的 AppDelegate.swift 文件:

\n
import UIKit\nimport Firebase\nimport BackgroundTasks\n\n@main\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n    \n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n        \n        FirebaseApp.configure()\n                \n        BGTaskScheduler.shared.register(forTaskWithIdentifier: \xe2\x80\x9credacted.identifier\xe2\x80\x9d, using: nil) { task in\n            self.handleAppRefresh(task: task as! BGAppRefreshTask)\n        }\n        \n        return true\n    }\n    \n    func applicationDidEnterBackground(_ application: UIApplication) {\n        BGTaskScheduler.shared.cancelAllTaskRequests()\n        scheduleAppRefresh()\n    }\n    \n     func scheduleAppRefresh() {\n        let request = BGAppRefreshTaskRequest(identifier: "redacted.identifier")\n        \n        request.earliestBeginDate = Date(timeIntervalSinceNow: 60)\n        do {\n            try BGTaskScheduler.shared.submit(request)\n        } catch {\n            print("Could not schedule app refresh: \\(error)")\n        }\n    }\n    \n    func handleAppRefresh(task: BGAppRefreshTask) {\n        scheduleAppRefresh()\n        \n        let db = Firestore.firestore()\n        \n        db.collection("devices").document(UIDevice.current.identifierForVendor!.uuidString).setData([\n            "batteryLevel": UIDevice.current.batteryLevel*100\n            ]) { err in\n            if let err = err {\n                print("Error writing document: \\(err)")\n            } else {\n                print("success")\n                task.setTaskCompleted(success: true)\n            }\n        }\n        \n        task.expirationHandler = {\n            task.setTaskCompleted(success: false)\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

我正在通过运行测试后台获取

\n
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"redacted.identifier"]\n
Run Code Online (Sandbox Code Playgroud)\n

在Xcode控制台中,之后出现上述错误。

\n

控制台输出:

\n
Simulating launch for task with identifier redacted.identifier\n\nNo task request with identifier <decode: missing data> has been scheduled\n
Run Code Online (Sandbox Code Playgroud)\n

Rob*_*Rob 11

几个潜在的问题:

\n
    \n
  • 在模拟器上测试时会发生这种情况。使用物理设备。

    \n
  • \n
  • 确保您Info.plist有一个 \xe2\x80\x9cPermissed 后台任务计划程序标识符\xe2\x80\x9d (即BGTaskSchedulerPermittedIdentifiers)条目,其中包含您的后台任务的标识符。

    \n
  • \n
  • 确保在该行之后立即设置断点,并且在调用之后BGTaskScheduler.shared.submit(...)执行该断点。即,确保您能够接听电话。(参见下一点。)_simulateLaunchForTaskWithIdentifiersubmitsubmit

    \n
  • \n
  • 值得注意的是,Apple 示例(以及您的示例)将其安排在applicationDidEnterBackground(_:). 但是,如果您使用的是UIWindowSceneDelegate(即在您的)中,则不会调用SceneDelegate应用程序委托\xe2\x80\x99s ,而是调用场景委托\xe2\x80\x99s 。我将 的调度放在场景 delegate\xe2\x80\x99s 中。applicationDidEnterBackground(_:)sceneDidEnterBackground(_:)BGAppRefreshTaskRequestsceneDidEnterBackground(_:)

    \n
  • \n
\n

  • @ConfuseIous - 否则,我可能建议您创建一个 [MCVE](https://stackoverflow.com/help/mcve),将其上传到某个地方,我很高兴看看是否可以重现您的问题。请随意查看 [我的 MCVE](https://github.com/robertmryan/BGAppRefresh),这不会导致“没有安排带有标识符 &lt;解码:丢失数据&gt; 的任务请求”消息(假设我这样做在调用“submit”之后,这就是为什么我将断点放在我所做的地方)。 (2认同)

小智 5

当我在设备上测试时,我遇到了同样的问题。转至设备设置 > 常规 > 后台应用程序刷新,然后打开后台应用程序刷新。这个问题已经过去了。


tur*_*han 5

其他答案中未提及另一种情况,如果您尝试提交不同或超过 1 个刷新任务,您可能会遇到下面的错误情况。问题是,目前提到的错误在 Xcode 13.1 中没有抛出,所以看起来提交请求可以工作,但基本上不行。

Apple doc:任意时刻总共可以安排1个刷新任务和10个处理任务。尝试安排更多任务将返回BGTaskScheduler.Error.Code.tooManyPendingTaskRequests。