Creé una función de compra en la aplicación para la aplicación, usando una suscripción de renovación automática. El problema es que no estoy seguro de cómo comprobar el estado de la compra, si la suscripción se ha agotado o sigue activa.
Aquí es donde trato de guardar el estado comprado:
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { print("add payment") for transaction: AnyObject in transactions { let trans = transaction as! SKPaymentTransaction print(trans.error) switch trans.transactionState { case .purchased: print("buy ok, unlock IAP HERE") print(p.productIdentifier) let prodID = p.productIdentifier switch prodID { case "com.test.UnlockTools.Subscription1": print("tool set 1 unlocked") uTool1() print("tool set 2 unlocked") uTool2() print("tool set 3 unlocked") uTool3() UserDefaults.standard.set(true, forKey: "isSubbed") default: print("IAP not found") } queue.finishTransaction(trans) case .failed: print("buy error") queue.finishTransaction(trans) break default: print("Default") break } } }Aquí es donde llamo a UserDefaults y permito o niego la interacción del botón:
override func viewDidLoad() { super.viewDidLoad() if(SKPaymentQueue.canMakePayments()) { print("IAP is enabled, loading") let productID: NSSet = NSSet(object: "com.test.UnlockTools.Subscription1") let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>) request.delegate = self request.start() } else { print("please enable IAPS") } status = UserDefaults.standard.bool(forKey: "isSubbed") ?? false if status == true { unlockTool1.isUserInteractionEnabled = true unlockTool2.isUserInteractionEnabled = true unlockTool3.isUserInteractionEnabled = true } else { unlockTool1.isUserInteractionEnabled = false unlockTool2.isUserInteractionEnabled = false unlockTool3.isUserInteractionEnabled = false } }Si descubro el estado, podré guardar el estado como verdadero/falso. Intenté usar UserDefaults con cierto éxito. Sin embargo, no estoy seguro si coloqué el código en la mejor ubicación.
Si la suscripción aún está activa, me gustaría permitir que el usuario haga clic en un botón y denegar el clic del botón si la suscripción se agotó.
Agregaré más código si es necesario. Cualquier ayuda sería muy apreciada.
La única forma de verificar el estado de la suscripción es verificar el recibo con Apple para ver si aún es válido usando su /verifyReceipt endpoint - docs .
Lo que podría hacer es almacenar en caché alguna fecha de vencimiento después de la compra y usarla para verificar si la suscripción es válida. Si ha pasado la fecha de vencimiento, puede volver a verificar el recibo con Apple para ver si está renovado. También hay casos extremos en los que se reembolsa a un usuario y su suscripción se cancela antes de la fecha de vencimiento; debe actualizar sus recibos periódicamente con Apple para verificar este caso. Idealmente, todo esto debería ocurrir también en el lado del servidor para evitar la piratería.
Aquí hay una gran publicación que resume muy bien los detalles de las suscripciones de Apple: Las suscripciones de iOS son difíciles