【问题标题】:Why async / long running operations in BackgroundTasks don't work?为什么 BackgroundTasks 中的异步/长时间运行的操作不起作用?
【发布时间】:2020-04-23 21:33:23
【问题描述】:

尝试在 iOS 13+ 中使用 BackgroundTasks。长时间运行的操作似乎不起作用:

// 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 上进行测试。

补充说明:

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    几个观察:

    1. 你应该检查register的结果代码。并且您应该确保您没有看到“无法提交任务”日志语句。

    2. 根据link you shared 中的讨论,您是否在submit 调用之后立即设置了断点?这完成了两件事:

      • 首先,它确保您点击了那条线(例如,与 SceneDelegate 方法相反)。

      • 其次,如果您只是手动暂停应用程序,在应用程序进入后台后的随机时间,那就太迟了。它必须在您调用submit 之后立即 在那个断点中。然后执行e 命令。然后继续执行。

    无论如何,当我这样做时,运行您的代码,BGProcessingTaskRequest 运行良好。我正在运行 iOS 13.4.1(和你一样,Xcode 11.4.1)。

    【讨论】:

    • 没有记录错误。我(现在)也检查了注册的结果,这是真的。我确实提到了BGTaskSchedulerPermittedIdentifiers 和帖子中的功能。设置好了。我将下一行的断点设置为submit。我运行e 命令,禁用断点并单击恢复。
    • 令人着迷。好吧,它在我的 13.4.1 设备上像宣传的那样工作。我无法重现您描述的行为...
    • 好的。我会为此 +1 并在我找出问题所在时回来(我希望很快就会出现)。谢谢!
    猜你喜欢
    • 2023-03-27
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多