首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用BGAppRefreshTask并获得错误无标识符<decode的任务请求:已安排缺少data>

尝试使用BGAppRefreshTask并获得错误无标识符<decode的任务请求:已安排缺少data>
EN

Stack Overflow用户
提问于 2021-01-18 19:42:34
回答 4查看 2.2K关注 0票数 11

我一直搞错了

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

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

我的AppDelegate.swift文件:

代码语言:javascript
复制
import UIKit
import Firebase
import BackgroundTasks

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

我正在通过运行

代码语言:javascript
复制
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"redacted.identifier"]

在Xcode控制台中,然后发生上述错误。

控制台输出:

代码语言:javascript
复制
Simulating launch for task with identifier redacted.identifier

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

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-01-18 23:12:01

几个潜在的问题:

  • 在模拟器上进行测试时会发生这种情况。使用物理装置。
  • 确保您的Info.plist有一个“允许的后台任务调度器标识符”(即BGTaskSchedulerPermittedIdentifiers)条目,其中包含后台任务的标识符。
  • 确保在BGTaskScheduler.shared.submit(...)行之后立即设置断点,并在调用submit之后执行_simulateLaunchForTaskWithIdentifier。也就是说,确保你甚至到达了submit的电话。(见下一点。)
  • 值得注意的是,Apple示例(以及您的示例)正在applicationDidEnterBackground(_:)中调度它。但是如果您使用的是UIWindowSceneDelegate (即在您的SceneDelegate中),则不调用应用程序委托的applicationDidEnterBackground(_:),而是调用场景委托的sceneDidEnterBackground(_:)。我把BGAppRefreshTaskRequest的调度放到了场景代表的sceneDidEnterBackground(_:)中。
票数 9
EN

Stack Overflow用户

发布于 2021-04-29 14:48:31

当我在一个设备上测试时,我也遇到了同样的问题。转到设备设置>常规>背景应用程序刷新并打开背景应用程序刷新。这个问题已经解决了。

票数 5
EN

Stack Overflow用户

发布于 2021-11-04 09:07:55

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

Apple :可以在任何时候总共安排一个刷新任务和10个处理任务。尝试安排更多任务返回BGTaskScheduler.Error.Code.tooManyPendingTaskRequests.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65781089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档