为什么BackgroundTasks中的异步长运行操作无法工作?

试图使用 BackgroundTasks 为iOS 13+。长时间运行的操作似乎不起作用。

// in AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

     BGTaskScheduler.shared.register(forTaskWithIdentifier: "foo.bar.name", using: nil) { task in
         print("start!")

         task.expirationHandler = {
             // Not executed
             print("expired!")
         }
         DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
             // Not executed
             print("finish!")
             task.setTaskCompleted(success: true)
         }
     }

     return true
 }

 func applicationDidEnterBackground(_ application: UIApplication) {
     BGTaskScheduler.shared.cancelAllTaskRequests()
     let request = BGProcessingTaskRequest(identifier: "foo.bar.name")
     request.earliestBeginDate = nil // or Date(timeIntervalSinceNow: 0) or Date(timeIntervalSinceNow: 5)...
     do {
       try BGTaskScheduler.shared.submit(request)
     } catch let e {
         print("Couldn't submit task: \(e)")
     }
 }

我也试过使用一个队列 Operation 我为其同步建模的流程)。这样也不行。只要有需要一段时间才能完成的事情,它就会卡住。

它不会向控制台记录其他任何东西,没有错误,没有过期的任务消息。它显示的是长时间运行操作前的最后一条消息,仅此而已。我通过存储一个首选项并在重启时检查它来确认它没有前进。它没有存储。

我将 “foo.bar.name “添加到info.plist中(在 “允许的后台任务调度标识符 “中),并启用了后台获取和后台处理的功能。我在使用iOS 13.3.1和Xcode 11.4.1的iPhone上测试。

附加说明。

解决方案:

一些观察。

  1. 你应该检查以下的结果代码 register. 而且你应该确保你没有看到你的 “无法提交任务 “的日志声明。

  2. 根据该讨论中的 分享链接你有没有设置你的断点 马上 之后 submit 呼叫?这可以完成两件事。

    • 首先,它可以确保你打出那条线(而不是,例如,打出了那个 SceneDelegate 方法)。)

    • 其次,如果你只是手动暂停应用,在应用进入后台后随机的一些时间,那就太晚了。它必须在那个断点 马上 呼叫后 submit. 然后做 e 命令,然后继续执行。然后继续执行。

总之,当我这样做的时候,运行你的代码时,你的 BGProcessingTaskRequest 运行良好。我正在运行iOS 13.4.1(和你一样,Xcode 11.4.1)。

给TA打赏
共{{data.count}}人
人已打赏
未分类

vue功能组件中的 "引用 "指的是什么?

2022-9-8 15:24:42

未分类

Javascript: element.click()在循环中的应用

2022-9-8 15:24:44

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索