From 7e1900805f38d0d455b66c16573680ad5b602243 Mon Sep 17 00:00:00 2001 From: Andrea Bizzotto Date: Mon, 21 Aug 2017 09:24:35 +0100 Subject: [PATCH 1/3] Add ShouldAddStorePaymentHandler to PaymentQueueController and make it available through SwiftyStoreKit class --- SwiftyStoreKit/PaymentQueueController.swift | 6 ++++++ SwiftyStoreKit/SwiftyStoreKit+Types.swift | 2 ++ SwiftyStoreKit/SwiftyStoreKit.swift | 11 ++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/SwiftyStoreKit/PaymentQueueController.swift b/SwiftyStoreKit/PaymentQueueController.swift index 54220d8c..3cb3d91e 100644 --- a/SwiftyStoreKit/PaymentQueueController.swift +++ b/SwiftyStoreKit/PaymentQueueController.swift @@ -142,6 +142,8 @@ class PaymentQueueController: NSObject, SKPaymentTransactionObserver { } paymentQueue.finishTransaction(skTransaction) } + + var shouldAddStorePaymentHandler: ShouldAddStorePaymentHandler? // MARK: SKPaymentTransactionObserver func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { @@ -202,4 +204,8 @@ class PaymentQueueController: NSObject, SKPaymentTransactionObserver { } + func paymentQueue(_ queue: SKPaymentQueue, shouldAddStorePayment payment: SKPayment, for product: SKProduct) -> Bool { + + return shouldAddStorePaymentHandler?(payment, product) ?? false + } } diff --git a/SwiftyStoreKit/SwiftyStoreKit+Types.swift b/SwiftyStoreKit/SwiftyStoreKit+Types.swift index b41d6160..f6d78e0d 100644 --- a/SwiftyStoreKit/SwiftyStoreKit+Types.swift +++ b/SwiftyStoreKit/SwiftyStoreKit+Types.swift @@ -76,6 +76,8 @@ public struct RestoreResults { public let restoreFailedPurchases: [(SKError, String?)] } +public typealias ShouldAddStorePaymentHandler = (_ payment: SKPayment, _ product: SKProduct) -> Bool + // MARK: Receipt verification // Info for receipt returned by server diff --git a/SwiftyStoreKit/SwiftyStoreKit.swift b/SwiftyStoreKit/SwiftyStoreKit.swift index 2a2800bd..f3104757 100644 --- a/SwiftyStoreKit/SwiftyStoreKit.swift +++ b/SwiftyStoreKit/SwiftyStoreKit.swift @@ -28,7 +28,7 @@ public class SwiftyStoreKit { private let productsInfoController: ProductsInfoController - private let paymentQueueController: PaymentQueueController + fileprivate let paymentQueueController: PaymentQueueController fileprivate let receiptVerificator: InAppReceiptVerificator @@ -204,6 +204,15 @@ extension SwiftyStoreKit { sharedInstance.finishTransaction(transaction) } + + /** + * Register a handler for SKPaymentQueue.shouldAddStorePayment delegate method in iOS 11 + */ + public static var shouldAddStorePaymentHandler: ShouldAddStorePaymentHandler? { + didSet { + sharedInstance.paymentQueueController.shouldAddStorePaymentHandler = shouldAddStorePaymentHandler + } + } } extension SwiftyStoreKit { From 6a4f0abfc0ffc4dc3119094197a75e0cb45125d2 Mon Sep 17 00:00:00 2001 From: Andrea Bizzotto Date: Mon, 21 Aug 2017 09:32:33 +0100 Subject: [PATCH 2/3] shouldAddStorePayment unit tests --- .../PaymentQueueControllerTests.swift | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/SwiftyStoreKitTests/PaymentQueueControllerTests.swift b/SwiftyStoreKitTests/PaymentQueueControllerTests.swift index 8cd43197..93faa31a 100644 --- a/SwiftyStoreKitTests/PaymentQueueControllerTests.swift +++ b/SwiftyStoreKitTests/PaymentQueueControllerTests.swift @@ -249,6 +249,44 @@ class PaymentQueueControllerTests: XCTestCase { XCTAssertTrue(restorePurchasesCallbackCalled) XCTAssertTrue(completeTransactionsCallbackCalled) } + + // MARK: shouldAddStorePayment tests + func testPaymentQueue_when_shouldAddStorePaymentHandlerIsNil_then_shouldAddStorePaymentReturnsFalse() { + + let spy = PaymentQueueSpy() + + let paymentQueueController = PaymentQueueController(paymentQueue: spy) + + paymentQueueController.shouldAddStorePaymentHandler = nil + + XCTAssertFalse(paymentQueueController.paymentQueue(SKPaymentQueue(), shouldAddStorePayment: SKPayment(), for: SKProduct())) + } + + func testPaymentQueue_when_shouldAddStorePaymentHandlerReturnsTrue_then_shouldAddStorePaymentReturnsTrue() { + + let spy = PaymentQueueSpy() + + let paymentQueueController = PaymentQueueController(paymentQueue: spy) + + paymentQueueController.shouldAddStorePaymentHandler = { payment, product in + return true + } + + XCTAssertTrue(paymentQueueController.paymentQueue(SKPaymentQueue(), shouldAddStorePayment: SKPayment(), for: SKProduct())) + } + + func testPaymentQueue_when_shouldAddStorePaymentHandlerReturnsFalse_then_shouldAddStorePaymentReturnsFalse() { + + let spy = PaymentQueueSpy() + + let paymentQueueController = PaymentQueueController(paymentQueue: spy) + + paymentQueueController.shouldAddStorePaymentHandler = { payment, product in + return false + } + + XCTAssertFalse(paymentQueueController.paymentQueue(SKPaymentQueue(), shouldAddStorePayment: SKPayment(), for: SKProduct())) + } // MARK: Helpers func makeTestPaymentTransaction(productIdentifier: String, transactionState: SKPaymentTransactionState) -> TestPaymentTransaction { From ffd6825f20522111a0b97a74746df3b3b3db496c Mon Sep 17 00:00:00 2001 From: Andrea Bizzotto Date: Mon, 21 Aug 2017 09:43:57 +0100 Subject: [PATCH 3/3] Update CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff245b5c..c477b62b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to this project will be documented in this file. +## 0.10.6 Add support for shouldAddStorePayment + +* Add support for the new SKPaymentTransactionObserver.shouldAddStorePayment method in iOS 11 + ## 0.10.5 Filter out transactions in purchasing state * Filter out all transactions with state == .purchasing early in purchase flows (related to [#169](https://github.com/bizz84/SwiftyStoreKit/issues/169), [#188](https://github.com/bizz84/SwiftyStoreKit/pull/188), [#179](https://github.com/bizz84/SwiftyStoreKit/issues/179)) * Sample app: print localized description when a purchase fails with `.unknown` error