我已使用“IAPHelper”类设置了应用程序内购买。我可以从App Store中检索正确的信息并在一个VC中显示出来。一旦用户在该VC中选择了所需的购买项目,详细信息将显示在下一个名为“Review”的视图控制器上。这是实际购买的地方。我有一个“buyProduct”函数,它在这个ReviewVC中运行良好,并将产品付款发送到IAPHelper类的SKPaymentTransactionObserver的paymentQueue。
我需要通过“Review VC”中的弹出窗口解锁内容,一旦SKPaymentTransactionObserver中的购买状态显示为“已购买”,该窗口就会出现,因此我尝试了许多方法将此功能作为“已购买”的paymentQueue状态的一部分包括在内,但成功付款后应用程序总是崩溃,一旦它到达显示弹出窗口的函数。
这里有一些代码-我不会包括所有的IAPHelper代码,只是相关的部分:

open class IAPHelper: NSObject { ......
var review: ReviewVC! ...... }

extension IAPHelper: SKPaymentTransactionObserver {

    public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for trans in transactions {
            print("func IAPHelper = \(trans.transactionState.status(), trans.payment.productIdentifier)")
            switch trans.transactionState {
            case .purchasing: break
            case .purchased: complete(transaction: trans)
                break
            case .failed : fail(transaction: trans)
            case .restored : restore(transaction: trans)
            case .deferred : break
           // default: queue.finishTransaction(trans)
            }
        }
    }

    func complete(transaction: SKPaymentTransaction) {
        deliverPurchaseNotificationFor(identifier: transaction.payment.productIdentifier)
        SKPaymentQueue.default().finishTransaction(transaction)
        review.showSuccessPopUp() //***ERROR IS HERE***Thread 1: EXC_BREAKPOINT (code=1, subcode=0x10426ac70)*****

    }

这是ReviewVC文件中的代码:-
class ReviewVC: UIViewController {
 @IBAction func buyTestButton(_ sender: Any) {
        print("Buy button pressed - products = \(products?.localizedTitle ?? "No Product")")
        buyProduct()
    }

    func buyProduct() {
        let payment = SKPayment(product: products!)
        SKPaymentQueue.default().add(payment as SKPayment)

    }


    //SUCCESSFUL PURCHASE:-
    func showSuccessPopUp() {
        UIView.animate(withDuration: 0.4) {
            self.hideView.isHidden = false
        }
        UIView.animate(withDuration: 0.8) {
            self.successPopUp.isHidden = false
        }
    }

被困在这几天,所以任何帮助将非常感谢!!

最佳答案

问题是review就是nil
您将其声明为变量var review: ReviewVC!但是,您从未初始化它。
初始化类似于review = Something
不确定您的代码在哪里调用IAP(),但无论它在哪里,我都会执行如下操作:

var iap = IAP()
iap.review = self //if you are in the review class.

很难说,因为我不确定你在哪里声明你的IAP对象。

关于ios - iOS应用内购买-由于该功能位于另一个 View Controller 中,因此无法解锁内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53325923/

10-12 18:22