对 iOS BackgroundTask API 的一个极其简单的抽象,使后台任务易于隔离、维护和调度。旨在尽可能轻量级和灵活,同时与系统 API 紧密集成。而且它是使用 Swift 并发构建的。
此软件包需要最低部署目标 iOS 13.0 和 Swift 5.6。
您可以使用 Swift Package Manager 或手动安装或集成 Lurker。
复制以下 URL,然后从 Xcode 中选择 File
> Add Packages...
。
https://github.com/Sam-Spencer/Lurker.git
克隆或下载存储库,并将 Sources
目录的内容复制到您的项目中。
Lurker 提供了出色的文档来引导您完成每一步以及您可能遇到的任何问题。 但是,我也在这里提供了一个快速参考,让您开始使用。
注册和调度您的任务可以像两行代码一样简单。 只需确保在您的应用程序完成启动之前调用 Lurker 的 registerMissions
函数。
func setupLurker() {
do {
try Lurker.shared.registerMissions([ProductMission(), ConfigurationMission()])
Lurker.shared.scheduleAllMissions()
} catch let error {
print("Failed to register and schedule background tasks: \(error)")
}
}
重要提示:此处抛出的任何错误都可能是程序员错误,应在部署到生产环境之前解决。
创建一个任务非常容易。 只需创建一个符合 Mission
协议的对象,并实现必要的属性和函数。
final class ConfigurationMission: Mission {
// This should match one of your app's predefined task identifier
var identifier: String {
return "com.yourApp.backgroundRefresh.configurationTask"
}
// This can be either "brief" or "extended"
var style: MissionStyle {
return .extended
}
// This is where the magic happens!
func runTask(_ taskInfo: BGTask) async -> Bool {
let longTask = Task { _ -> Bool in
// Perform work here
return true
}
taskInfo.expirationHandler = {
print("Task is expiring")
longTask.cancel()
}
let success = await longTask.value
return success
}
// Return a date here to delay system task execution
func earliestStart() -> Date? {
return nil
}
}
提示:
Mission
协议需要Sendable
一致性。 确保这一点的最简单方法是使用struct
或final class
,具体取决于您的需要。 否则,您可能需要做额外的工作才能符合标准。
通过将包含的 .doccarchive
捆绑包导入 Xcode,可以获得丰富而精美的文档。 只需打开存档,Xcode 会将其导入到您的文档浏览器中。 文档包括帮助您开始使用后台任务的文章,以及有关如何调试这些任务的信息。
Lurker 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。