Advertisement
Guest User

Untitled

a guest
Oct 9th, 2016
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 5.69 KB | None | 0 0
  1. //
  2. //  IAPManager.swift
  3. //  InAppPurchase
  4. //
  5. //  Created by Caleb Manley on 1/10/16.
  6. //  Copyright © 2016 Caleb Manley. All rights reserved.
  7. //
  8.  
  9. import StoreKit
  10.  
  11. public typealias ProductIdentifier = String
  12. public typealias ProductsRequestCompletionHandler = (_ success: Bool, _ products: [SKProduct]?) -> ()
  13.  
  14. class IAPManager: NSObject {
  15.    
  16.     static let IAPManagerPurchaseNotification = "IAPManagerPurchaseNotification"
  17.     fileprivate var productIdentifiers: Set<ProductIdentifier> = []
  18.     fileprivate var purchasedProductIdentifiers = Set<ProductIdentifier>()
  19.     fileprivate var productsRequest: SKProductsRequest?
  20.     fileprivate var productsRequestCompletionHandler: ProductsRequestCompletionHandler?
  21.     fileprivate let keychain = KeychainSwift()
  22.    
  23.     private override init() { super.init() }
  24.    
  25.     public convenience init(_ productIDs: Set<ProductIdentifier>) {
  26.         self.init()
  27.        
  28.         productIdentifiers = productIDs
  29.        
  30.         for productIdentifier in productIDs {
  31.             let purchased: Bool = keychain.getBool(productIdentifier) ?? false
  32.            
  33.             if purchased {
  34.                 purchasedProductIdentifiers.insert(productIdentifier)
  35.                 print("Previously purchased: \(productIdentifier)")
  36.             } else {
  37.                 print("Not purchased: \(productIdentifier)")
  38.             }
  39.         }
  40.        
  41.         SKPaymentQueue.default().add(self)
  42.     }
  43. }
  44.  
  45.  
  46.  
  47. extension IAPManager {
  48.    
  49.     public func requestProducts(completionHandler: @escaping ProductsRequestCompletionHandler) {
  50.         productsRequest?.cancel()
  51.         productsRequestCompletionHandler = completionHandler
  52.        
  53.         productsRequest = SKProductsRequest(productIdentifiers: productIdentifiers)
  54.         productsRequest!.delegate = self
  55.         productsRequest!.start()
  56.     }
  57.    
  58.     public func buyProduct(_ product: SKProduct) {
  59.         print("Buying \(product.productIdentifier)...")
  60.         let payment = SKPayment(product: product)
  61.         SKPaymentQueue.default().add(payment)
  62.     }
  63.    
  64.     public func isProductPurchased(_ productIdentifier: ProductIdentifier) -> Bool {
  65.         return purchasedProductIdentifiers.contains(productIdentifier)
  66.     }
  67.    
  68.     public class func canMakePayments() -> Bool {
  69.         return SKPaymentQueue.canMakePayments()
  70.     }
  71.    
  72.     public func restorePurchases() {
  73.         if SKPaymentQueue.canMakePayments() {
  74.             SKPaymentQueue.default().restoreCompletedTransactions()
  75.         } else {
  76.             print("Cannot restore purchases...")
  77.         }
  78.     }
  79. }
  80.  
  81.  
  82.  
  83. extension IAPManager: SKProductsRequestDelegate {
  84.    
  85.     public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
  86.         let products = response.products
  87.         print("Loaded list of products...")
  88.         productsRequestCompletionHandler?(true, products)
  89.         clearRequestAndHandler()
  90.        
  91.         for p in products {
  92.             print("Found product: \(p.productIdentifier) \(p.localizedTitle) \(p.price.floatValue)")
  93.         }
  94.     }
  95.    
  96.     public func request(_ request: SKRequest, didFailWithError error: Error) {
  97.         print("Failed to load list of products.")
  98.         print("Error: \(error.localizedDescription)")
  99.         productsRequestCompletionHandler?(false, nil)
  100.         clearRequestAndHandler()
  101.     }
  102.    
  103.     private func clearRequestAndHandler() {
  104.         productsRequest = nil
  105.         productsRequestCompletionHandler = nil
  106.     }
  107. }
  108.  
  109.  
  110.  
  111. extension IAPManager: SKPaymentTransactionObserver {
  112.    
  113.     public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
  114.         for transaction in transactions {
  115.             switch (transaction.transactionState) {
  116.             case .purchased:
  117.                 complete(transaction: transaction)
  118.                 break
  119.             case .failed:
  120.                 fail(transaction: transaction)
  121.                 break
  122.             case .restored:
  123.                 restore(transaction: transaction)
  124.                 break
  125.             case .deferred:
  126.                 break
  127.             case .purchasing:
  128.                 break
  129.             }
  130.         }
  131.     }
  132.    
  133.     private func complete(transaction: SKPaymentTransaction) {
  134.         print("complete...")
  135.         deliverPurchaseNotificationFor(identifier: transaction.payment.productIdentifier)
  136.         SKPaymentQueue.default().finishTransaction(transaction)
  137.     }
  138.    
  139.     private func restore(transaction: SKPaymentTransaction) {
  140.         guard let productIdentifier = transaction.original?.payment.productIdentifier else { return }
  141.        
  142.         keychain.set(false, forKey: productIdentifier)
  143.        
  144.         print("restore... \(productIdentifier)")
  145.         deliverPurchaseNotificationFor(identifier: productIdentifier)
  146.         SKPaymentQueue.default().finishTransaction(transaction)
  147.     }
  148.    
  149.     private func fail(transaction: SKPaymentTransaction) {
  150.         print("fail...")
  151.         if let transactionError = transaction.error as? NSError {
  152.             if transactionError.code != SKError.paymentCancelled.rawValue {
  153.                 print("Transaction Error: \(transaction.error?.localizedDescription)")
  154.             }
  155.         }
  156.        
  157.         SKPaymentQueue.default().finishTransaction(transaction)
  158.     }
  159.    
  160.     private func deliverPurchaseNotificationFor(identifier: String?) {
  161.         guard let identifier = identifier else { return }
  162.        
  163.         purchasedProductIdentifiers.insert(identifier)
  164.         keychain.set(true, forKey: identifier)
  165.         NotificationCenter.default.post(name: NSNotification.Name(rawValue: IAPManager.IAPManagerPurchaseNotification), object: identifier)
  166.     }
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement