Permalink
Fetching contributors…
Cannot retrieve contributors at this time
232 lines (154 sloc) 14.8 KB

Change Log

All notable changes to this project will be documented in this file.

0.13.3 Fix macOS compile error on Xcode 10.0 beta (10L176w)

  • Fix macOS compile error on Xcode 10.0 beta (10L176w) (#381, see #380)

0.13.2 Swift 4.1 / Xcode 9.3 Support

  • Swift 4.1 / Xcode 9.3 Support (#360)

0.13.1 Add support Ask To Buy

  • Add a wrapper for simulatesAskToBuyInSandbox (#349)

0.13.0 Add support for downloading content hosted with Apple

  • Add support for downloading content hosted with Apple (#343, related issue: #128)
  • Add table of contents to README (#346)

0.12.1 Assert that completeTransactions was called when the app launches.

  • Assert that completeTransactions() was called when the app launches (#337, related issue: #287)

0.12.0 Add verifySubscriptions method for subscription groups

  • Add verifySubscriptions method to check all subscriptions in a group at once (#333, related issue: #194)
  • Rename verifySubscription(type:productId:inReceipt:validUntil:) to verifySubscription(ofType:productId:inReceipt:validUntil:) (#333)
  • Add video tutorials section in README (#328, #330, see #326)
  • Update iOS Demo App (#327, see #147)

0.11.3 completeTransactions finishes failed transactions if atomically: false

  • Add originalTransaction to PurchaseDetails (#323, fix for #302)
  • Bug fix: completeTransactions finishes failed transactions if atomically: false (#322, related issues: #307, #288)

0.11.2 Remove SKProduct.localizedIntroductoryPrice

0.11.1 Add PaymentTransaction.transactionDate and SKProduct.localizedIntroductoryPrice

  • Add transactionDate to PaymentTransaction (#316, see #312).
  • Add localizedIntroductoryPrice to SKProduct (#318).

0.11.0 Add fetchReceipt method + update verifyReceipt and ReceiptValidator protocol

  • Add fetchReceipt method. Update verifyReceipt to use it (#278, related issues: #272, #223).
  • Update fetchReceipt and ReceiptValidator to use receipt as Data rather than String. This is consistent with localReceiptData (#284, see #272).
  • Remove password from ReceiptValidator protocol as this is specific to AppleReceiptValidator (#281, see #263). Note: This is an API breaking change.
  • Unwrap receipt["receipt"]?["in_app"] in two steps (addresses casting problems) (#283, related issue #256).

0.10.8 Update to swiftlint 0.22.0

  • Update to swiftlint 0.22.0 (#270, fix for #273)

0.10.7 Fix for concurrent retrieveProductsInfo calls

  • ProductsInfoController: Keep track of multiple completion blocks for the same request (#259, fix for #250)

0.10.6 Add support for shouldAddStorePayment

  • Add support for the new SKPaymentTransactionObserver.shouldAddStorePayment method in iOS 11 (#257, related issue: #240)
  • Update swiftlint to version 0.21.0 (#258)

0.10.5 Filter out transactions in purchasing state

  • Filter out all transactions with state == .purchasing early in purchase flows (related to #169, #188, #179)
  • Sample app: print localized description when a purchase fails with .unknown error

0.10.4 Documentation and updates for Xcode 9

  • Update to Xcode 9 recommended project settings (#247)
  • Update build script iOS version to 10.3.1 (#245)
  • Update notes about Xcode 9, Swift 4 support to README

0.10.3 Add forceRefresh option to verifyReceipt

  • Add forceRefresh option to verifyReceipt (#224, fix for #223)

0.10.2 Remove SKProduct caching

  • Remove SKProduct caching (#222, related issue: #212)
  • Adds new purchase product method based on SKProduct

0.10.1 Danger, xcpretty integration

  • Adds Danger for better Pull Request etiquette (#215).
  • Adds xcpretty to improve build logs (#217)
  • Update SwiftLint to 0.18.1 (#218)

0.10.0 verifyReceipt now automatically refreshes the receipt if needed

API removed: refreshReceipt

This release simplifies the receipt verification flows by removing the refreshReceipt method from the public API.

Now clients only need to call verifyReceipt and the receipt is refreshed internally if needed.

Addressed in #213, related issue: #42.

The documentation in the README and various methods has also been considerably improved.

0.9.3 Dispatch callbacks on main thread on macOS

This is a minor release to ensure callbacks are dispatched on the main thread on macOS.

PR #214, fix for #211.

0.9.2 Fix for failing receipt verification due to missing optional field

This is a critical fix for #208.

If you're using release 0.9.0, please update.

0.9.1 Expose SKProduct in PurchaseDetails type returned by PurchaseResult

This is a minor release which includes a fix for #185 (addressed in #206). Summary:

When a purchase succeeds, it is desirable to get access to the purchased SKProduct in the completion block, so that it's possible to query the price and other properties.

With this change, this is now possible:

SwiftyStoreKit.purchaseProduct("productId", atomically: true) { result in
    if case .success(let purchase) = result {
        // Deliver content from server, then:
        if purchase.needsFinishTransaction {
            SwiftyStoreKit.finishTransaction(purchase.transaction)
        }
        print("Purchased product with price: \(purchase.product.price)")
    }
}

0.9.0 Verify Subscription improvements + added quantity and originalTransaction to Payment

NOTE This release introduces some API breaking changes (see #202). Change-set:

#198: Subscription verification unit tests

#199 (fixes #192, #190 and #65): Add ReceiptItem to VerifyPurchaseResult, VerifySubscriptionResult

This change introduces a new strong-typed ReceiptItem struct:

public struct ReceiptItem {
    // The product identifier of the item that was purchased. This value corresponds to the productIdentifier property of the SKPayment object stored in the transaction’s payment property.
    public let productId: String
    // The number of items purchased. This value corresponds to the quantity property of the SKPayment object stored in the transaction’s payment property.
    public let quantity: Int
    // The transaction identifier of the item that was purchased. This value corresponds to the transaction’s transactionIdentifier property.
    public let transactionId: String
    // For a transaction that restores a previous transaction, the transaction identifier of the original transaction. Otherwise, identical to the transaction identifier. This value corresponds to the original transaction’s transactionIdentifier property. All receipts in a chain of renewals for an auto-renewable subscription have the same value for this field.
    public let originalTransactionId: String
    // The date and time that the item was purchased. This value corresponds to the transaction’s transactionDate property.
    public let purchaseDate: Date
    // For a transaction that restores a previous transaction, the date of the original transaction. This value corresponds to the original transaction’s transactionDate property. In an auto-renewable subscription receipt, this indicates the beginning of the subscription period, even if the subscription has been renewed.
    public let originalPurchaseDate: Date
    // The primary key for identifying subscription purchases.
    public let webOrderLineItemId: String
    // The expiration date for the subscription, expressed as the number of milliseconds since January 1, 1970, 00:00:00 GMT. This key is only present for auto-renewable subscription receipts.
    public let subscriptionExpirationDate: Date?
    // For a transaction that was canceled by Apple customer support, the time and date of the cancellation. Treat a canceled receipt the same as if no purchase had ever been made.
    public let cancellationDate: Date?

    public let isTrialPeriod: Bool
}

This is parsed from the receipt and returned as part of the verifySubscription and verifyPurchase methods:

// Result for Consumable and NonConsumable
public enum VerifyPurchaseResult {
    case purchased(item: ReceiptItem)
    case notPurchased
}

// Verify subscription result
public enum VerifySubscriptionResult {
    case purchased(expiryDate: Date, items: [ReceiptItem])
    case expired(expiryDate: Date, items: [ReceiptItem])
    case notPurchased
}

Note that when one or more subscriptions are found for a given product id, they are returned as a ReceiptItem array ordered by expiryDate, with the first one being the newest.

This is useful to get all the valid date ranges for a given subscription.

#202 (fix for #200): It's now possible to specify the quantity when making a purchase. Quantity is also accessible in the callback.

This is an API breaking change. Product has been renamed to Purchase:

public struct Purchase {
    public let productId: String
    public let quantity: Int
    public let transaction: PaymentTransaction
    public let needsFinishTransaction: Bool
}

PurchaseResult

public enum PurchaseResult {
    //case success(product: Product) // old
    case success(purchase: Purchase) // new
    case error(error: SKError)
}

RestoreResults

public struct RestoreResults {
    //public let restoredProducts: [Product] // old
    //public let restoreFailedProducts: [(SKError, String?)] // old
    public let restoredPurchases: [Purchase] // new
    public let restoreFailedPurchases: [(SKError, String?)] // new
}

#203 (fix for #193): Add originalTransaction from SKPaymentTransaction.original to Payment type

TODO: Older releases