Pārlūkot izejas kodu

Merge develop into feature/parse-receipt-info-fix

Andrea Bizzotto 7 gadi atpakaļ
vecāks
revīzija
048c1f8deb

+ 2 - 1
CHANGELOG.md

@@ -5,7 +5,8 @@ All notable changes to this project will be documented in this file.
 ## [0.11.0](https://github.com/bizz84/SwiftyStoreKit/releases/tag/0.11.0) Add `fetchReceipt` method + update `verifyReceipt` and `ReceiptValidator` protocol
 
 * Add `fetchReceipt` method. Update `verifyReceipt` to use it ([#278](https://github.com/bizz84/SwiftyStoreKit/pull/278), related issues: [#272](https://github.com/bizz84/SwiftyStoreKit/issues/272), [#223](https://github.com/bizz84/SwiftyStoreKit/issues/223)).
-* Remove `password` from `ReceiptValidator` protocol as this is specific to `AppleReceiptValidator` ([#281](https://github.com/bizz84/SwiftyStoreKit/pull/281/)). **Note**: This is an API breaking change.
+* Update `fetchReceipt` and `ReceiptValidator` to use receipt as `Data` rather than `String`. This is consistent with `localReceiptData` ([#284](https://github.com/bizz84/SwiftyStoreKit/pull/284), see [#272](https://github.com/bizz84/SwiftyStoreKit/issues/272)).
+* Remove `password` from `ReceiptValidator` protocol as this is specific to `AppleReceiptValidator` ([#281](https://github.com/bizz84/SwiftyStoreKit/pull/281/), see [#263](https://github.com/bizz84/SwiftyStoreKit/issues/263)). **Note**: This is an API breaking change.
 * Unwrap `receipt["receipt"]?["in_app"]` in two steps (addresses casting problems) ([#283](https://github.com/bizz84/SwiftyStoreKit/pull/283), related issue [#256](https://github.com/bizz84/SwiftyStoreKit/issues/256)).
 
 

+ 2 - 1
README.md

@@ -289,7 +289,8 @@ Use this method to get the updated receipt:
 ```swift
 SwiftyStoreKit.fetchReceipt(forceRefresh: true) { result in
     switch result {
-    case .success(let encryptedReceipt):
+    case .success(let receiptData):
+        let encryptedReceipt = receiptData.base64EncodedString(options: [])
         print("Fetch receipt success:\n\(encryptedReceipt)")
     case .error(let error):
         print("Fetch receipt failed: \(error)")

+ 3 - 2
SwiftyStoreKit/AppleReceiptValidator.swift

@@ -47,12 +47,13 @@ public struct AppleReceiptValidator: ReceiptValidator {
         self.sharedSecret = sharedSecret
 	}
 
-	public func validate(receipt: String, completion: @escaping (VerifyReceiptResult) -> Void) {
+	public func validate(receiptData: Data, completion: @escaping (VerifyReceiptResult) -> Void) {
 
 		let storeURL = URL(string: service.rawValue)! // safe (until no more)
 		let storeRequest = NSMutableURLRequest(url: storeURL)
 		storeRequest.httpMethod = "POST"
 
+        let receipt = receiptData.base64EncodedString(options: [])
 		let requestContents: NSMutableDictionary = [ "receipt-data": receipt ]
 		// password if defined
 		if let password = sharedSecret {
@@ -106,7 +107,7 @@ public struct AppleReceiptValidator: ReceiptValidator {
 				let receiptStatus = ReceiptStatus(rawValue: status) ?? ReceiptStatus.unknown
 				if case .testReceipt = receiptStatus {
                     let sandboxValidator = AppleReceiptValidator(service: .sandbox, sharedSecret: self.sharedSecret)
-					sandboxValidator.validate(receipt: receipt, completion: completion)
+					sandboxValidator.validate(receiptData: receiptData, completion: completion)
 				} else {
 					if receiptStatus.isValid {
 						completion(.success(receipt: receiptInfo))

+ 6 - 12
SwiftyStoreKit/InAppReceiptVerificator.swift

@@ -56,8 +56,8 @@ class InAppReceiptVerificator: NSObject {
         
         fetchReceipt(forceRefresh: forceRefresh, refresh: refresh) { result in
             switch result {
-            case .success(let encryptedReceipt):
-                self.verify(receipt: encryptedReceipt, using: validator, completion: completion)
+            case .success(let receiptData):
+                self.verify(receiptData: receiptData, using: validator, completion: completion)
             case .error(let error):
                 completion(.error(error: error))
             }
@@ -77,7 +77,7 @@ class InAppReceiptVerificator: NSObject {
                              completion: @escaping (FetchReceiptResult) -> Void) {
 
         if let receiptData = appStoreReceiptData, forceRefresh == false {
-            fetchReceiptSuccessHandler(receiptData: receiptData, completion: completion)
+            completion(.success(receiptData: receiptData))
         } else {
             
             receiptRefreshRequest = refresh(nil) { result in
@@ -87,7 +87,7 @@ class InAppReceiptVerificator: NSObject {
                 switch result {
                 case .success:
                     if let receiptData = self.appStoreReceiptData {
-                        self.fetchReceiptSuccessHandler(receiptData: receiptData, completion: completion)
+                        completion(.success(receiptData: receiptData))
                     } else {
                         completion(.error(error: .noReceiptData))
                     }
@@ -97,21 +97,15 @@ class InAppReceiptVerificator: NSObject {
             }
         }
     }
-
-    private func fetchReceiptSuccessHandler(receiptData: Data, completion: (FetchReceiptResult) -> Void) {
-    
-        let base64EncodedString = receiptData.base64EncodedString(options: [])
-        completion(.success(encryptedReceipt: base64EncodedString))
-    }
     
     /**
      *  - Parameter receiptData: encrypted receipt data
      *  - Parameter validator: Validator to check the encrypted receipt and return the receipt in readable format
      *  - Parameter completion: handler for result
      */
-    private func verify(receipt: String, using validator: ReceiptValidator, completion: @escaping (VerifyReceiptResult) -> Void) {
+    private func verify(receiptData: Data, using validator: ReceiptValidator, completion: @escaping (VerifyReceiptResult) -> Void) {
      
-        validator.validate(receipt: receipt) { result in
+        validator.validate(receiptData: receiptData) { result in
             
             DispatchQueue.main.async {
                 completion(result)

+ 2 - 8
SwiftyStoreKit/SwiftyStoreKit+Types.swift

@@ -45,7 +45,7 @@ public struct PurchaseDetails {
 
 //Conform to this protocol to provide custom receipt validator
 public protocol ReceiptValidator {
-	func validate(receipt: String, completion: @escaping (VerifyReceiptResult) -> Void)
+	func validate(receiptData: Data, completion: @escaping (VerifyReceiptResult) -> Void)
 }
 
 // Payment transaction
@@ -83,15 +83,9 @@ public typealias ShouldAddStorePaymentHandler = (_ payment: SKPayment, _ product
 // Info for receipt returned by server
 public typealias ReceiptInfo = [String: AnyObject]
 
-// Refresh receipt result
-public enum RefreshReceiptResult {
-    case success(receiptData: Data)
-    case error(error: Error)
-}
-
 // Fetch receipt result
 public enum FetchReceiptResult {
-    case success(encryptedReceipt: String)
+    case success(receiptData: Data)
     case error(error: ReceiptError)
 }
 

+ 1 - 1
SwiftyStoreKitTests/InAppReceiptVerificatorTests.swift

@@ -28,7 +28,7 @@ import XCTest
 
 class TestReceiptValidator: ReceiptValidator {
     var validateCalled = false
-    func validate(receipt: String, completion: @escaping (VerifyReceiptResult) -> Void) {
+    func validate(receiptData: Data, completion: @escaping (VerifyReceiptResult) -> Void) {
         validateCalled = true
         completion(.success(receipt: [:]))
     }