You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用StoreKit 2时如何获取Apple托管内容的下载信息?

StoreKit 2 苹果托管内容下载实现方案

StoreKit 2 没有在Transaction结构体中内置类似旧版SKPaymentTransaction.downloads的属性,苹果托管内容的下载能力统一收敛到StoreKit.Content相关API实现,完整流程如下:

1. 交易验证后获取关联托管内容

完成交易验证后,通过交易对应的产品ID调用Content.latest(for:)方法,即可获取该产品绑定的所有苹果托管内容实例:

// 获取已验证的有效交易
guard let transaction = try? await Transaction.currentEntitlement(for: "你的产品ID")?.payloadValue else {
    return
}
// 获取产品关联的所有托管内容
let hostedContents = try await Content.latest(for: transaction.productID)

2. 执行下载并监听状态

遍历获取到的Content实例,调用download()方法触发下载,通过异步流监听下载进度、结果等状态:

for content in hostedContents {
    let downloadStateStream = content.download()
    for await state in downloadStateStream {
        switch state {
        case .downloading(let progress):
            // 更新UI展示下载进度,progress.fractionCompleted取值为0~1
            print("当前下载进度:\(Int(progress.fractionCompleted * 100))%")
        case .finished(let tempFileURL):
            // 下载完成,将临时路径的内容移动到应用沙盒持久化目录
            let targetURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
                .appendingPathComponent(content.fileName)
            try? FileManager.default.moveItem(at: tempFileURL, to: targetURL)
        case .failed(let error):
            // 处理下载错误,可根据业务逻辑做重试提示
            print("下载失败:\(error.localizedDescription)")
        default:
            break
        }
    }
}

常见场景适配

  • 恢复购买:直接查询当前用户所有有效的Transaction entitlements,再对应调用Content.latest()获取可下载内容即可
  • 已下载内容校验:Content实例的state属性会标记内容是否已本地存在,无需自行做文件存在性校验

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:45:03