iOS 13中的后台应用程序执行

在iOS和MacOS开发人员世界中,今年的主要事件WWDC总是通过发布操作系统,框架和硬件的新版本来吸引所有与行业相关的人们-总的来说,实际上需要进行所有工作。

今年也不例外,积极讨论的主题是适用于您自己理解的设备的iOS,SwiftUI和iPadOS OS的新版本。

但是,有些主题涉及的内容较少,但是与此相关的主题却丝毫没有减少-例如,触摸了应用程序的后台执行之类的有用的东西。

简要介绍这个话题


对于那些不太了解后台执行是什么的人,让我们解释一下:后台执行意味着应用程序在其未实际在用户智能手机屏幕上运行(即不在前台)的状态下进行某些工作。 。

图片

这张图片清楚地显示了应用程序可以保留在什么条件下以及如何从一个应用程序迁移到另一个应用程序。

另外,在此会议中,Apple开发人员着重于资源消耗(我希望很明显,在后台工作时,应用程序会继续消耗能量)。 但是是时候直接查看报告了。

WWDC发生了什么


实际上,演讲者从与我相同的事情开始-简短地谈到了在后台工作并描述了将在后台执行的任务。

图片

我们正在接近发展。 对于背景性能,Apple有3个主要注意事项:

  • 力量
  • 表现
  • 机密性

一切都非常简单-如果一个应用程序任务在后台运行,则可以在另一个应用程序在前台运行时执行此执行。 因此,对您设置了资源限制,以确保不会过度消耗资源。 如果超出这些限制,则Apple可能会强行终止您的应用程序,这将减慢进一步的启动时间。 关于隐私,该公司强烈建议开发人员使用其API的所有功能来通知用户有关应用程序在其工作中使用的数据(即使是在后台)。

顺便说一句,这些API的列表令人印象深刻-它们没有做单独的评论,但我建议您注意它们。

是的,在会议上,苹果开发人员使用Messenger应用程序示例简要概述了各种可能性(值得观看WWDC的视频)。

后台任务


今年几乎一半的报告都专门针对该框架。

此新颖性提供2种类型的任务:

  • 应用刷新任务
  • 后台处理任务

应用刷新任务


BG应用程序刷新任务是一种特殊的后台任务,我们可以使用它来更新应用程序数据。 使此类任务非常特别的一件事是用户行为。 iOS会了解用户启动应用程序的频率和时间,并尝试在用户不太可能使用应用程序时启动BGAppRefreshTask。

图片

是的,它的工作时间不会超过30秒-该功能非常令人讨厌,它是以前版本的OS遗留下来的。

考虑来自Internet的代码示例。

import UIKit import BackgroundTasks @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BGTaskScheduler.shared.register( forTaskWithIdentifier: "pl.snowdog.example.refresh", using: DispatchQueue.global() ) { task in self.handleAppRefresh(task) } return true } private func handleAppRefresh(_ task: BGTask) { let queue = OperationQueue() queue.maxConcurrentOperationCount = 1 let appRefreshOperation = AppRefreshOperation() queue.addOperation(appRefreshOperation) task.expirationHandler = { queue.cancelAllOperations() } let lastOperation = queue.operations.last lastOperation?.completionBlock = { task.setTaskCompleted(success: !(lastOperation?.isCancelled ?? false)) } scheduleAppRefresh() } } 

您需要停止并考虑以下几点:

  • 将到期处理程序安装在任务对象(expirationHandler)上,因为系统提供了有限的时间来完成工作,并且如果超过该时间,则必须清除资源。
  • 确保操作完成后立即调用setTaskCompleted方法。
  • BGTaskScheduler是用于安排后台工作的主要类。

后台处理任务


另一类背景黑客是BG处理任务。 您可以使用它来训练设备上的ML模型或在数据库中进行清理。 苹果公司承诺该系统最多可以为此类任务分配几分钟的时间,这对于繁重的工作而言是一项非常重要的创新,而繁重的工作又不适合30秒。

再举一个例子:

 import UIKit import BackgroundTasks @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BGTaskScheduler.shared.register( forTaskWithIdentifier: "pl.snowdog.example.train", using: DispatchQueue.global() ) { task in self.handleMLTrain(task) } return true } private func scheduleMLTrain() { do { let request = BGProcessingTaskRequest(identifier: "pl.snowdog.example.train") request.requiresExternalPower = true request.requiresNetworkConnectivity = true try BGTaskScheduler.shared.submit(request) } catch { print(error) } } } 

重要事项:

  • requiesExternalPower是一个布尔值,它指示处理任务是否需要连接到电源的设备。
  • requireNetworkConnectivity-一个布尔值,指示处理任务是否需要网络连接。

侦错


这里也不是没有便利设施。 后台任务的计划执行时间与系统启动应用程序以完成该过程之间的延迟可能是几个小时。 开发应用程序时,可以使用两个私有功能来启动任务,并根据选定的时间轴强制其尽早完成。 调试功能仅在设备上起作用。

  • 任务启动:

     e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"TASK_IDENTIFIER"] 
  • 强制提前终止作业:

     e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateExpirationForTaskWithIdentifier:@"TASK_IDENTIFIER"] 

总结


BackgroundTasks是一种使用环境来规划您的辛勤工作和最佳用户体验的好方法。 鉴于自系统的第13版以来,在后台工作的许多方法都已过时,因此该框架在应用程序中仍将非常受欢迎。 考虑到上述可能性,这是合乎逻辑的。

我还建议您观看WWDC视频 ,其中描述的示例非常有趣。

Source: https://habr.com/ru/post/zh-CN466857/


All Articles