Ios 应用程序崩溃,出现应用内购买错误

Ios 应用程序崩溃,出现应用内购买错误,ios,swift,Ios,Swift,我使用此代码创建我的应用内购买: import UIKit import StoreKit class ViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver, SKStoreProductViewControllerDelegate { var product_id: String? @IBOutlet weak var buyButton: UIButton! o

我使用此代码创建我的应用内购买:

import UIKit
import StoreKit

class ViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver, SKStoreProductViewControllerDelegate {

var product_id: String?
@IBOutlet weak var buyButton: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()

    product_id = "product_id"

    SKPaymentQueue.default().add(self)
}

 @IBAction func unlockAction(sender: AnyObject) {

    print("About to fetch the product...")

    // Can make payments
    if (SKPaymentQueue.canMakePayments())
    {
        let productID:NSSet = NSSet(object: self.product_id!);
        let productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>);
        productsRequest.delegate = self;
        productsRequest.start();
        print("Fetching Products");
    }else{
        print("Can't make purchases");
    }

}

func buyProduct(product: SKProduct){
    print("Sending the Payment Request to Apple");
    let payment = SKPayment(product: product)

    SKPaymentQueue.default().add(payment);

}

func productsRequest (_ request: SKProductsRequest, didReceive response: SKProductsResponse) {

    let count : Int = response.products.count
    if (count>0) {
        let validProduct: SKProduct = response.products[0] as SKProduct
        if (validProduct.productIdentifier == self.product_id) {
            buyProduct(product: validProduct);

        } else {
            print(validProduct.productIdentifier)
        }
    } else {
        print("nothing")
    }
}
错误
(lldb)


如何修复它?

您必须在您的计费控制器中使用
viewwilldissequence()
函数。试试那个

override func viewWillDisappear(_ animated: Bool) {
    SKPaymentQueue.default().remove(self)
}
我也遇到了这个问题,这也解决了我的问题

错误出现在代码中的
SKPaymentQueue.default().add(payment)
行。所以,试试这个解决方案,做一个可靠、高效的程序员。 快乐编码


如果我在
viewDidLoad()
中删除这一行
SKPaymentQueue.default().add(self)
,也可以解决问题。这种方式正确吗?不正确,因为
SKPaymentQueue.default().add(self)
它在应用程序购买弹出窗口中连接您的付款方式。。。这意味着这将为您提供完整的工作,因此在加载时这是必要的,这样您在应用程序启动时就不会出错。这很奇怪。如果我删除行
SKPaymentQueue.default().add(self)
我的应用内购买工作正常。我保存此行
SKPaymentQueue.default().add(付款)
func-buydroduct(product:SKProduct)
中。然后就可以继续了
override func viewWillDisappear(_ animated: Bool) {
    SKPaymentQueue.default().remove(self)
}