What does VerificationError.revokedCertificate mean in StoreKit 2?
VerificationResult.VerificationError.revokedCertificate means the certificate chain of a signed StoreKit 2 value includes a revoked certificate.
Quick facts#
| Error | VerificationResult.VerificationError.revokedCertificate |
| Where | StoreKit 2, Swift (VerificationResult) |
| Available since | iOS 15.0, iPadOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, visionOS 1.0 |
| What the vendor says | An error that indicates the certificate chain includes a revoked certificate. |
Cause#
- StoreKit 2 returns transactions, renewal information and the app transaction wrapped in a
VerificationResult. It checks them for you, and a value that fails is.unverifiedwith the reason as aVerificationError(VerificationResult). - Apple adds that in some cases this error may resolve if you try again later.
revokedCertificateis one of six reasons Apple lists, next toinvalidSignature,invalidCertificateChain,invalidDeviceVerification,invalidEncoding,missingRequiredPropertiesandrevokedCertificate.
Fix#
- Treat an
.unverifiedresult as untrusted. Do not unlock content from it and do not callfinish()on it until you have decided what to do. - Retry later, because Apple says the error can clear. Meanwhile keep the purchase pending and do not unlock it from the device alone.
- Log the
VerificationErrorand the transaction ID, then check the same transaction on your server with Apple's App Store Server Library or the App Store Server API. - If it only happens in testing, check the test environment (Xcode StoreKit configuration, sandbox account) before changing code.
Example#
Swift
import StoreKit
// Only a verified transaction may unlock content. Log the reason when a transaction is unverified.
func handle(_ result: VerificationResult<Transaction>) {
switch result {
case .verified(let transaction):
print("Unlock \(transaction.productID)")
case .unverified(let transaction, let error):
if case .revokedCertificate = error {
print("A certificate in the chain is revoked for \(transaction.productID); do not unlock")
} else {
print("Verification failed: \(error)")
}
}
}Compile-checked: npm run check:snippets type-checks this snippet with swiftc against the Apple SDK (macOS target, checked 2026-10-03).
How the RevenueDot SDK reports it#
The RevenueDot purchases-ios fork turns an unverified transaction from a purchase or a transaction update into ErrorCode.storeProblemError (code 2) with the VerificationError as the underlying error, and it does not unlock the purchase. When it only reads existing transactions (offline entitlements, transaction history), it logs a warning and skips the unverified ones.
Related#
- What does VerificationError.invalidSignature mean in StoreKit 2?
- What does storeProblemError (code 2) mean in the purchases SDK?
- What does invalidReceiptError (code 8) mean in the purchases SDK?
Source#
- Apple: VerificationResult.VerificationError.revokedCertificate
- Apple: VerificationResult
- RevenueDot purchases-ios: StoreKit2TransactionListener.swift
Checked: 2026-10-03