使用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 } } }
常见场景适配
- 恢复购买:直接查询当前用户所有有效的
Transactionentitlements,再对应调用Content.latest()获取可下载内容即可 - 已下载内容校验:
Content实例的state属性会标记内容是否已本地存在,无需自行做文件存在性校验
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

