我不断收到错误消息
\n\n\n\n
No task request with identifier <decode: missing data> has been scheduled
在我的调试器输出中,所以我决定尝试运行 Apple 提供的示例代码,并得到了相同的错误。我已经尝试了多台计算机和 Xcode 版本、来自不同来源的多个示例项目,但没有任何效果。
\n我的 AppDelegate.swift 文件:
\nimport 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 }\nRun Code Online (Sandbox Code Playgroud)\n我正在通过运行测试后台获取
\ne -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"redacted.identifier"]\nRun Code Online (Sandbox Code Playgroud)\n在Xcode控制台中,之后出现上述错误。
\n控制台输出:
\nSimulating launch for task with identifier redacted.identifier\n\nNo task request with identifier <decode: missing data> has been scheduled\nRun Code Online (Sandbox Code Playgroud)\n
Rob*_*Rob 11
几个潜在的问题:
\n在模拟器上测试时会发生这种情况。使用物理设备。
\n确保您Info.plist有一个 \xe2\x80\x9cPermissed 后台任务计划程序标识符\xe2\x80\x9d (即BGTaskSchedulerPermittedIdentifiers)条目,其中包含您的后台任务的标识符。
确保在该行之后立即设置断点,并且在调用之后BGTaskScheduler.shared.submit(...)执行该断点。即,确保您能够接听电话。(参见下一点。)_simulateLaunchForTaskWithIdentifiersubmitsubmit
值得注意的是,Apple 示例(以及您的示例)将其安排在applicationDidEnterBackground(_:). 但是,如果您使用的是UIWindowSceneDelegate(即在您的)中,则不会调用SceneDelegate应用程序委托\xe2\x80\x99s ,而是调用场景委托\xe2\x80\x99s 。我将 的调度放在场景 delegate\xe2\x80\x99s 中。applicationDidEnterBackground(_:)sceneDidEnterBackground(_:)BGAppRefreshTaskRequestsceneDidEnterBackground(_:)
其他答案中未提及另一种情况,如果您尝试提交不同或超过 1 个刷新任务,您可能会遇到下面的错误情况。问题是,目前提到的错误在 Xcode 13.1 中没有抛出,所以看起来提交请求可以工作,但基本上不行。
Apple doc:任意时刻总共可以安排1个刷新任务和10个处理任务。尝试安排更多任务将返回BGTaskScheduler.Error.Code.tooManyPendingTaskRequests。
| 归档时间: |
|
| 查看次数: |
3579 次 |
| 最近记录: |