StoreKit2结构体Product
StoreKit2结构体Product

StoreKit2结构体Product

Product 是来自 StoreKit 2 的结构体(Swift 原生),表示一个 App Store 中的内购商品(In-App Purchase),Apple 框架提供的。

如何查看 Product 的字段属性?

不能直接print(product) 输出所有属性是因为:

Product 并不遵循 CustomStringConvertible 或 Encodable,所以 print() 不会打印结构体详情;

它的大部分属性是 async 的(需异步访问),不能在普通 print 中一览无余;

是一个 Swift 原生类型,不支持像字典那样直接 dump 全部内容。

Apple 官方公开的主要属性(StoreKit 2)

可以使用的 Product 属性主要包括:

1、id:String类型,商品的唯一标识符(Product ID),这里和App Store Connect设定的id一致。

2、displayName:String类型,商品的展示名称,与本地化信息自动对应(如果在 App Store Connect 提供了多语言)。

3、description:String类型,商品描述。

4、displayPrice:String类型,本地化后的价格字符串(例如 ¥6.00),直接在 UI 中显示,不需要自己格式化 Decimal。

$0.99
¥6.00
€1,09

5、price:Decimal类型,原始价格,纯数据,没有货币符号。

price = 6.0

6、priceFormatStyle:FormatStyle<Decimal>类型,用于格式化价格的样式。

7、subscription:Product.SubscriptionInfo?类型,如果是订阅商品,包含订阅相关信息。

8、type:Product.ProductType类型,枚举类型主要有以下几种:

.consumable(消耗型,例如金币)
.nonConsumable(永久型,例如一次性解锁功能)
.autoRenewable(自动续期订阅)
.nonRenewable(非自动续期订阅)

不同的类型决定购买和恢复逻辑的不同。

9、isFamilyShareable:Bool类型,是否支持家庭共享,如果内购是可共享型订阅(App Store Connect 设置了可共享),此属性为 true。

10、isDownloadable:Bool类型,是否可以下载内容(主要针对 macOS)。

全部属性和方法

除主要属性外,还包括以下属性和方法:

1、debugDescription:String类型,Swift 的调试辅助字段。

打印一个 Product 时,控制台会显示更详细的内容,如 ID、类型、价格等。

通常不用于正式逻辑,只为调试服务。

2、jsonRepresentation:String类型,将 Product 转换为 JSON 格式的字符串(只读)。

这可以用来调试或持久化部分信息,例如上传到服务器日志中。

3、currentEntitlement(async):Transaction?类型,异步属性,返回用户当前是否拥有该产品的有效交易。常用于判断是否已购买、是否订阅仍有效。

if let transaction = await product.currentEntitlement {
    print("已购买,交易ID: \(transaction.id)")
}

4、latestTransaction(async):Transaction?类型,返回该商品的最近一次交易记录。

与 currentEntitlement 不同,它会包含退款或过期记录。

常用于「交易历史」或「检测用户是否退款」。

5、priceFormatStyle:FloatingPointFormatStyle<Double>.Currency类型,用于将数字格式化成货币形式。

let formatted = product.price, formatted(using: product.priceFormatStyle)

通常使用 displayPrice 展示商品价格,如果需要特别的样式(如无货币符号),可以用它。

6、subscription:Product.SubscriptionInfo?类型,仅对订阅型商品有效,包含订阅周期、续订规则、试用期信息等。

if let sub = product.subscription {
    print(sub.subscriptionPeriod.value) // 1
    print(sub.subscriptionPeriod.unit)  // month / year
}

7、subscriptionPeriodFormatStyle:Date.ComponentsFormatStyle类型,用来把订阅周期(比如每月、每年)转成人类可读的文本。

“1 month”
“1 year”

8、subscriptionPeriodUnitFormatStyle:更细粒度的格式化工具,用于描述单位(比如把 “month” 本地化为 “月”)。

开发中极少直接用,大多由系统自动处理。

9、purchase(confirmIn:):带自定义确认窗口场景的购买方法。

func purchase(confirmIn windowScene: UIWindowScene?) async throws -> Product.PurchaseResult

适用于在多窗口 App(如 iPad、macOS Catalyst)中购买商品时,明确指定在哪个 UIWindowScene 中弹出购买弹窗。

在大多数情况下,使用无参数版本即可。

10、purchase():核心购买方法。

func purchase() async throws -> Product.PurchaseResult

它会调用系统购买弹窗、处理付款流程,并返回结果枚举:

.success(VerificationResult<Transaction>)
.userCancelled
.pending

相关文章

1、iOS StoreKit2显示内购商品本地化价格:https://fangjunyu.com/2025/03/25/ios-storekit2%e6%98%be%e7%a4%ba%e5%86%85%e8%b4%ad%e5%95%86%e5%93%81%e6%9c%ac%e5%9c%b0%e5%8c%96%e4%bb%b7%e6%a0%bc/

2、iOS通过StoreKit 2实现应用内购:https://fangjunyu.com/2024/05/30/ios%e5%ae%9e%e7%8e%b0%e5%ba%94%e7%94%a8%e5%86%85%e8%b4%ad/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注