iOS Приложение предлагает пользователю «Подтвердить покупку в приложении» с паролем после покупки для восстановления - PullRequest
0 голосов
/ 27 января 2020

В настоящее время я пытаюсь внедрить кнопку «Восстановить покупку» в моем непотребляемом продукте при покупке приложения. Однако, хотя кнопка «Восстановить покупку» работает правильно (восстанавливает прошлую покупку пользователя), приложение также выдает пользователю предупреждение «Подтвердите покупку в приложении». Этот тип оповещения не должен появляться во время покупки для восстановления и должен появляться только во время реальной покупки. Снимок экрана предупреждения «Подтвердите покупку»

enter image description here

Обратите внимание, что пользователь может нажать «Отмена» в предупреждении «Подтвердить покупку», и покупка по-прежнему будет восстановлена .

Ниже приведен код, который я использую:

class RemoveAdsViewController: UIViewController, SKPaymentTransactionObserver, SKProductsRequestDelegate {

    @IBOutlet weak var removeAdsButton: UIButton!
    @IBOutlet weak var restorePurchaseButton: UIButton!

    var product: SKProduct?
    var productID = "<INSERT_PRODUCT_ID>"

    @IBAction func removeAds(_ sender: Any) {
        let paymentRequest = SKMutablePayment()
        paymentRequest.productIdentifier = productID
        SKPaymentQueue.default().add(paymentRequest)
    }

    @IBAction func restorePurchase(_ sender: Any) {
        SKPaymentQueue.default().restoreCompletedTransactions()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        removeAdsButton.isEnabled = false
        restorePurchaseButton.isHidden = true

        if (!removedAds) {
            removeAdsButton.setTitle("Connecting to App Store...", for: .normal)
            removeAdsButton.titleLabel?.font = removeAdsButton.titleLabel?.font.withSize(20)
            SKPaymentQueue.default().add(self)
            getPuchaseInfo()
        } else {
            removeAdsButton.setTitle("Purchased", for: .normal)
        }
    }

    func getPuchaseInfo() {
        if SKPaymentQueue.canMakePayments() {
            let request = SKProductsRequest(productIdentifiers: NSSet(object: self.productID) as! Set<String>)
            request.delegate = self
            request.start()
        } else {
            removeAdsButton.setTitle("Purchase Disabled", for: .normal)
        }
    }

    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        let products = response.products
        if (products.count == 0) {
            DispatchQueue.main.async {
                self.removeAdsButton.setTitle("Purchase Not Found", for: .normal)
            }
        } else {
            product = products[0]
            DispatchQueue.main.async {
                self.removeAdsButton.isEnabled = true
                self.restorePurchaseButton.isHidden = false
                self.removeAdsButton.setTitle("Remove Ads (\(self.product!.localizedPrice))", for: .normal)
                self.removeAdsButton.titleLabel?.font = self.removeAdsButton.titleLabel?.font.withSize(28)
            }
        }
        let invalids = response.invalidProductIdentifiers
        for product in invalids {
            print("product not found: \(product)")
        }
    }

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch transaction.transactionState {
            case SKPaymentTransactionState.purchased:
                //user purchased remove ads
                SKPaymentQueue.default().finishTransaction(transaction)
                removeAdsButton.setTitle("Purchased", for: .normal)
                removeAdsButton.isEnabled = false
                restorePurchaseButton.isHidden = true
                removedAds = true
                UserDefaults.standard.set(true, forKey: "removedAds")

            case SKPaymentTransactionState.restored:
                //user restored purchase
                SKPaymentQueue.default().finishTransaction(transaction)
                removeAdsButton.setTitle("Purchased", for: .normal)
                removeAdsButton.isEnabled = false
                restorePurchaseButton.isHidden = true
                removedAds = true
                UserDefaults.standard.set(true, forKey: "removedAds")

            case SKPaymentTransactionState.failed:
                SKPaymentQueue.default().finishTransaction(transaction)

            default:
                break
            }
        }
    }

}
extension SKProduct {
    var localizedPrice: String {
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.locale = priceLocale
        return formatter.string(from: price)!
    }
} 

Как мне сделать так, чтобы во время покупки с восстановлением не появлялось предупреждение «Подтвердите покупку в приложении»

1 Ответ

0 голосов
/ 28 января 2020

Это приглашение будет появляться каждый раз, когда вы пытаетесь получить доступ к файлу квитанции, и его нет. Похоже, что вы можете столкнуться с тем, что квитанции песочницы на самом деле не доступны на устройстве до тех пор, пока вы не совершите покупку.

В процессе производства квитанция для Apple Id генерируется при загрузке приложения, поэтому пользователь может восстановить в любое время и не увидит эту подсказку. В песочнице квитанция недоступна при установке приложения - она ​​добавляется в файлы приложения после совершения покупки. Чтобы полностью протестировать восстановление в «песочнице», вам необходимо совершить покупку, дать ей истечь и затем запустить восстановление - если вы удаляете или перестраиваете из XCode в любой момент, квитанция очищается. Это только одна из радостей песочницы Apple :)

...