概述
Purchaser 是一组用 Swift 编写的类,旨在帮助 iOS 开发者简化在应用程序中实现内购的过程。
待办事项
- 支持所有类型的商品(目前只支持自动续订订阅)。
- 添加收据验证。
- 添加收据刷新。
要求
- iOS 9.0+
- Xcode 10.0+
- Swift 4.2+
设置
在源文件中导入 Purchaser
import Purchaser
现在您可以选择在开始时设置产品标识符,这样库执行的操作将使用这些标识符进行;或者按需手动设置标识符。无论如何,强烈建议您在 AppDelegate.swift
子类中设置 Purchaser
。只需调用
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Setup with product identifiers
Purchaser.setup(with: ["my_awesome_product_identifier"])
// Setup identifiers later
Purchaser.setup()
return true
}
此步骤是强制性的,确保所有交易都能够按照预期处理,即使它们最初由于缺乏互联网连接或应用程序终止而失败。
⚠️ 注意事项
闭包
为了避免引发强引用循环怪物,确保在需要时使用提供示例代码中的self
标记为weak
或unowned
。Purchaser
将完成闭包存储在属性中,保留闭包内的对象。
请求产品
要从App Store请求产品列表,请使用以下方法
Purchaser.requestProducts { [unowned self] (products, _, error) in
if let error = error {
print("error requesting products: \(error)")
} else {
self.products = products
self.reload()
}
}
它返回一个包含SKProduct
对象、无效产品标识符数组和识别错误的Error
对象(如果有错误)的数组。
如果要稍后设置产品标识符,应在调用时传递产品标识符的数组
let identifiers = ["my_awesome_product_identifier"]
Purchaser.requestProducts(with: identifiers) { (products, _, error) in
// Handle response
}
如果没有提供,则调用的返回“缺少产品标识符”错误。
购买产品
一旦你从Apple获取了有效产品的列表,你可以为每个产品调用buy(product:)
函数
Purchaser.buy(product) { (state, _, _, error) in
if let error = error {
print("error buying product: \(error)")
} else {
if state == .purchasing || state == .deferred { return }
print("product purchased!")
}
}
对于完成的交易,将调用该闭包。对于不完整的交易,系统恢复后没有完成交易的情况将调用该闭包。
另外(强烈推荐),你可以传递一个account
参数,它将被用于SKPayment
对象的applicationUsername
参数。该属性的值可以是一个字符串,用来标识进行交易的用户(用户名、电子邮件等)。Purchaser
会为传递的值创建SHA256散列,并将其设置为applicationUsername
参数。
检查产品的购买状态
你可以通过调用来检查产品是否已被购买
Purchaser.isProductPurchased(with: "my_awesome_product_identifier")
检查用户是否能够付款
有时,付款功能可能因设备中配置的家长控制等原因被限制。要检查用户是否能够付款,可以使用
Purchaser.canMakePayments()
开发者通常会隐藏付款相关的UI元素,如果用户无法进行付款。
恢复产品
要恢复之前完成的交易,你需要调用
Purchaser.restorePurchases { (state, _, finished, error) in
if let error = error {
print("error restoring products: \(error)")
} else {
if state == .purchasing || state == .deferred { return }
print("products restored!")
}
}
你可以检查finished
参数来了解是否所有交易都已完成。对于任何恢复的单个交易,它将被设置为false
,而当所有交易都恢复时,它将被设置为true
。