Skip to content

Commit 048c1f8

Browse files
committed
Merge develop into feature/parse-receipt-info-fix
2 parents a041f3b + dc82285 commit 048c1f8

File tree

6 files changed

+16
-25
lines changed

6 files changed

+16
-25
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ All notable changes to this project will be documented in this file.
55
## [0.11.0](https://github.com/bizz84/SwiftyStoreKit/releases/tag/0.11.0) Add `fetchReceipt` method + update `verifyReceipt` and `ReceiptValidator` protocol
66

77
* 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)).
8-
* 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.
8+
* 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)).
9+
* 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.
910
* 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)).
1011

1112

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,8 @@ Use this method to get the updated receipt:
289289
```swift
290290
SwiftyStoreKit.fetchReceipt(forceRefresh: true) { result in
291291
switch result {
292-
case .success(let encryptedReceipt):
292+
case .success(let receiptData):
293+
let encryptedReceipt = receiptData.base64EncodedString(options: [])
293294
print("Fetch receipt success:\n\(encryptedReceipt)")
294295
case .error(let error):
295296
print("Fetch receipt failed: \(error)")

SwiftyStoreKit/AppleReceiptValidator.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,13 @@ public struct AppleReceiptValidator: ReceiptValidator {
4747
self.sharedSecret = sharedSecret
4848
}
4949

50-
public func validate(receipt: String, completion: @escaping (VerifyReceiptResult) -> Void) {
50+
public func validate(receiptData: Data, completion: @escaping (VerifyReceiptResult) -> Void) {
5151

5252
let storeURL = URL(string: service.rawValue)! // safe (until no more)
5353
let storeRequest = NSMutableURLRequest(url: storeURL)
5454
storeRequest.httpMethod = "POST"
5555

56+
let receipt = receiptData.base64EncodedString(options: [])
5657
let requestContents: NSMutableDictionary = [ "receipt-data": receipt ]
5758
// password if defined
5859
if let password = sharedSecret {
@@ -106,7 +107,7 @@ public struct AppleReceiptValidator: ReceiptValidator {
106107
let receiptStatus = ReceiptStatus(rawValue: status) ?? ReceiptStatus.unknown
107108
if case .testReceipt = receiptStatus {
108109
let sandboxValidator = AppleReceiptValidator(service: .sandbox, sharedSecret: self.sharedSecret)
109-
sandboxValidator.validate(receipt: receipt, completion: completion)
110+
sandboxValidator.validate(receiptData: receiptData, completion: completion)
110111
} else {
111112
if receiptStatus.isValid {
112113
completion(.success(receipt: receiptInfo))

SwiftyStoreKit/InAppReceiptVerificator.swift

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ class InAppReceiptVerificator: NSObject {
5656

5757
fetchReceipt(forceRefresh: forceRefresh, refresh: refresh) { result in
5858
switch result {
59-
case .success(let encryptedReceipt):
60-
self.verify(receipt: encryptedReceipt, using: validator, completion: completion)
59+
case .success(let receiptData):
60+
self.verify(receiptData: receiptData, using: validator, completion: completion)
6161
case .error(let error):
6262
completion(.error(error: error))
6363
}
@@ -77,7 +77,7 @@ class InAppReceiptVerificator: NSObject {
7777
completion: @escaping (FetchReceiptResult) -> Void) {
7878

7979
if let receiptData = appStoreReceiptData, forceRefresh == false {
80-
fetchReceiptSuccessHandler(receiptData: receiptData, completion: completion)
80+
completion(.success(receiptData: receiptData))
8181
} else {
8282

8383
receiptRefreshRequest = refresh(nil) { result in
@@ -87,7 +87,7 @@ class InAppReceiptVerificator: NSObject {
8787
switch result {
8888
case .success:
8989
if let receiptData = self.appStoreReceiptData {
90-
self.fetchReceiptSuccessHandler(receiptData: receiptData, completion: completion)
90+
completion(.success(receiptData: receiptData))
9191
} else {
9292
completion(.error(error: .noReceiptData))
9393
}
@@ -97,21 +97,15 @@ class InAppReceiptVerificator: NSObject {
9797
}
9898
}
9999
}
100-
101-
private func fetchReceiptSuccessHandler(receiptData: Data, completion: (FetchReceiptResult) -> Void) {
102-
103-
let base64EncodedString = receiptData.base64EncodedString(options: [])
104-
completion(.success(encryptedReceipt: base64EncodedString))
105-
}
106100

107101
/**
108102
* - Parameter receiptData: encrypted receipt data
109103
* - Parameter validator: Validator to check the encrypted receipt and return the receipt in readable format
110104
* - Parameter completion: handler for result
111105
*/
112-
private func verify(receipt: String, using validator: ReceiptValidator, completion: @escaping (VerifyReceiptResult) -> Void) {
106+
private func verify(receiptData: Data, using validator: ReceiptValidator, completion: @escaping (VerifyReceiptResult) -> Void) {
113107

114-
validator.validate(receipt: receipt) { result in
108+
validator.validate(receiptData: receiptData) { result in
115109

116110
DispatchQueue.main.async {
117111
completion(result)

SwiftyStoreKit/SwiftyStoreKit+Types.swift

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public struct PurchaseDetails {
4545

4646
//Conform to this protocol to provide custom receipt validator
4747
public protocol ReceiptValidator {
48-
func validate(receipt: String, completion: @escaping (VerifyReceiptResult) -> Void)
48+
func validate(receiptData: Data, completion: @escaping (VerifyReceiptResult) -> Void)
4949
}
5050

5151
// Payment transaction
@@ -83,15 +83,9 @@ public typealias ShouldAddStorePaymentHandler = (_ payment: SKPayment, _ product
8383
// Info for receipt returned by server
8484
public typealias ReceiptInfo = [String: AnyObject]
8585

86-
// Refresh receipt result
87-
public enum RefreshReceiptResult {
88-
case success(receiptData: Data)
89-
case error(error: Error)
90-
}
91-
9286
// Fetch receipt result
9387
public enum FetchReceiptResult {
94-
case success(encryptedReceipt: String)
88+
case success(receiptData: Data)
9589
case error(error: ReceiptError)
9690
}
9791

SwiftyStoreKitTests/InAppReceiptVerificatorTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import XCTest
2828

2929
class TestReceiptValidator: ReceiptValidator {
3030
var validateCalled = false
31-
func validate(receipt: String, completion: @escaping (VerifyReceiptResult) -> Void) {
31+
func validate(receiptData: Data, completion: @escaping (VerifyReceiptResult) -> Void) {
3232
validateCalled = true
3333
completion(.success(receipt: [:]))
3434
}

0 commit comments

Comments
 (0)