Explorar o código

Merge pull request #283 from bizz84/feature/parse-receipt-info-fix

Unwrap receipt["receipt"]?["in_app"] in two steps to work around cast returning nil
Andrea Bizzotto %!s(int64=7) %!d(string=hai) anos
pai
achega
cfefeefe5d
Modificáronse 2 ficheiros con 11 adicións e 4 borrados
  1. 1 0
      CHANGELOG.md
  2. 10 4
      SwiftyStoreKit/InAppReceipt.swift

+ 1 - 0
CHANGELOG.md

@@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file.
 * 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)).
 * 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)).
 
 
 ## [0.10.8](https://github.com/bizz84/SwiftyStoreKit/releases/tag/0.10.8) Update to swiftlint 0.22.0

+ 10 - 4
SwiftyStoreKit/InAppReceipt.swift

@@ -92,9 +92,9 @@ internal class InAppReceipt {
     ) -> VerifyPurchaseResult {
 
         // Get receipts info for the product
-        let receipts = receipt["receipt"]?["in_app"] as? [ReceiptInfo]
-        let receiptsInfo = filterReceiptsInfo(receipts: receipts, withProductId: productId)
-        let nonCancelledReceiptsInfo = receiptsInfo.filter { receipt in receipt["cancellation_date"] == nil }
+        let receipts = getInAppReceipts(receipt: receipt)
+        let filteredReceiptsInfo = filterReceiptsInfo(receipts: receipts, withProductId: productId)
+        let nonCancelledReceiptsInfo = filteredReceiptsInfo.filter { receipt in receipt["cancellation_date"] == nil }
 
         let receiptItems = nonCancelledReceiptsInfo.flatMap { ReceiptItem(receiptInfo: $0) }
         // Verify that at least one receipt has the right product id
@@ -174,7 +174,7 @@ internal class InAppReceipt {
         case .autoRenewable:
             return (receipt["latest_receipt_info"] as? [ReceiptInfo], nil)
         case .nonRenewing(let duration):
-            return (receipt["receipt"]?["in_app"] as? [ReceiptInfo], duration)
+            return (getInAppReceipts(receipt: receipt), duration)
         }
     }
 
@@ -186,6 +186,12 @@ internal class InAppReceipt {
         }
         return Date(millisecondsSince1970: requestDateString)
     }
+    
+    private class func getInAppReceipts(receipt: ReceiptInfo) -> [ReceiptInfo]? {
+        
+        let appReceipt = receipt["receipt"] as? ReceiptInfo
+        return appReceipt?["in_app"] as? [ReceiptInfo]
+    }
 
     /**
      *  Get all the receipts info for a specific product