浏览代码

Modify VerifySubscriptionResult to make all subscriptions accessible when the result is .purchased or .expired.
Subscriptions are returned as a ReceiptItem array ordered by expiryDate, with the first one being the newest.

Andrea Bizzotto 8 年之前
父节点
当前提交
3041fdb66e

+ 3 - 2
SwiftyStoreKit/InAppReceipt.swift

@@ -182,10 +182,11 @@ internal class InAppReceipt {
             return .notPurchased
             return .notPurchased
         }
         }
 
 
+        let sortedReceiptItems = sortedExpiryDatesAndItems.map { $0.1 }
         if firstExpiryDateItemPair.0 > receiptDate {
         if firstExpiryDateItemPair.0 > receiptDate {
-            return .purchased(expiryDate: firstExpiryDateItemPair.0, item: firstExpiryDateItemPair.1)
+            return .purchased(expiryDate: firstExpiryDateItemPair.0, items: sortedReceiptItems)
         } else {
         } else {
-            return .expired(expiryDate: firstExpiryDateItemPair.0, item: firstExpiryDateItemPair.1)
+            return .expired(expiryDate: firstExpiryDateItemPair.0, items: sortedReceiptItems)
         }
         }
     }
     }
 
 

+ 2 - 2
SwiftyStoreKit/SwiftyStoreKit+Types.swift

@@ -91,8 +91,8 @@ public enum VerifyPurchaseResult {
 
 
 // Verify subscription result
 // Verify subscription result
 public enum VerifySubscriptionResult {
 public enum VerifySubscriptionResult {
-    case purchased(expiryDate: Date, item: ReceiptItem)
-    case expired(expiryDate: Date, item: ReceiptItem)
+    case purchased(expiryDate: Date, items: [ReceiptItem])
+    case expired(expiryDate: Date, items: [ReceiptItem])
     case notPurchased
     case notPurchased
 }
 }
 
 

+ 37 - 6
SwiftyStoreKitTests/InAppReceiptTests.swift

@@ -169,7 +169,7 @@ class InAppReceiptTests: XCTestCase {
 
 
         let verifySubscriptionResult = SwiftyStoreKit.verifySubscription(type: .autoRenewable, productId: productId, inReceipt: receipt)
         let verifySubscriptionResult = SwiftyStoreKit.verifySubscription(type: .autoRenewable, productId: productId, inReceipt: receipt)
 
 
-        let expectedSubscriptionResult = VerifySubscriptionResult.expired(expiryDate: expirationDate, item: item)
+        let expectedSubscriptionResult = VerifySubscriptionResult.expired(expiryDate: expirationDate, items: [item])
         XCTAssertEqual(verifySubscriptionResult, expectedSubscriptionResult)
         XCTAssertEqual(verifySubscriptionResult, expectedSubscriptionResult)
     }
     }
 
 
@@ -186,7 +186,7 @@ class InAppReceiptTests: XCTestCase {
 
 
         let verifySubscriptionResult = SwiftyStoreKit.verifySubscription(type: .autoRenewable, productId: productId, inReceipt: receipt)
         let verifySubscriptionResult = SwiftyStoreKit.verifySubscription(type: .autoRenewable, productId: productId, inReceipt: receipt)
 
 
-        let expectedSubscriptionResult = VerifySubscriptionResult.purchased(expiryDate: expirationDate, item: item)
+        let expectedSubscriptionResult = VerifySubscriptionResult.purchased(expiryDate: expirationDate, items: [item])
         XCTAssertEqual(verifySubscriptionResult, expectedSubscriptionResult)
         XCTAssertEqual(verifySubscriptionResult, expectedSubscriptionResult)
     }
     }
 
 
@@ -236,7 +236,7 @@ class InAppReceiptTests: XCTestCase {
 
 
         let verifySubscriptionResult = SwiftyStoreKit.verifySubscription(type: .nonRenewing(validDuration: duration), productId: productId, inReceipt: receipt)
         let verifySubscriptionResult = SwiftyStoreKit.verifySubscription(type: .nonRenewing(validDuration: duration), productId: productId, inReceipt: receipt)
 
 
-        let expectedSubscriptionResult = VerifySubscriptionResult.expired(expiryDate: expirationDate, item: item)
+        let expectedSubscriptionResult = VerifySubscriptionResult.expired(expiryDate: expirationDate, items: [item])
         XCTAssertEqual(verifySubscriptionResult, expectedSubscriptionResult)
         XCTAssertEqual(verifySubscriptionResult, expectedSubscriptionResult)
     }
     }
 
 
@@ -255,7 +255,7 @@ class InAppReceiptTests: XCTestCase {
 
 
         let verifySubscriptionResult = SwiftyStoreKit.verifySubscription(type: .nonRenewing(validDuration: duration), productId: productId, inReceipt: receipt)
         let verifySubscriptionResult = SwiftyStoreKit.verifySubscription(type: .nonRenewing(validDuration: duration), productId: productId, inReceipt: receipt)
 
 
-        let expectedSubscriptionResult = VerifySubscriptionResult.purchased(expiryDate: expirationDate, item: item)
+        let expectedSubscriptionResult = VerifySubscriptionResult.purchased(expiryDate: expirationDate, items: [item])
         XCTAssertEqual(verifySubscriptionResult, expectedSubscriptionResult)
         XCTAssertEqual(verifySubscriptionResult, expectedSubscriptionResult)
     }
     }
 
 
@@ -278,7 +278,7 @@ class InAppReceiptTests: XCTestCase {
     }
     }
 
 
     // MARK: Verify Subscription, multiple receipt item tests
     // MARK: Verify Subscription, multiple receipt item tests
-    func verifyAutoRenewableSubscription_when_twoSubscriptions_sameProductId_mostRecentNonExpired_then_resultIsPurchased() {
+    func verifyAutoRenewableSubscription_when_twoSubscriptions_sameProductId_mostRecentNonExpired_then_resultIsPurchased_itemsSorted() {
 
 
         let receiptRequestDate = makeDateAtMidnight(year: 2017, month: 5, day: 14)
         let receiptRequestDate = makeDateAtMidnight(year: 2017, month: 5, day: 14)
 
 
@@ -305,7 +305,38 @@ class InAppReceiptTests: XCTestCase {
 
 
         let verifySubscriptionResult = SwiftyStoreKit.verifySubscription(type: .autoRenewable, productId: productId, inReceipt: receipt)
         let verifySubscriptionResult = SwiftyStoreKit.verifySubscription(type: .autoRenewable, productId: productId, inReceipt: receipt)
 
 
-        let expectedSubscriptionResult = VerifySubscriptionResult.purchased(expiryDate: newerExpirationDate, item: newerItem)
+        let expectedSubscriptionResult = VerifySubscriptionResult.purchased(expiryDate: newerExpirationDate, items: [newerItem, olderItem])
+        XCTAssertEqual(verifySubscriptionResult, expectedSubscriptionResult)
+    }
+
+    func verifyAutoRenewableSubscription_when_twoSubscriptions_sameProductId_bothExpired_then_resultIsExpired_itemsSorted() {
+        
+        let receiptRequestDate = makeDateAtMidnight(year: 2017, month: 5, day: 14)
+        
+        let productId = "product1"
+        let isTrialPeriod = false
+        
+        let olderPurchaseDate = makeDateAtMidnight(year: 2017, month: 5, day: 12)
+        let olderExpirationDate = olderPurchaseDate.addingTimeInterval(60 * 60)
+        let olderItem = ReceiptItem(productId: productId,
+                                    purchaseDate: olderPurchaseDate,
+                                    subscriptionExpirationDate: olderExpirationDate,
+                                    cancellationDate: nil,
+                                    isTrialPeriod: isTrialPeriod)
+        
+        let newerPurchaseDate = makeDateAtMidnight(year: 2017, month: 5, day: 13)
+        let newerExpirationDate = olderPurchaseDate.addingTimeInterval(60 * 60)
+        let newerItem = ReceiptItem(productId: productId,
+                                    purchaseDate: newerPurchaseDate,
+                                    subscriptionExpirationDate: newerExpirationDate,
+                                    cancellationDate: nil,
+                                    isTrialPeriod: isTrialPeriod)
+        
+        let receipt = makeReceipt(items: [olderItem, newerItem], requestDate: receiptRequestDate)
+        
+        let verifySubscriptionResult = SwiftyStoreKit.verifySubscription(type: .autoRenewable, productId: productId, inReceipt: receipt)
+        
+        let expectedSubscriptionResult = VerifySubscriptionResult.expired(expiryDate: newerExpirationDate, items: [newerItem, olderItem])
         XCTAssertEqual(verifySubscriptionResult, expectedSubscriptionResult)
         XCTAssertEqual(verifySubscriptionResult, expectedSubscriptionResult)
     }
     }