如何通过RevenueCat购买易损件?

问题描述

我很难进行购买易耗品的逻辑。基本上我不确定如何继续执行此功能

private var item: Purchases.Package? {
    Items.shared.item
}
Purchases.shared.products(["com.item.id"]) { products in
    guard let item = products.first else { return }
    Purchases.shared.purchaseProduct(item) { transaction,purchaserInfo,error,cancelled in
    // enable some stuff in the app
    }
}
public class Items: ObservableObject {
    public static let shared = Items()
    
    @Published public var item: Purchases.Package?
    
    init() {
        Purchases.shared.products(["com.item.id"]) { products in
            self.item = products.first
        }
    }
}

如果我尝试像上面那样初始化,它会抱怨它是SKProduct?,并且无法分配给Purchases.Package?

解决方法

您似乎正在获取一个苹果SKProduct,并试图将其分配给RevenueCat Package

您可以直接通过SKProduct调用.purchase()方法。

// when your paywall is displayed (or earlier to preload)
var consumableProduct : SKProduct?
Purchases.shared.products(["com.item.id"]) { (products) in
    consumableProduct = products.first
}

// when the user taps the 'Buy' button
guard let product = consumableProduct else {
    return print("Error: No product exists")
}
Purchases.shared.purchaseProduct(product) { (transaction,purchaserInfo,error,userCancelled) in
    // handle purchase
}

推荐方法

建议您使用RevenueCat产品/软件包,因为您无需在应用中对特定的产品ID(例如“ com.item.id”)进行硬编码,并且可以进行远程更新。

// Offerings are automatically pre-loaded by RevenueCat so
// this should read very quickly from cache
var offering : Purchases.Offering?
Purchases.shared.offerings { (offerings,error) in
    // Add any error handling here
    
    offering = offerings?.current
}

// when the user taps the 'Buy' button

// this assumes your paywall only has one item to purchase.
// you may have a dynamic tableview of items and use `indexPath.row` instead of `first`.
guard let package = offering?.availablePackages.first else {
    print("No available package")
    return
}
Purchases.shared.purchasePackage(package) { (trans,info,cancelled) in
    // handle purchase
}