Procházet zdrojové kódy

Merge pull request #257 from bizz84/feature/should-add-store-payment

Should add store payment iOS 11 support
Andrea Bizzotto před 8 roky
rodič
revize
3a8dc2f7cb

+ 4 - 0
CHANGELOG.md

@@ -2,6 +2,10 @@
 
 
 All notable changes to this project will be documented in this file.
 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
 ## 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))
 * 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
 * Sample app: print localized description when a purchase fails with `.unknown` error

+ 6 - 0
SwiftyStoreKit/PaymentQueueController.swift

@@ -142,6 +142,8 @@ class PaymentQueueController: NSObject, SKPaymentTransactionObserver {
         }
         }
         paymentQueue.finishTransaction(skTransaction)
         paymentQueue.finishTransaction(skTransaction)
     }
     }
+    
+    var shouldAddStorePaymentHandler: ShouldAddStorePaymentHandler?
 
 
     // MARK: SKPaymentTransactionObserver
     // MARK: SKPaymentTransactionObserver
     func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
     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
+    }
 }
 }

+ 2 - 0
SwiftyStoreKit/SwiftyStoreKit+Types.swift

@@ -76,6 +76,8 @@ public struct RestoreResults {
     public let restoreFailedPurchases: [(SKError, String?)]
     public let restoreFailedPurchases: [(SKError, String?)]
 }
 }
 
 
+public typealias ShouldAddStorePaymentHandler = (_ payment: SKPayment, _ product: SKProduct) -> Bool
+
 // MARK: Receipt verification
 // MARK: Receipt verification
 
 
 // Info for receipt returned by server
 // Info for receipt returned by server

+ 10 - 1
SwiftyStoreKit/SwiftyStoreKit.swift

@@ -28,7 +28,7 @@ public class SwiftyStoreKit {
 
 
     private let productsInfoController: ProductsInfoController
     private let productsInfoController: ProductsInfoController
 
 
-    private let paymentQueueController: PaymentQueueController
+    fileprivate let paymentQueueController: PaymentQueueController
 
 
     fileprivate let receiptVerificator: InAppReceiptVerificator
     fileprivate let receiptVerificator: InAppReceiptVerificator
 
 
@@ -204,6 +204,15 @@ extension SwiftyStoreKit {
 
 
         sharedInstance.finishTransaction(transaction)
         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 {
 extension SwiftyStoreKit {

+ 38 - 0
SwiftyStoreKitTests/PaymentQueueControllerTests.swift

@@ -249,6 +249,44 @@ class PaymentQueueControllerTests: XCTestCase {
         XCTAssertTrue(restorePurchasesCallbackCalled)
         XCTAssertTrue(restorePurchasesCallbackCalled)
         XCTAssertTrue(completeTransactionsCallbackCalled)
         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
     // MARK: Helpers
     func makeTestPaymentTransaction(productIdentifier: String, transactionState: SKPaymentTransactionState) -> TestPaymentTransaction {
     func makeTestPaymentTransaction(productIdentifier: String, transactionState: SKPaymentTransactionState) -> TestPaymentTransaction {