StoreKit 2自定义购买选项未被记录的技术问题咨询
StoreKit 2 自定义购买选项不回显问题解析
1. 自定义选项是否有时会被包含?
是的,苹果工程师的表述确认了这一点,但没有公开规则说明哪些场景会生效。从开发者实际反馈来看,自定义键值对几乎不会出现在前端可获取的Transaction对象或购买记录中,仅存在理论上的极小概率被保留,没有稳定复现的条件。
2. 无法确保自定义选项被包含的原因
custom(key:value:)的设计初衷并非供前端开发者在交易完成后读取,而是用于苹果内部链路的辅助数据传递——比如合规校验、区域配置同步等后台流程。苹果未将其纳入交易回传的稳定字段,是因为它不属于用户账号、交易核心标识这类需要持久化的关键数据。
对比appAccountToken,它是苹果明确支持的账号关联标识,属于交易链路中必须保留的核心信息,因此能稳定回显;而自定义键值对是“可选传递”的非核心数据,苹果不保证其在整个交易流程中被完整保留或回传。
3. 可行解决方案
不要依赖custom(key:value:)传递需要后续关联的业务数据,推荐两种可靠方案:
- 本地映射存储:调用
purchase()前,将自定义数据与产品ID、当前用户ID关联,存入本地存储(如UserDefaults、Core Data),交易完成后通过Transaction的productID或appAccountToken反向查询。 - 服务器端关联:发起购买前,将自定义数据上传至你的后端,生成唯一会话ID,将该ID通过
appAccountToken传递;交易完成后,用appAccountToken或交易ID在后端查询对应自定义数据。
相关API中文说明
async func purchase(options: Set<Product.PurchaseOption> = []) throws -> Product.PurchaseResult:异步执行购买操作,可传入选项集合,执行失败抛出错误,返回购买结果。static func appAccountToken(_ token: UUID) -> Product.PurchaseOption:生成用于设置应用账号令牌的选项,该令牌会在交易中永久保留并可查询。static func custom(key: String, value: Data) -> Product.PurchaseOption:生成用于传递自定义键值对的选项,苹果不保证该数据会在交易记录中返回。
内容的提问来源于stack exchange,提问作者Grambo
相关产品推荐
相关产品推荐

