What changed and how to update your code.
.package(url: "https://github.com/tikhop/TPInAppReceipt.git", from: "4.0.0")- iOS 12 → iOS 13
- macOS 10.13 → macOS 10.15
- tvOS 12 → tvOS 13
- Swift 5.9 → Swift 6.0
// Before
let receipt = try InAppReceipt.localReceipt()
// or
let receipt = try InAppReceipt()
// After
let receipt = try await AppReceipt.local// Before
let receipt = try InAppReceipt.receipt(from: data)
// After
let receipt = try AppReceipt.receipt(from: data)// Before
do {
try receipt.verify()
} catch IARError.validationFailed(reason: .hashValidation) {
// ...
}
// After
let result = await receipt.validate()
switch result {
case .valid:
break
case .invalid(let error):
// error is typed: ReceiptValidatorError, ChainVerificationError, etc.
print(error)
}Individual verification methods (verifyHash(), verifySignature(), verifyBundleIdentifier()) are removed. Use custom ReceiptValidator composition instead. See doc:Validating-Receipt.
| v3 | v4 |
|---|---|
IARError |
AppReceiptError |
IARError.validationFailed(reason:) |
ReceiptValidatorError, ChainVerificationError, HashVerificationError, etc. |
originalAppVersionis nowString?(wasString)ageRatingis nowString?(wasString)environmentis nowInAppReceiptPayload.Environmentenum (wasString). Update comparisons:receipt.environment == .productioninstead ofreceipt.environment == "Production".signatureis nowData(wasData?)InAppPurchaseproperties are nowlet(wasvar)InAppPurchase.originalPurchaseDateis nowDate?(wasDate!)autoRenewablePurchases— same API, works onAppReceiptactiveAutoRenewableSubscriptionPurchases— same API
If you prefer synchronous api, import the library with @_spi(Blocking) to access blocking variants of the async API.
@_spi(Blocking) import TPInAppReceipt
// Load receipt
let receipt = try AppReceipt.local_blocking
// Validate
let result = receipt.validate_blocking()See doc:Blocking-Mode for more details.
// Before
InAppReceipt.refresh { error in
// ...
}
// After
try await AppReceipt.refresh()cancelRefreshSession() and isReceiptRefreshingNow are removed. Use Swift Concurrency task cancellation instead.
InAppReceiptField has been renamed to AppReceiptField and changed from a struct with static constants to an enum. Purchase-specific fields are now in a separate InAppPurchaseReceiptField enum.
- Objective-C bindings
- CocoaPods support
isValidcomputed property — useawait receipt.validate()insteadbase64computed propertySKSubscriptionGroupclass and relatedSKProductsResponseextensionsisEligibleForIntroductoryOffer(for: SKSubscriptionGroup)overload — useSet<String>variant instead