Lurker

iOS BackgroundTask API 的一个极其简单的抽象,使后台任务易于隔离、维护和调度。旨在尽可能轻量级和灵活,同时与系统 API 紧密集成。而且它是使用 Swift 并发构建的。


特性

要求

此软件包需要最低部署目标 iOS 13.0 和 Swift 5.6。

安装

您可以使用 Swift Package Manager 或手动安装或集成 Lurker。

Swift Package Manager

复制以下 URL,然后从 Xcode 中选择 File > Add Packages...

https://github.com/Sam-Spencer/Lurker.git

手动

克隆或下载存储库,并将 Sources 目录的内容复制到您的项目中。

入门

Lurker 提供了出色的文档来引导您完成每一步以及您可能遇到的任何问题。 但是,我也在这里提供了一个快速参考,让您开始使用。

注册 & 调度任务

注册和调度您的任务可以像两行代码一样简单。 只需确保在您的应用程序完成启动之前调用 Lurker 的 registerMissions 函数。

  1. 注册您的“任务”(后台任务)。
  2. 调度它们。
  3. 全部完成! 🍾
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 一致性。 确保这一点的最简单方法是使用 structfinal class,具体取决于您的需要。 否则,您可能需要做额外的工作才能符合标准。

文档

通过将包含的 .doccarchive 捆绑包导入 Xcode,可以获得丰富而精美的文档。 只需打开存档,Xcode 会将其导入到您的文档浏览器中。 文档包括帮助您开始使用后台任务的文章,以及有关如何调试这些任务的信息。

Documentation Screenshot

许可

Lurker 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。