From 59d79b2577b7126740433408432a3b154ef606bf Mon Sep 17 00:00:00 2001 From: Andrea Bizzotto Date: Thu, 11 May 2017 17:04:34 +0100 Subject: [PATCH 1/3] Nest SKProduct and Purchase inside PurchaseDetails type when making a purchase. --- SwiftyStoreKit-iOS-Demo/ViewController.swift | 6 +++--- SwiftyStoreKit/PaymentQueueController.swift | 2 +- SwiftyStoreKit/PaymentsController.swift | 7 ++++--- SwiftyStoreKit/SwiftyStoreKit+Types.swift | 7 ++++++- SwiftyStoreKit/SwiftyStoreKit.swift | 4 ++-- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/SwiftyStoreKit-iOS-Demo/ViewController.swift b/SwiftyStoreKit-iOS-Demo/ViewController.swift index a6b41689..757aaa4b 100644 --- a/SwiftyStoreKit-iOS-Demo/ViewController.swift +++ b/SwiftyStoreKit-iOS-Demo/ViewController.swift @@ -81,8 +81,8 @@ class ViewController: UIViewController { if case .success(let purchase) = result { // Deliver content from server, then: - if purchase.needsFinishTransaction { - SwiftyStoreKit.finishTransaction(purchase.transaction) + if purchase.purchase.needsFinishTransaction { + SwiftyStoreKit.finishTransaction(purchase.purchase.transaction) } } if let alert = self.alertForPurchaseResult(result) { @@ -217,7 +217,7 @@ extension ViewController { func alertForPurchaseResult(_ result: PurchaseResult) -> UIAlertController? { switch result { case .success(let purchase): - print("Purchase Success: \(purchase.productId)") + print("Purchase Success: \(purchase.purchase.productId)") return alertWithTitle("Thank You", message: "Purchase completed") case .error(let error): print("Purchase Failed: \(error)") diff --git a/SwiftyStoreKit/PaymentQueueController.swift b/SwiftyStoreKit/PaymentQueueController.swift index 8fac06a9..4dfb4361 100644 --- a/SwiftyStoreKit/PaymentQueueController.swift +++ b/SwiftyStoreKit/PaymentQueueController.swift @@ -36,7 +36,7 @@ protocol TransactionController { } public enum TransactionResult { - case purchased(purchase: Purchase) + case purchased(purchase: PurchaseDetails) case restored(purchase: Purchase) case failed(error: SKError) } diff --git a/SwiftyStoreKit/PaymentsController.swift b/SwiftyStoreKit/PaymentsController.swift index 4391e195..b50b5312 100644 --- a/SwiftyStoreKit/PaymentsController.swift +++ b/SwiftyStoreKit/PaymentsController.swift @@ -72,10 +72,11 @@ class PaymentsController: TransactionController { let transactionState = transaction.transactionState if transactionState == .purchased { - + let purchase = Purchase(productId: transactionProductIdentifier, quantity: transaction.payment.quantity, transaction: transaction, originalTransaction: transaction.original, needsFinishTransaction: !payment.atomically) - - payment.callback(.purchased(purchase: purchase)) + let purchaseDetails = PurchaseDetails(purchase: purchase, product: payment.product) + + payment.callback(.purchased(purchase: purchaseDetails)) if payment.atomically { paymentQueue.finishTransaction(transaction) diff --git a/SwiftyStoreKit/SwiftyStoreKit+Types.swift b/SwiftyStoreKit/SwiftyStoreKit+Types.swift index 22254a2c..eeda1533 100644 --- a/SwiftyStoreKit/SwiftyStoreKit+Types.swift +++ b/SwiftyStoreKit/SwiftyStoreKit+Types.swift @@ -35,6 +35,11 @@ public struct Purchase { public let needsFinishTransaction: Bool } +public struct PurchaseDetails { + public let purchase: Purchase + public let product: SKProduct +} + //Conform to this protocol to provide custom receipt validator public protocol ReceiptValidator { func validate(receipt: String, password autoRenewPassword: String?, completion: @escaping (VerifyReceiptResult) -> Void) @@ -58,7 +63,7 @@ public struct RetrieveResults { // Purchase result public enum PurchaseResult { - case success(purchase: Purchase) + case success(purchase: PurchaseDetails) case error(error: SKError) } diff --git a/SwiftyStoreKit/SwiftyStoreKit.swift b/SwiftyStoreKit/SwiftyStoreKit.swift index 7471618f..89f0a2d7 100644 --- a/SwiftyStoreKit/SwiftyStoreKit.swift +++ b/SwiftyStoreKit/SwiftyStoreKit.swift @@ -132,8 +132,8 @@ public class SwiftyStoreKit { for result in results { switch result { case .purchased(let purchase): - let error = storeInternalError(description: "Cannot purchase product \(purchase.productId) from restore purchases path") - restoreFailedPurchases.append((error, purchase.productId)) + let error = storeInternalError(description: "Cannot purchase product \(purchase.purchase.productId) from restore purchases path") + restoreFailedPurchases.append((error, purchase.purchase.productId)) case .failed(let error): restoreFailedPurchases.append((error, nil)) case .restored(let purchase): From 447ba744edbea983692cf37d5a6b015545cd59ff Mon Sep 17 00:00:00 2001 From: Andrea Bizzotto Date: Thu, 11 May 2017 17:11:40 +0100 Subject: [PATCH 2/3] Flatten PurchaseDetails to be the same as Purchase with the additional SKProduct value --- SwiftyStoreKit-iOS-Demo/ViewController.swift | 6 +++--- SwiftyStoreKit/PaymentsController.swift | 5 ++--- SwiftyStoreKit/SwiftyStoreKit+Types.swift | 6 +++++- SwiftyStoreKit/SwiftyStoreKit.swift | 4 ++-- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/SwiftyStoreKit-iOS-Demo/ViewController.swift b/SwiftyStoreKit-iOS-Demo/ViewController.swift index 757aaa4b..a6b41689 100644 --- a/SwiftyStoreKit-iOS-Demo/ViewController.swift +++ b/SwiftyStoreKit-iOS-Demo/ViewController.swift @@ -81,8 +81,8 @@ class ViewController: UIViewController { if case .success(let purchase) = result { // Deliver content from server, then: - if purchase.purchase.needsFinishTransaction { - SwiftyStoreKit.finishTransaction(purchase.purchase.transaction) + if purchase.needsFinishTransaction { + SwiftyStoreKit.finishTransaction(purchase.transaction) } } if let alert = self.alertForPurchaseResult(result) { @@ -217,7 +217,7 @@ extension ViewController { func alertForPurchaseResult(_ result: PurchaseResult) -> UIAlertController? { switch result { case .success(let purchase): - print("Purchase Success: \(purchase.purchase.productId)") + print("Purchase Success: \(purchase.productId)") return alertWithTitle("Thank You", message: "Purchase completed") case .error(let error): print("Purchase Failed: \(error)") diff --git a/SwiftyStoreKit/PaymentsController.swift b/SwiftyStoreKit/PaymentsController.swift index b50b5312..555b76ff 100644 --- a/SwiftyStoreKit/PaymentsController.swift +++ b/SwiftyStoreKit/PaymentsController.swift @@ -73,10 +73,9 @@ class PaymentsController: TransactionController { if transactionState == .purchased { - let purchase = Purchase(productId: transactionProductIdentifier, quantity: transaction.payment.quantity, transaction: transaction, originalTransaction: transaction.original, needsFinishTransaction: !payment.atomically) - let purchaseDetails = PurchaseDetails(purchase: purchase, product: payment.product) + let purchase = PurchaseDetails(productId: transactionProductIdentifier, quantity: transaction.payment.quantity, product: payment.product, transaction: transaction, originalTransaction: transaction.original, needsFinishTransaction: !payment.atomically) - payment.callback(.purchased(purchase: purchaseDetails)) + payment.callback(.purchased(purchase: purchase)) if payment.atomically { paymentQueue.finishTransaction(transaction) diff --git a/SwiftyStoreKit/SwiftyStoreKit+Types.swift b/SwiftyStoreKit/SwiftyStoreKit+Types.swift index eeda1533..1524124a 100644 --- a/SwiftyStoreKit/SwiftyStoreKit+Types.swift +++ b/SwiftyStoreKit/SwiftyStoreKit+Types.swift @@ -36,8 +36,12 @@ public struct Purchase { } public struct PurchaseDetails { - public let purchase: Purchase + public let productId: String + public let quantity: Int public let product: SKProduct + public let transaction: PaymentTransaction + public let originalTransaction: PaymentTransaction? + public let needsFinishTransaction: Bool } //Conform to this protocol to provide custom receipt validator diff --git a/SwiftyStoreKit/SwiftyStoreKit.swift b/SwiftyStoreKit/SwiftyStoreKit.swift index 89f0a2d7..7471618f 100644 --- a/SwiftyStoreKit/SwiftyStoreKit.swift +++ b/SwiftyStoreKit/SwiftyStoreKit.swift @@ -132,8 +132,8 @@ public class SwiftyStoreKit { for result in results { switch result { case .purchased(let purchase): - let error = storeInternalError(description: "Cannot purchase product \(purchase.purchase.productId) from restore purchases path") - restoreFailedPurchases.append((error, purchase.purchase.productId)) + let error = storeInternalError(description: "Cannot purchase product \(purchase.productId) from restore purchases path") + restoreFailedPurchases.append((error, purchase.productId)) case .failed(let error): restoreFailedPurchases.append((error, nil)) case .restored(let purchase): From 6fec81b0cf2dab633d92a39de66871267fc04cb0 Mon Sep 17 00:00:00 2001 From: Andrea Bizzotto Date: Thu, 11 May 2017 17:31:20 +0100 Subject: [PATCH 3/3] Remove originalTransaction from PurchaseDetails as it's only used when restoring products --- SwiftyStoreKit/PaymentsController.swift | 2 +- SwiftyStoreKit/SwiftyStoreKit+Types.swift | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/SwiftyStoreKit/PaymentsController.swift b/SwiftyStoreKit/PaymentsController.swift index 555b76ff..9672d373 100644 --- a/SwiftyStoreKit/PaymentsController.swift +++ b/SwiftyStoreKit/PaymentsController.swift @@ -73,7 +73,7 @@ class PaymentsController: TransactionController { if transactionState == .purchased { - let purchase = PurchaseDetails(productId: transactionProductIdentifier, quantity: transaction.payment.quantity, product: payment.product, transaction: transaction, originalTransaction: transaction.original, needsFinishTransaction: !payment.atomically) + let purchase = PurchaseDetails(productId: transactionProductIdentifier, quantity: transaction.payment.quantity, product: payment.product, transaction: transaction, needsFinishTransaction: !payment.atomically) payment.callback(.purchased(purchase: purchase)) diff --git a/SwiftyStoreKit/SwiftyStoreKit+Types.swift b/SwiftyStoreKit/SwiftyStoreKit+Types.swift index 1524124a..cd193b9e 100644 --- a/SwiftyStoreKit/SwiftyStoreKit+Types.swift +++ b/SwiftyStoreKit/SwiftyStoreKit+Types.swift @@ -40,7 +40,6 @@ public struct PurchaseDetails { public let quantity: Int public let product: SKProduct public let transaction: PaymentTransaction - public let originalTransaction: PaymentTransaction? public let needsFinishTransaction: Bool }