TPInAppReceipt

Swift CocoaPods Compatible Swift Package Manager compatible Platform GitHub license

TPInAppReceipt 是一个轻量级的纯 Swift 库,用于在本地读取和验证 Apple 应用内购买凭据。

功能

安装

注意:在 Objective-C 项目中使用 TPInAppReceipt - 如果您想在 Objective-C 项目中使用 TPInAppReceipt,请遵循本指南。

CocoaPods

要使用 CocoaPods 将 TPInAppReceipt 集成到您的项目中,请在您的 Podfile 中指定它

platform :ios, '12.0'

target 'YOUR_TARGET' do
  use_frameworks!

  pod 'TPInAppReceipt'
end

然后,运行以下命令

$ pod install

在任何您想使用 TPInAppReceipt 的 swift 文件中,使用 import TPInAppReceipt 导入框架。

Swift Package Manager

要使用 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