我想在显示实际页面之前加载SKProduct
s。但是我在创建它时遇到了一些困难。
我想的是制作另一个加载产品的类,如下所示:
class GetIapInfo: NSObject, SKProductsRequestDelegate {
var list = [SKProduct]()
var p = SKProduct()
let audio = "com.xxx";
let video = "com.xxx"
let complete = "com.xxx"
override init() {
super.init()
if SKPaymentQueue.canMakePayments() {
print("starting IAPS")
let productIdentifiers = Set([audio, vídeo, complete])
let request = SKProductsRequest(productIdentifiers: productIdentifiers)
request.delegate = self
request.start()
} else {
print("please enable IAPS")
}
}
internal func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
print("product request")
let myProduct = response.products
for product in myProduct {
print("product added from ding")
print(product.productIdentifier)
print(product.localizedTitle)
print(product.localizedDescription)
print(product.price)
}
}
}
但这仅调用init
方法,而且它不会调用productsRequest
方法。那与委托有关吗?
我将如何保存将在该方法中返回的产品?因为我以后需要它们。
答案 0 :(得分:4)
您可能应该保留对SKProductsRequest
内创建的GetIapInfo.init()
对象的引用。当request
方法存在时,您当前的代码将取消分配 init
对象。这可能解释了为什么你的代表根本没有被调用;)
来自SKProductsRequest
class documentation:
确保对请求对象保持强引用;否则,系统可能会在请求完成之前解除分配请求。
例如,为它创建一个存储的属性:
private let request: SKProductsRequest!
通过实现此委托方法也可以跟踪任何与请求相关的错误:
func request(_ request: SKRequest, didFailWithError error: Error) {
print("Request failed: \(error)")
}