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
,然后将其强制转换为Set
的Strings
:
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 模拟器
如何停止在 iOS 上跟踪 in_app_purchase Firebase 事件?
Flutter in_app_purchase '_enablePendingPurchases':必须在调用 startConnection 之前调用 enablePendingPurchases(