5

目前,我正试图在 RevenueCat 的帮助下将促销产品包含在我的应用程序中。不幸的是,它不起作用。(我使用的是 SwiftUI 1.0,所以仍然使用 AppDelegate。)

到目前为止我做了什么:

我已经在 AppDelegate 中实现了以下功能,如此处所述(https://docs.revenuecat.com/discuss/5cff570754c3420045b379f3):

  func purchases(_ purchases: Purchases, shouldPurchasePromoProduct product: SKProduct, defermentBlock makeDeferredPurchase: @escaping RCDeferredPromotionalPurchaseBlock){
    let defermentBlock = makeDeferredPurchase
    
  }

问题:

我认为问题在于我在错误的地方运行 defermentBlock。正如这里所说(https://sdk.revenuecat.com/ios/Protocols/RCPurchasesDelegate.html#/c:objc(pl)RCPurchasesDelegate(im)purchases:shouldPurchasePromoProduct:defermentBlock:),应该在应用程序运行时调用它在正确的状态。

目前我直接在函数中调用 defermentBlock,如下所示:

func purchases(_ purchases: Purchases, shouldPurchasePromoProduct product: SKProduct, defermentBlock makeDeferredPurchase: @escaping RCDeferredPromotionalPurchaseBlock){
    let defermentBlock = makeDeferredPurchase
    
    // Should buy the product 
    defermentBlock { (transaction, info, error, cancelled) in
        if let purchaserInfo = info {
            Purchases.shared.purchaseProduct(product) { (transaction, purchaserInfo, error, userCancelled) in //this function works for products which are directly bought in the app
                if error == nil && !userCancelled{
                    try? CoreDataManagerNew.shared.updateUserInformation()
                }
            }
        }
    }
    
}

现在我有以下问题:

  • 如何缓存 defermentBlock?
  • 应用程序何时处于正确状态?当我在 AppStore 中按下购买按钮时,它会自动打开。

另一个问题是我无法测试功能。Apple(https://developer.apple.com/documentation/storekit/in-app_purchase/testing_promoted_in-app_purchases)建议的方式不起作用。

提前谢谢了!

4

1 回答 1

4

确保您在调用 configure 之后而不是之前进行设置(这里Purchases.shared.delegate = self有人遇到了这个问题)。

然后实现委托功能,如:

    defermentBlock { (transaction, info, error, cancelled) in
        if let purchaserInfo = info {
            if error == nil && !userCancelled{
                try? CoreDataManagerNew.shared.updateUserInformation()
            }
        }
    }   

请注意,您不必purchaseProduct在块内调用。调用块将等同于调用purchaseProduct,它将打开购买对话框。

缓存 defermentBlock 意味着您可以将延迟块保存为对象的属性,然后在您的应用程序准备好购买时调用它。因此,您可以执行以下操作:

    var maybeDeferredPurchase: RCDeferredPromotionalPurchaseBlock? = nil
    
    func purchases(_ purchases: Purchases, shouldPurchasePromoProduct product: SKProduct, defermentBlock makeDeferredPurchase: @escaping RCDeferredPromotionalPurchaseBlock) {
        maybeDeferredPurchase = makeDeferredPurchase
    }

然后,每当您想显示购买弹出窗口时(例如当屏幕加载时),请执行以下操作:

if let defermentBlock = self.maybeDeferredPurchase {
    defermentBlock { (transaction, info, error, cancelled) in
        if let purchaserInfo = info {
            handlePurchaserInfo()
        }
    }
}

要测试它是否有效,您可以itms-services://?action=purchaseIntent&bundleId=<YOUR_BUNDLE_ID>&productIdentifier=<YOUR_SKPRODUCT_ID>在设备中打开一个链接。例如,在我的测试应用程序中,它是itms-services://?action=purchaseIntent&bundleId=com.revenuecat.sampleapp&productIdentifier=com.revenuecat.lifetime.199.99.

于 2021-07-14T23:23:44.283 回答