TPInAppReceipt 是一个轻量级的纯 Swift 库,用于在本地读取和验证 Apple 应用内购买凭据。
注意:在 Objective-C 项目中使用 TPInAppReceipt - 如果您想在 Objective-C 项目中使用 TPInAppReceipt,请遵循本指南。
要使用 CocoaPods 将 TPInAppReceipt 集成到您的项目中,请在您的 Podfile
中指定它
platform :ios, '12.0'
target 'YOUR_TARGET' do
use_frameworks!
pod 'TPInAppReceipt'
end
然后,运行以下命令
$ pod install
在任何您想使用 TPInAppReceipt 的 swift 文件中,使用 import TPInAppReceipt
导入框架。
要使用 Apple 的 Swift 包管理器进行集成,请将以下内容作为依赖项添加到您的 Package.swift
.package(url: "https://github.com/tikhop/TPInAppReceipt.git", .upToNextMajor(from: "3.0.0"))
然后,在您希望使用 TPInAppReceipt 的 Target 中,将 "TPInAppReceipt"
指定为依赖项。
最后,运行以下命令
swift package update
InAppReceipt
对象封装了关于凭据及其关联购买的信息。要验证应用内购买凭据,您必须创建一个 InAppReceipt
对象。
要创建 InAppReceipt
对象,您可以提供原始凭据数据或初始化本地凭据。
do {
/// Initialize receipt
let receipt = try InAppReceipt.localReceipt()
// let receipt = try InAppReceipt() // Returns local receipt
// let receiptData: Data = ...
// let receipt = try InAppReceipt.receipt(from: receiptData)
} catch {
print(error)
}
TPInAppReceipt
提供了多种便捷方法来验证应用内购买凭据
/// Verify hash
try? receipt.verifyHash()
/// Verify bundle identifier
try? receipt.verifyBundleIdentifier()
/// Verify bundle version
try? receipt.verifyBundleVersion()
/// Verify signature
try? receipt.verifySignature()
/// Validate all at once
do {
try receipt.verify()
} catch IARError.validationFailed(reason: .hashValidation) {
// Do smth
} catch IARError.validationFailed(reason: .bundleIdentifierVerification) {
// Do smth
} catch IARError.validationFailed(reason: .signatureValidation) {
// Do smth
} catch {
// Do smth
}
注意:Apple 建议在您的应用启动后立即执行凭据验证。为了提高安全性,您可以在应用程序运行时定期重复此检查。注意:如果 iOS 中的验证失败,请先尝试刷新凭据。
如果您的 App 为自动续订订阅提供体验定价,您将需要显示正确的价格,即体验价或常规价格。InAppReceipt
类提供了一个用于确定体验价资格的接口。最简单的情况是,只需提供属于同一订阅组的产品标识符 Set
// Check whether user is eligible for any products within the same subscription group
var isEligible = receipt.isEligibleForIntroductoryOffer(for: ["com.test.product.bronze", "com.test.product.silver", "com.test.product.gold"])
注意:要确定用户是否有资格获得体验优惠,您必须首先初始化并验证凭据,然后才能检查资格。
/// Initialize receipt
let receipt = try! InAppReceipt.localReceipt()
/// Base64 Encoded Receipt
let base64Receipt = receipt.base64
/// Check whether receipt contains any purchases
let hasPurchases = receipt.hasPurchases
/// All auto renewable `InAppPurchase`s,
let purchases: [InAppPurchase] = receipt.autoRenewablePurchases
/// all ACTIVE auto renewable `InAppPurchase`s,
let activePurchases: [InAppPurchase] = receipt.activeAutoRenewableSubscriptionPurchases
// Retrieve Original TransactionIdentifier for Product Name
receipt.originalTransactionIdentifier(ofProductIdentifier: subscriptionName)
// Retrieve Active Auto Renewable Subscription's Purchases for Product Name and Specific Date
receipt.activeAutoRenewableSubscriptionPurchases(ofProductIdentifier: subscriptionName, forDate: Date())
// Retrieve All Purchases for Product Name
receipt.purchases(ofProductIdentifier: subscriptionName)
必要时,使用此方法确保您正在使用的凭据是最新的。
InAppReceipt.refresh { (error) in
if let err = error
{
print(err)
} else {
initializeReceipt()
}
}
TPInAppReceipt 在 MIT 许可证下发布。有关更多信息,请参阅 LICENSE。