ios - 尝试使用 BGAppRefreshTask 并收到错误 No task request with identifier <decode : missing data> has been scheduled

标签 ios swift xcode

我一直收到错误

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


在我的调试器输出中,所以我决定尝试运行 Apple 提供的示例代码 here并得到同样的错误。我尝试了多台计算机和 Xcode 版本,来自不同来源的多个示例项目,但没有任何效果。
我的 AppDelegate.swift 文件:
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)
        }
    }
我正在通过运行测试后台获取
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"redacted.identifier"]
在 Xcode 控制台中,之后发生上述错误。
控制台输出:
Simulating launch for task with identifier redacted.identifier

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

最佳答案

几个潜在的问题:

  • 在模拟器上测试时会发生这种情况。使用物理设备。
  • 确保您的 Info.plist有一个“允许的后台任务调度程序标识符”(即 BGTaskSchedulerPermittedIdentifiers)条目,其中包含您的后台任务的标识符。
  • 确保在 BGTaskScheduler.shared.submit(...) 之后立即设置断点行并执行 _simulateLaunchForTaskWithIdentifiersubmit 之后被称为。即,确保您甚至可以访问 submit称呼。 (见下一点。)
  • 值得注意的是,Apple 示例(和您的示例)将其安排在 applicationDidEnterBackground(_:) 中。 .但是,如果您使用的是 UIWindowSceneDelegate (即在您的 SceneDelegate 中),然后是应用程序委托(delegate)的 applicationDidEnterBackground(_:)不是调用,而是场景委托(delegate)的 sceneDidEnterBackground(_:)是。我把调度的BGAppRefreshTaskRequest在场景代表的sceneDidEnterBackground(_:) .
  • 关于ios - 尝试使用 BGAppRefreshTask 并收到错误 No task request with identifier <decode : missing data> has been scheduled,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65781089/

    相关文章:

    ios - Facebook IOS SDK URL 方案生成

    ios - 呈现模态视图 Controller 时暂停动画

    swift - 如何将 subview 移动到前面并使现有 View 向上移动以腾出空间?

    ios - 在不使用全局变量的情况下在多个 swift 类中重用大型未更改数组

    iphone - 使用 NSLog 打印 NSString 参数

    iOS GPS 跟踪应用程序在后台关闭

    ios - 全局常量中的内存使用更少

    xcode - Swift 如何在 2 行中添加 UIRefreshControl 的标题文本

    ios - swift 用 2 个数组填充 UItableViewCell

    swift - 使用 Swift 包管理器和 libevent 干净地处理/usr/local/