Browse Source

Merge pull request #127 from balancemymoney/master

Enabled InAppReceiptRefreshRequest for macOS as it is supported
Andrea Bizzotto 8 years ago
parent
commit
5436815641

+ 0 - 2
SwiftyStoreKit-iOS-Demo/ViewController.swift

@@ -221,8 +221,6 @@ extension ViewController {
                     return alertWithTitle("Purchase failed", message: "Unknown error. Please contact support")
                 case .invalidProductId(let productId):
                     return alertWithTitle("Purchase failed", message: "\(productId) is not a valid product identifier")
-                case .noProductIdentifier:
-                    return alertWithTitle("Purchase failed", message: "Product not found")
                 case .paymentNotAllowed:
                     return alertWithTitle("Payments not enabled", message: "You are not allowed to make payments")
             }

+ 0 - 2
SwiftyStoreKit-macOS-Demo/ViewController.swift

@@ -209,8 +209,6 @@ extension ViewController {
                 return alertWithTitle("Purchase failed", message: "Unknown error. Please contact support")
             case .invalidProductId(let productId):
                 return alertWithTitle("Purchase failed", message: "\(productId) is not a valid product identifier")
-            case .noProductIdentifier:
-                return alertWithTitle("Purchase failed", message: "Product not found")
             case .paymentNotAllowed:
                 return alertWithTitle("Payments not enabled", message: "You are not allowed to make payments")
             }

+ 1 - 6
SwiftyStoreKit/InAppProductPurchaseRequest.swift

@@ -78,11 +78,6 @@ class InAppProductPurchaseRequest: NSObject, SKPaymentTransactionObserver {
     
     // MARK: Private methods
     private func startPayment(_ product: SKProduct, applicationUsername: String = "") {
-        guard let _ = product._productIdentifier else {
-            let error = NSError(domain: SKErrorDomain, code: 0, userInfo: [ NSLocalizedDescriptionKey: "Missing product identifier" ])
-            callback([TransactionResult.failed(error: error)])
-            return
-        }
         let payment = SKMutablePayment(product: product)
         payment.applicationUsername = applicationUsername
         
@@ -107,7 +102,7 @@ class InAppProductPurchaseRequest: NSObject, SKPaymentTransactionObserver {
             let transactionProductIdentifier = transaction.payment.productIdentifier
             
             var isPurchaseRequest = false
-            if let productIdentifier = product?._productIdentifier {
+            if let productIdentifier = product?.productIdentifier {
                 if transactionProductIdentifier != productIdentifier {
                     continue
                 }

+ 47 - 49
SwiftyStoreKit/InAppReceiptRefreshRequest.swift

@@ -26,53 +26,51 @@
 import StoreKit
 import Foundation
 
-#if os(iOS) || os(tvOS)
-    class InAppReceiptRefreshRequest: NSObject, SKRequestDelegate {
-
-        enum ResultType {
-            case success
-            case error(e: Error)
-        }
-
-        typealias RequestCallback = (ResultType) -> ()
-
-        class func refresh(_ receiptProperties: [String : AnyObject]? = nil, callback: @escaping RequestCallback) -> InAppReceiptRefreshRequest {
-            let request = InAppReceiptRefreshRequest(receiptProperties: receiptProperties, callback: callback)
-            request.start()
-            return request
-        }
-
-        let refreshReceiptRequest: SKReceiptRefreshRequest
-        let callback: RequestCallback
-
-        deinit {
-            refreshReceiptRequest.delegate = nil
-        }
-
-        private init(receiptProperties: [String : AnyObject]? = nil, callback: @escaping RequestCallback) {
-            self.callback = callback
-            self.refreshReceiptRequest = SKReceiptRefreshRequest(receiptProperties: receiptProperties)
-            super.init()
-            self.refreshReceiptRequest.delegate = self
-        }
-
-        func start() {
-            self.refreshReceiptRequest.start()
-        }
-
-        func requestDidFinish(_ request: SKRequest) {
-            /*if let resoreRequest = request as? SKReceiptRefreshRequest {
-                let receiptProperties = resoreRequest.receiptProperties ?? [:]
-                for (k, v) in receiptProperties {
-                    print("\(k): \(v)")
-                }
-            }*/
-            callback(.success)
-        }
-        func request(_ request: SKRequest, didFailWithError error: Error) {
-            // XXX could here check domain and error code to return typed exception
-            callback(.error(e: error))
-        }
-        
+class InAppReceiptRefreshRequest: NSObject, SKRequestDelegate {
+    
+    enum ResultType {
+        case success
+        case error(e: Error)
+    }
+    
+    typealias RequestCallback = (ResultType) -> ()
+    
+    class func refresh(_ receiptProperties: [String : AnyObject]? = nil, callback: @escaping RequestCallback) -> InAppReceiptRefreshRequest {
+        let request = InAppReceiptRefreshRequest(receiptProperties: receiptProperties, callback: callback)
+        request.start()
+        return request
+    }
+    
+    let refreshReceiptRequest: SKReceiptRefreshRequest
+    let callback: RequestCallback
+    
+    deinit {
+        refreshReceiptRequest.delegate = nil
+    }
+    
+    private init(receiptProperties: [String : AnyObject]? = nil, callback: @escaping RequestCallback) {
+        self.callback = callback
+        self.refreshReceiptRequest = SKReceiptRefreshRequest(receiptProperties: receiptProperties)
+        super.init()
+        self.refreshReceiptRequest.delegate = self
+    }
+    
+    func start() {
+        self.refreshReceiptRequest.start()
+    }
+    
+    func requestDidFinish(_ request: SKRequest) {
+        /*if let resoreRequest = request as? SKReceiptRefreshRequest {
+         let receiptProperties = resoreRequest.receiptProperties ?? [:]
+         for (k, v) in receiptProperties {
+         print("\(k): \(v)")
+         }
+         }*/
+        callback(.success)
+    }
+    func request(_ request: SKRequest, didFailWithError error: Error) {
+        // XXX could here check domain and error code to return typed exception
+        callback(.error(e: error))
     }
-#endif
+    
+}

+ 1 - 19
SwiftyStoreKit/OS.swift

@@ -29,25 +29,7 @@ import StoreKit
     extension SKMutablePayment {
         convenience init(product: SKProduct) {
             self.init()
-            self.productIdentifier = product._productIdentifier! // unsafe
+            self.productIdentifier = product.productIdentifier
         }
     }
 #endif
-
-// MARK: - product identifier optional on OSX, not on iOS
-
-extension SKProduct {
-    var _productIdentifier: String? {
-        return self.productIdentifier
-    }
-}
-
-// MARK: - products is optional on OSX, not on iOS
-extension SKProductsResponse {
-    var _products: [SKProduct]? {
-        return self.products
-    }
-    var _invalidProductIdentifiers: [String]? {
-        return self.invalidProductIdentifiers
-    }
-}

+ 0 - 1
SwiftyStoreKit/SwiftyStoreKit+Types.swift

@@ -58,7 +58,6 @@ public struct RetrieveResults {
 public enum PurchaseError {
     case failed(error: Error)
     case invalidProductId(productId: String)
-    case noProductIdentifier
     case paymentNotAllowed
 }
 

+ 3 - 18
SwiftyStoreKit/SwiftyStoreKit.swift

@@ -30,9 +30,7 @@ public class SwiftyStoreKit {
     private class InAppPurchaseStore {
         var products: [String: SKProduct] = [:]
         func addProduct(_ product: SKProduct) {
-            if let productIdentifier = product._productIdentifier {
-                products[productIdentifier] = product
-            }
+            products[product.productIdentifier] = product
         }
         func allProductsMatching(_ productIds: Set<String>) -> Set<SKProduct>? {
             var requestedProducts = Set<SKProduct>()
@@ -52,9 +50,7 @@ public class SwiftyStoreKit {
     private var inflightPurchases: [String: InAppProductPurchaseRequest] = [:]
     private var restoreRequest: InAppProductPurchaseRequest?
     private var completeTransactionsObserver: InAppCompleteTransactionsObserver?
-    #if os(iOS) || os(tvOS)
     private var receiptRefreshRequest: InAppReceiptRefreshRequest?
-    #endif
     
     private enum InternalErrorCode: Int {
         case restoredPurchaseWhenPurchasing = 0
@@ -185,7 +181,6 @@ public class SwiftyStoreKit {
         return InAppReceipt.verifySubscription(productId: productId, inReceipt: receipt, validUntil: date, validDuration: duration)
     }
 
-    #if os(iOS) || os(tvOS)
     // After verifying receive and have `ReceiptError.NoReceiptData`, refresh receipt using this method
     public class func refreshReceipt(_ receiptProperties: [String : AnyObject]? = nil, completion: @escaping (RefreshReceiptResult) -> ()) {
         sharedInstance.receiptRefreshRequest = InAppReceiptRefreshRequest.refresh(receiptProperties) { result in
@@ -205,12 +200,6 @@ public class SwiftyStoreKit {
             }
         }
     }
-    #elseif os(OSX)
-     // Call exit with a status of 173. This exit status notifies the system that your application has determined that its receipt is invalid. At this point, the system attempts to obtain a valid receipt and may prompt for the user’s iTunes credentials
-    public class func refreshReceipt() {
-         exit(ReceiptExitCode.notValid.rawValue)
-    }
-    #endif
 
     // MARK: private methods
     private func purchase(product: SKProduct, atomically: Bool, applicationUsername: String = "", completion: @escaping (PurchaseResult) -> ()) {
@@ -218,14 +207,10 @@ public class SwiftyStoreKit {
             completion(.error(error: .paymentNotAllowed))
             return
         }
-        guard let productIdentifier = product._productIdentifier else {
-            completion(.error(error: .noProductIdentifier))
-            return
-        }
 
-        inflightPurchases[productIdentifier] = InAppProductPurchaseRequest.startPayment(product: product, atomically: atomically, applicationUsername: applicationUsername) { results in
+        inflightPurchases[product.productIdentifier] = InAppProductPurchaseRequest.startPayment(product: product, atomically: atomically, applicationUsername: applicationUsername) { results in
 
-            self.inflightPurchases[productIdentifier] = nil
+            self.inflightPurchases[product.productIdentifier] = nil
             
             if let purchasedProductTransaction = results.first {
                 let returnValue = self.processPurchaseResult(purchasedProductTransaction)