Как правильно обрабатывать покупки в приложениях для приложений iOS и как определить продукт? - PullRequest
0 голосов
/ 14 октября 2018

Я следовал этому руководству , чтобы настроить покупку в приложении в моем приложении.Я все сделал и настроил в App Store Connect.Моя проблема в том, что фактическая покупка в настоящий момент является просто логическим значением в UserDefaults для ArePagesUnlocked = true Но у меня возникают проблемы с тем, где я на самом деле определяю это в продукте.Я понимаю, как настроить и управлять покупками и восстановлением, но где я на самом деле определяю продукт как инструкцию по изменению значения ArePagesUnlocked с false на true, по действию кнопки «Купить»?Я попробовал это, но если не было никакого соединения, то пользователь все еще разблокировал это.Должен ли я построить это отдельно и отправить его?Я просто запутался во время своего исследования и не нашел четкого ответа, поэтому любая помощь будет оценена.Спасибо.

РЕДАКТИРОВАТЬ: код:

   public init(productIds: Set<ProductIdentifier>) {
    productIdentifiers = productIds
    for productIdentifier in productIds {
        let purchased = UserDefaults.standard.bool(forKey: productIdentifier) // this i use to see if purchased
        if purchased {
            purchasedProductIdentifiers.insert(productIdentifier)
            print("Previously purchased: \(productIdentifier)")
        } else {
            print("Not purchased: \(productIdentifier)")
        }
    }
    super.init()

    SKPaymentQueue.default().add(self)
}
}

Нужно ли добавить отдельное значение UD из приведенного выше?Кажется, он не знает, что приобрел, пока я не перезапущу приложение, как я могу сделать это мгновенно?

extension IAPHelper: SKPaymentTransactionObserver {

public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        switch (transaction.transactionState) {
        case .purchased:
            complete(transaction: transaction)
            break
        case .failed:
            fail(transaction: transaction)
            break
        case .restored:
            restore(transaction: transaction)
            break
        case .deferred:
            break
        case .purchasing:
            break
        }
    }
}

private func complete(transaction: SKPaymentTransaction) {
    print("complete...")
    deliverPurchaseNotificationFor(identifier: transaction.payment.productIdentifier)
    SKPaymentQueue.default().finishTransaction(transaction)
}

private func restore(transaction: SKPaymentTransaction) {
    guard let productIdentifier = transaction.original?.payment.productIdentifier else { return }

    print("restore... \(productIdentifier)")
    deliverPurchaseNotificationFor(identifier: productIdentifier)
    SKPaymentQueue.default().finishTransaction(transaction)
}

private func fail(transaction: SKPaymentTransaction) {
    print("fail...")
    if let transactionError = transaction.error as NSError?,
        let localizedDescription = transaction.error?.localizedDescription,
        transactionError.code != SKError.paymentCancelled.rawValue {
        print("Transaction Error: \(localizedDescription)")
    }

    SKPaymentQueue.default().finishTransaction(transaction)
}

private func deliverPurchaseNotificationFor(identifier: String?) {
    guard let identifier = identifier else { return }

    purchasedProductIdentifiers.insert(identifier)
    UserDefaults.standard.set(true, forKey: identifier)
    NotificationCenter.default.post(name: .IAPHelperPurchaseNotification, object: identifier)
}

1 Ответ

0 голосов
/ 14 октября 2018

Обычная стратегия заключается в том, что в вашем paymentQueue(_:updatedTransactions:) вы записываете пользовательские значения по умолчанию, если пользователь покупает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...