在类内部未调用SKProductsRequestDelegate方法

da1*_*bi3 1 delegates asynchronous in-app-purchase ios swift

我想SKProduct在显示实际页面之前加载。但是我在创建它时遇到了一些困难。

我当时想制作另一个加载产品的类,如下所示:

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)
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

但这仅调用init方法,仅此而已,没有调用productsRequest方法。与代表有关吗?

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

Pau*_*tos 5

您可能应该保留对在中SKProductsRequest创建的对象的引用GetIapInfo.init()。您当前的代码将解除分配request对象的瞬间init方法存在后,。这可能解释了为什么根本没有呼叫您的代表;)

SKProductsRequest类文档中

确保对请求对象有严格的引用;否则,系统可能会在请求完成之前取消分配该请求。

例如,为其创建一个存储属性:

private let request: SKProductsRequest!
Run Code Online (Sandbox Code Playgroud)

也可以通过实现此委托方法来跟踪任何与请求相关的错误,这也是一个好主意:

func request(_ request: SKRequest, didFailWithError error: Error) {
    print("Request failed: \(error)")
}
Run Code Online (Sandbox Code Playgroud)

  • @da1lbi3 当然,您还需要在调用代码中保留对创建的`GetIapInfo` 对象的引用。你这样做吗? (2认同)