Покупка iOS в приложении - невозможно разблокировать контент, так как функция находится в другом контроллере представления - PullRequest
0 голосов
/ 15 ноября 2018

Я настроил покупку в приложении, используя класс IAPHelper. Я могу получить правильную информацию из App Store и отобразить ее в одном VC. Как только пользователь выбирает необходимый элемент покупки в этом VC, подробности отображаются на следующем View Controller, который называется «Просмотр». Здесь происходит фактическая покупка. У меня есть функция «buyProduct», которая отлично работает в этом ReviewVC и отправляет платеж по продукту в paymentQueue SKPaymentTransactionObserver класса IAPHelper. Мне нужно разблокировать контент через всплывающее окно в «Просмотр ВК», которое должно появиться, как только статус покупки отображается как «купленный» в 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
        }
    }

Застрял на этом в течение нескольких дней, поэтому любая помощь будет высоко ценится !!

1 Ответ

0 голосов
/ 16 ноября 2018

Проблема в том, что review равно nil.

Вы объявляете его как переменную var review: ReviewVC!, однако вы никогда не инициализируете его.

Инициализация - это что-то вроде review = Something.

Не уверен, где ваш код вызывает IAP(), но где бы он ни был, я бы сделал что-то вроде:

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

Трудно сказать, поскольку я не уверен, где вы объявляете свой объект IAP.

...