Проблема с восстановлением покупки для автообновляемой подписки - PullRequest
0 голосов
/ 04 июля 2019

Я следовал этому учебнику , чтобы добавить автоматически возобновляемую подписку для моего приложения.Мое приложение было выпущено в магазине приложений, но у меня возникла очень странная проблема: если пользователь нажмет кнопку «Восстановить покупку», он разблокирует функцию без покупки !.Я работал с IAP и никогда раньше такого не было!Вот мой код. В IAPManager.swift я добавил две строки кодов, которые запускают метод после завершения покупки / восстановления.

 private func productPurchaseCompleted(identifier: ProductID?) {

    guard let identifier = identifier else { return }

    purchasedProductIDs.insert(identifier)
    UserDefaults.standard.set(true, forKey: identifier)
    productPurchaseCompletionHandler?(true, identifier)
    clearHandler()

    //Added by me
    appDefaults.isDirectory(purchased: true)
    NotificationCenter.default.post(name: NSNotification.Name("completePurchase"), object: nil)

  }

В моем контроллере представления покупки:

override func viewWillAppear(_ animated: Bool) {
        //Register notifications
           NotificationCenter.default.addObserver(self, selector: #selector(completePurchase), name: NSNotification.Name("completePurchase"), object: nil)

    }

кнопки покупки и восстановления:

//MARK: - Purchase IAP and its methods


  @IBAction func purchaseDirectory(_ sender: Any) {

        purchaseItemIndex(index: 0)
        loading.alpha = 1

    }


    @IBAction func restorePurchase(_ sender: Any) {
        IAPProducts.store.restorePurchases()
        loading.alpha = 1
    }


    private func purchaseItemIndex(index: Int) {
        IAPProducts.store.buyProduct(products[index]) { [weak self] success, productId in
            guard let self = self else { return }
            guard success else {
                let alertController = UIAlertController(title: "Failed to purchase product",
                                                        message: "Check logs for details",
                                                        preferredStyle: .alert)
                alertController.addAction(UIAlertAction(title: "OK", style: .default))
                self.present(alertController, animated: true, completion: nil)
                return
            }
        }
    }

И, наконец, завершить функцию покупки:

 @objc func completePurchase() {
        let alert = UIAlertController(title: "Thank You!", message: "You can now access to directory", preferredStyle: .alert)
        let action0 = UIAlertAction(title: "OK", style: .cancel, handler: { (click) in
            self.removeAllViewControllers()
            self.presentViewControlleryStoryboard(id: "HOME")
        })

        alert.addAction(action0)
        present(alert, animated: true, completion: nil)

        loading.alpha = 0
    }

Кто-нибудь знает, почему это происходит?Есть ли какая-либо разница между, например, неиспользуемой IAP и подпиской с автоматическим продлением?

Я должен подтвердить, что покупка с восстановлением работает должным образом в среде песочницы

1 Ответ

0 голосов
/ 10 июля 2019

Я не знаю, какой у вас IAPProducts, но, поскольку вы пометили storekit, вы должны реализовать его так, как призывает Apple.

Вот учебник от Apple, подробно описывающий, как это сделать:

В частности, это то, что вы хотите сделать.

/// Called when tapping the "Restore" button in the UI.
@IBAction func restore(_ sender: UIBarButtonItem) {
// Calls StoreObserver to restore all restorable purchases.
StoreObserver.shared.restore()
}

В частности, вы захотите использовать restoreCompletedTransactions () , которая позволит вам восстанавливать автоматически обновляемые подписки. Тогда, если это правда, вы захотите установить appDefaults.isDirectory(purchased: true) как true.

Наконец, если вы хотите получить дополнительную информацию, это лучшее руководство от Apple о ресурсах с IAP (в приложениях-покупках)

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