瀏覽代碼

Expose downloads array when a product is purchased.

Add updatedDownloadsHandler block to be called to process download updates.
Andrea Bizzotto 7 年之前
父節點
當前提交
c0df52c28e

+ 4 - 2
SwiftyStoreKit/PaymentQueueController.swift

@@ -36,7 +36,7 @@ protocol TransactionController {
 }
 
 public enum TransactionResult {
-    case purchased(purchase: PurchaseDetails)
+    case purchased(purchase: PurchaseDetails, downloads: [SKDownload])
     case restored(purchase: Purchase)
     case failed(error: SKError)
 }
@@ -47,7 +47,7 @@ public protocol PaymentQueue: class {
     func remove(_ observer: SKPaymentTransactionObserver)
 
     func add(_ payment: SKPayment)
-
+    
     func restoreCompletedTransactions(withApplicationUsername username: String?)
 
     func finishTransaction(_ transaction: SKPaymentTransaction)
@@ -152,6 +152,7 @@ class PaymentQueueController: NSObject, SKPaymentTransactionObserver {
     }
     
     var shouldAddStorePaymentHandler: ShouldAddStorePaymentHandler?
+    var updatedDownloadsHandler: UpdatedDownloadsHandler?
 
     // MARK: SKPaymentTransactionObserver
     func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
@@ -210,6 +211,7 @@ class PaymentQueueController: NSObject, SKPaymentTransactionObserver {
 
     func paymentQueue(_ queue: SKPaymentQueue, updatedDownloads downloads: [SKDownload]) {
 
+        updatedDownloadsHandler?(downloads)
     }
 
     func paymentQueue(_ queue: SKPaymentQueue, shouldAddStorePayment payment: SKPayment, for product: SKProduct) -> Bool {

+ 1 - 1
SwiftyStoreKit/PaymentsController.swift

@@ -74,7 +74,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)
             
-            payment.callback(.purchased(purchase: purchase))
+            payment.callback(.purchased(purchase: purchase, downloads: transaction.downloads))
 
             if payment.atomically {
                 paymentQueue.finishTransaction(transaction)

+ 2 - 1
SwiftyStoreKit/SwiftyStoreKit+Types.swift

@@ -69,7 +69,7 @@ public struct RetrieveResults {
 
 // Purchase result
 public enum PurchaseResult {
-    case success(purchase: PurchaseDetails)
+    case success(purchase: PurchaseDetails, downloads: [SKDownload])
     case error(error: SKError)
 }
 
@@ -80,6 +80,7 @@ public struct RestoreResults {
 }
 
 public typealias ShouldAddStorePaymentHandler = (_ payment: SKPayment, _ product: SKProduct) -> Bool
+public typealias UpdatedDownloadsHandler = (_ downloads: [SKDownload]) -> Void
 
 // MARK: Receipt verification
 

+ 12 - 3
SwiftyStoreKit/SwiftyStoreKit.swift

@@ -95,8 +95,8 @@ public class SwiftyStoreKit {
 
     private func processPurchaseResult(_ result: TransactionResult) -> PurchaseResult {
         switch result {
-        case .purchased(let purchase):
-            return .success(purchase: purchase)
+        case .purchased(let purchase, let downloads):
+            return .success(purchase: purchase, downloads: downloads)
         case .failed(let error):
             return .error(error: error)
         case .restored(let purchase):
@@ -109,7 +109,7 @@ public class SwiftyStoreKit {
         var restoreFailedPurchases: [(SKError, String?)] = []
         for result in results {
             switch result {
-            case .purchased(let purchase):
+            case .purchased(let purchase, _):
                 let error = storeInternalError(description: "Cannot purchase product \(purchase.productId) from restore purchases path")
                 restoreFailedPurchases.append((error, purchase.productId))
             case .failed(let error):
@@ -216,6 +216,15 @@ extension SwiftyStoreKit {
             sharedInstance.paymentQueueController.shouldAddStorePaymentHandler = shouldAddStorePaymentHandler
         }
     }
+    
+    /**
+     * Register a handler for paymentQueue(_:updatedDownloads:)
+     */
+    public static var updatedDownloadsHandler: UpdatedDownloadsHandler? {
+        didSet {
+            sharedInstance.paymentQueueController.updatedDownloadsHandler = updatedDownloadsHandler
+        }
+    }
 }
 
 extension SwiftyStoreKit {