У меня есть приложение, в которое я включаюсь в покупку приложения, и я использую 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
Я не знаю, что я делаю неправильно, и был бы рад, если бы кто-нибудь мог указать мне правильное направление