iOSClientDownload 3.1.0

iOSClientDownload 3.1.0

Robert PelkaRadoslawUdaya维护。



  • EMP

Swift Platforms CocoaPods Compatible Carthage Compatible Swift Package Manager

下载

特性

  • 任务管理简单
  • FairPlay DRM保护(需要iOS 10.0+)
  • 后台下载
  • 发布事件和跟踪进度
  • 任务恢复
  • 选择下载质量
  • 正文和音频选择
  • 集成分析

需求

  • iOS 11.0+ (FairPlay需要iOS 10.0+))
  • Swift 5.0+
  • Xcode 10.2+

安装

Swift包管理器

Swift包管理器是一个用于自动分发Swift代码的工具,它集成在Swift编译器中。一旦您设置了Swift包,添加iOSClientDownload作为依赖项就像将其添加到Package.swift的依赖值一样简单。

dependencies: [
    .package(url: "https://github.com/EricssonBroadcastServices/iOSClientDownload", from: "3.1.0")
]

CocoaPods

CocoaPods是Cocoa项目的依赖项管理器。有关使用和安装说明,请访问他们的网站。要使用CocoaPods将iOSClientDownload集成到您的Xcode项目中,请在Podfile中指定它

pod 'iOSClientDownload', '~>  3.1.0'

Carthage

Carthage是一个去中心化的依赖项管理器,它在不干扰您的Xcode项目设置的情况下构建您的依赖关系图。CI通过(fastlane)也可以使用。

通过执行以下命令通过Homebrew安装Carthage

$ brew update
$ brew install carthage

安装Carthage后,您需要创建一个Cartfile,该文件指定了您的依赖项。有关Cartfile和其他由Carthage创建的实物的详细信息,请参阅文物文档。

github "EricssonBroadcastServices/iOSClientDownload"

运行carthage update --use-xcframeworks将获取您的依赖项并将其放置在/Carthage/Checkouts中。您要么构建.framework并将它们拖到您的Xcode中,要么将获取的项目附加到您的Xcode workspace

最后,请确保将.framework添加到您的目标General -> Embedded Binaries部分。

使用

入门

自 iOS 9.0 开始,苹果引入了支持 HLS (HTTP Live Streaming) 资源下载的新功能。从 iOS 10.0 开始,新增了对离线 FairPlay 支持的模块。该 Download 模块提供增强的 API,简化了最常见任务,并将其功能封装到一组核心类中。此外,该模块还增加了事件发布和数据分析钩子以及 FairPlay 请求管理。这些 API 设计为无后端依赖,应该很容易被采纳和扩展。要实现与 EMP 后端的完全集成,请参阅 ExposureAnalytics。该 Download 模块基于现代苹果 API,允许系统级功能(如网络使用和电池寿命策略)的紧密集成。

TaskSessionManager 提供了入口,使得客户端应用程序可以进行下载。`SessionManager` 封装了一个下载会话、其关联的任务、会话配置和相关的代理回调。在 后台下载 场景中,这些回调是非常关键的。在幕后,iOS 通过强引用保持后台任务的活动,并持续更新其状态。

let manager = SessionManager<Task>()

let task = manager.download(mediaLocator: someUrl,
                            assetId: "amazingAssetToDownload")

上面提供的 assetId 具有特殊的重要性,并且必须是特定媒体的唯一标识符。该 `id` 是如何通过代理和事件发布跟踪资源的方式。此外,背景和状态恢复需要此标识符是唯一的。

选择首选比特率

比特率选择允许配置一个大于或等于指定值的最低媒体比特率。如果找不到适合请求比特率的媒体比特率,则选择最高的媒体比特率。不进行选择将默认使用所需最高比特率进行下载。

task.use(bitrate: 16000)

选择首选演示大小

默认情况下,下载任务会选择具有最大媒体演示大小的变体。要下载特定大小的变体,客户端应用程序可以提供一个 CGSize 值。

task.use(bitrate: 16000, presentationSize: CGSize(width: 1920, height: 1080))

FairPlay 保护

为了通过 FairPlay 使用受 DRM (数字版权管理)保护的离线资源,客户端应用程序需要实现一个 FairplayRequester 来处理 证书许可 流程。这将因解决方案而异。该协议扩展了苹果提供的 AVAssetResourceLoaderDelegate 协议。`EMP` 通过 Exposure 模块 提供了离线 FairPlay 保护的原生实现,与平台的其他部分无缝集成。

let fairplayRequester = SolutionSpecifiFairplayRequester()
let fairplayTask = manager.download(mediaLocator: someFairplayUrl,
assetId: "fairPlayAsset",
using: fairplayRequester)

使用 FairPlay 保护离线 HLS 资源是一个多步过程,这里不进行详细描述。关键方面包括发行一个可持久化的 CKC (内容密钥上下文),其中包含正确的 TLLV 标签以及一个主播放列表,它公开了 EXT-X-SESSION-KEY 标签,该标签详细说明了相关内容密钥。有关深入指南,请参阅苹果的 具有 FPS 的离线 HLS 指南 文档。

分析钩子

响应当下载事件

EventPublisher 协议定义了一个接口,描述了与下载相关的各种事件,如 任务准备完成取消。`Task` 采用了该协议,允许客户端应用程序注册被触发回调的方式。

task.onResumed{ task in
        // Toggle pause/resume button
    }
    .onProgress{ task, progress in
        // Update progress bar
    }
task.onCanceled{ task, destinationUrl in
        // Delete the media located at the returned destinationUrl
    }
    .onCompleted{ task, destinationUrl
        // Store a reference to the returned destinationUrl.
    }
    .onError{ task, destinationUrl, error
        // Handle error and clean up media at destinationUrl.
    }

任务准备

通过提供 mediaLocator 和唯一的 assetId 创建的 `Task` 还未完全实现。这只有在相关任务准备并启动后才会发生。这是为了确保与后台下载的一致性。

task.onPrepared{ task in
        // The task has now been prepared, either through restoring a previous task with the specified assetId or creating a new task.
    }
    .prepate(lazily: true)

通过 SessionManager 准备 `Task` 是一个 异步 操作。这是由于一条特定

资产管理

《下载》模块提供了一个接口,用于配置和跟踪下载《任务》,但不会管理离线媒体。《客户端应用》负责管理《持久键》、《离线媒体资源》及其关联元数据。这包括向用户展示列出离线内容的适当用户界面,以及移除它的功能。

后台下载

注册从《UIApplicationDelegate》回调中接收到的完成处理程序

func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
    if identifier == SessionConfigurationIdentifier.default.rawValue {
        let sessionManager = SessionManager<Task>()
        sessionManager.backgroundCompletionHandler = completionHandler

        sessionManager.restoreTasks {
            $0.forEach {
                // Restore state
            }
        }
    }
}

响应《DownloadTask》事件,例如在成功时存储《URL》,在失败时删除本地媒体等。

错误处理

发行说明

特定更改的发布可以在变更日志中找到。

升级指南

将一个版本升级到另一个版本的操作步骤取决于您的客户端应用已经选择将《下载》集成到哪种解决方案中。

版本之间的主要更改将通过特殊的《升级指南》进行记录

Carthage

根据您的项目设置,通过运行带有相关《选项》的 carthage update(例如 --use-submodules)来更新您的依赖项。有关使用《Carthage》管理依赖项的更多信息,请参阅他们的文档或运行carthage help

路线图

尚未成立正式的路线图,但目前存在大量可能的项。以下是一个无序的《愿望清单》,可能会有所变化。

  • 扩展事件发布
  • 分析钩子
  • 单元测试

贡献