SKProductsRequestDelegate方法不在类内部调用

时间:2017-06-14 21:48:26

标签: ios swift asynchronous delegates in-app-purchase

我想在显示实际页面之前加载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方法。那与委托有关吗?

我将如何保存将在该方法中返回的产品?因为我以后需要它们。

1 个答案:

答案 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)")
}