сохранение стоимости покупки приложения в связке ключей с использованием сторонней библиотеки - PullRequest
0 голосов
/ 19 октября 2018

У меня есть приложение, в которое я включаюсь в покупку приложения, и я использую SwiftyStoreKit , который работает фантастически хорошо.В целом покупка приложения работает нормально, но проблема, с которой я сейчас сталкиваюсь, заключается в том, что у меня есть несколько отключенных кнопок, которые я хотел бы включить, когда пользователь совершает покупку и покупка успешна.Использование Userdefaults может быть простым путем, но это небезопасно, и поэтому я чувствовал, что лучше использовать keychain, поэтому я решил включить связку ключей с этой сторонней библиотекой KeychainAccess в свое приложение со сторонней библиотекойи мой код выглядит следующим образом

func setNonConsumablePurchase(_ status: Bool, identifier: String?) {

        let keychain = Keychain(service: "com.companyname.appname.iapService")
        guard let identifier = identifier else {return}
        UserDefaults.standard.set(status, forKey: "nonConsumablePurchaseWasMade")
        do {
            try keychain.set("purchased", key: IAPsConfig.appBundle + "." + identifier)
            }
            catch let error {
                print("setting keychain to purchased failed")
                print(error)
            }
    }

    func isProductPurchased(identifier: IAPsConfig.RegisteredPurchase, completion: @escaping CompletionHandler) {

        let keychain = Keychain(service: "com.companyname.appname.iapService")
        let value = IAPsConfig.appBundle + "." + identifier.rawValue


        // if there is value correspond to the productIdentifier key in the keychain
        if (try? keychain.get(identifier.rawValue)) == value{

            completion(true)

        } else {
            // the product has not been purchased previously, do nothing
            print("Not purchased: \(identifier)")
        }

    }



    func purchase(viewController: UIViewController, purchase: IAPsConfig.RegisteredPurchase, sharedSecret: String, type: IAPsConfig.PurchaseType, atomically: Bool, validDuration: TimeInterval? = nil) -> Void {


        NetworkActivityIndicatorManager.networkOperationStarted()
        if type == .simple {
            SwiftyStoreKit.retrieveProductsInfo([IAPsConfig.appBundle + "." + purchase.rawValue]) { result in
                if let product = result.retrievedProducts.first {
                    SwiftyStoreKit.purchaseProduct(product, quantity: 1, atomically: atomically) { result in

                        NetworkActivityIndicatorManager.networkOperationFinished()

                        if case .success(let purchased) = result {
                            let downloads = purchased.transaction.downloads
                            if !downloads.isEmpty {
                                SwiftyStoreKit.start(downloads)
                            }
                            self.setNonConsumablePurchase(true, identifier: purchase.rawValue)
                            // Deliver content from server, then:
                            if purchased.needsFinishTransaction {
                                SwiftyStoreKit.finishTransaction(purchased.transaction)
                            }
                        }
                        if let alert = IAPAlerts.instance.alertForPurchaseResult(result) {
                            self.showAlert(alert, viewController: viewController)
                        }
                    }
                }
            }
        } else {

            SwiftyStoreKit.purchaseProduct(IAPsConfig.appBundle + "." + purchase.rawValue, atomically: atomically) { result in
                NetworkActivityIndicatorManager.networkOperationFinished()

                if case .success(let purchased) = result {
                    let downloads = purchased.transaction.downloads
                    if !downloads.isEmpty {
                        SwiftyStoreKit.start(downloads)
                    }
                    self.setNonConsumablePurchase(true, identifier: purchase.rawValue)
                    // Deliver content from server, then:
                    if purchased.needsFinishTransaction {
                        SwiftyStoreKit.finishTransaction(purchased.transaction)
                    }
                }

                if let alert = IAPAlerts.instance.alertForPurchaseResult(result) {
                    self.showAlert(alert, viewController: viewController)
                }

                guard let validDuration = validDuration else {return}
                self.verifyPurchase(viewController: viewController, purchase, validDuration: validDuration)
            }
        }

    }

мой viewcontroller, который я сделал

 @IBAction func buyAutoRenew1(_ sender: Any) {
        IAPServices.instance.purchase(viewController: self, purchase: .Subscription1, sharedSecret: IAPsConfig.sharedSecret, type: .autoRenew, atomically: true, validDuration: TimeInterval(60))
    }

 override func viewDidLoad() {
        super.viewDidLoad()
        IAPServices.instance.isProductPurchased(identifier: .Subscription1) { (success) in

            if success {
                print("BOUGHT ALREADY")
            } else {
                print("Not BOUGHT AT ALL")
            }
        }
    }

после покупки и загрузки Viewcontroller снова, я все еще получил

Not purchased: Subscription1

Я не знаю, что я делаю неправильно, и был бы рад, если бы кто-нибудь мог указать мне правильное направление

...