Xcode 12 In App Purchase Implementation - SKProductsRequestDelegate 没有被调用

Posted

技术标签:

【中文标题】Xcode 12 In App Purchase Implementation - SKProductsRequestDelegate 没有被调用【英文标题】:Xcode 12 In App Purchase Implementation - SKProductsRequestDelegate does not get called 【发布时间】:2020-11-02 17:19:54 【问题描述】:

我正在尝试了解使用 Xcode 12 和 SwiftUI 实现 IAP。我使用 App Store Connect 准备了所有内容并注册了产品 ID。

我正在使用适应 SKProductsRequestDelegate 协议的 StoreManager 类来获取指定产品 id 的对应 SKProduct。

但是,即使我使用物理设备,func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) 也不会被调用。实际上,控制台什么也没打印。

我不明白为什么这个函数永远不会被调用。

class StoreManager: NSObject, SKProductsRequestDelegate 

override init() 
    super.init()
    getProducts()


func getProducts() 
    let productID = "com.dev8882.MyDungeon.IAP.PowerSword"
    let request = SKProductsRequest(productIdentifiers: Set([productID]))
    request.delegate = self
    request.start()


func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) 
    print("Did receive response")

【问题讨论】:

【参考方案1】:

我的代码有点不同。大约 3 年了,所以我无法详细解释 为什么 这行得通,但基本上我将我的产品 ID 创建为 NSSet,然后将其强制转换为SetStrings

let productID = NSSet(objects: "com.dev8882.MyDungeon.IAP.PowerSword")
let request = SKProductsRequest(productIdentifiers: productID as! Set<String>)

【讨论】:

【参考方案2】:

我不确定为什么这解决了我的问题:

根据 Apple 文档,应该使用强参考 SKProductsRequest 来启动请求。所以我像这样更新了我的代码:

类 StoreManager: NSObject, SKProductsRequestDelegate

var request: SKProductsRequest!

override init() 
    super.init()
    request = SKProductsRequest()
    self.getProducts()


func getProducts() 
    print("OK")
    let productID = "com.dev8882.MyDungeon.IAP.PowerSword"
    let request = SKProductsRequest(productIdentifiers: Set([productID]))
    request.delegate = self
    request.start()


func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) 
    print("Did receive response")

现在可以正常使用了。

【讨论】:

以上是关于Xcode 12 In App Purchase Implementation - SKProductsRequestDelegate 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

在 App Purchase 中不适用于 Xcode 5、iOS 7 模拟器

无法实际托管 In-App-Purchase 托管内容

如何停止在 iOS 上跟踪 in_app_purchase Firebase 事件?

In App Purchase沙盒问题

Flutter in_app_purchase '_enablePendingPurchases':必须在调用 startConnection 之前调用 enablePendingPurchases(

iOS In App Purchase in Action Extension 应用程序