我想将 IAP 的产品数据加载到我的应用程序的 UI 中(它将显示在 SwiftUI 视图中,但该应用程序通常是使用 UIKit 构建的)
我有一个函数,我调用Purchases
类的 products 函数。它返回一个SKProduct
. 我使用结果生成器添加了一个额外的安全层。当它失败时,我会显示一个错误警报(我从来没有失败过)。此函数是包含与 Purchases 类的所有交互的类的一部分:
func retrieve(_ id: ProductID, completed: @escaping(Result<SKProduct, LCError>) -> Void) {
Purchases.shared.products([id.rawValue]) { products in
guard !products.isEmpty else {
completed(.failure(.unableToRetrieveProduct))
return
}
let skProduct = products[0]
completed(.success(skProduct))
}
}
这ProductID
是一个包含所有产品 ID 的自定义枚举,以便于访问并防止拼写错误。
我在我的ViewModel
. 然后我打开结果。.failure
案例并不完美,我应该抛出一个错误,但现在,它可以完成工作。当我测试我的应用程序时,它从未失败过:
func getTipItem(for id: ProductID, title: String ) -> TipItem {
var price: NSDecimalNumber = 1.0
var priceSymbol: String = ""
PurchaseService().retrieve(id) { result in
switch result {
case .success(let product):
price = product.price
priceSymbol = product.priceLocale.currencySymbol ?? "Err$"
case .failure(let error):
price = 1.0
priceSymbol = error.localizedDescription
}
}
return TipItem(title: title, price: price, currencySymbol: priceSymbol)
}
struct TipItem: View {
let title: String
let price: NSDecimalNumber
let currencySymbol: String
var body: some View {
HStack {
Text(title)
Spacer()
Text("\(currencySymbol)\(price)")
}.foregroundColor(Color(.label))
}
}
但是,问题是当我的视图加载时,没有加载货币符号,价格只有 1(或 1.0000 等)。我知道它不会退回到 .faillure 的情况,因为我已经为默认货币符号添加了一个前缀Err
,以便知道什么时候出了问题。
以下是调试日志:
2021-02-16 22:59:14.854771+0100 Learn Chemistry[10847:629632] [Purchases] - DEBUG: Requesting products with identifiers: {(
"tip_small_099"
)}
2021-02-16 22:59:14.955628+0100 Learn Chemistry[10847:629814] [Purchases] - DEBUG: Products request finished
2021-02-16 22:59:14.955751+0100 Learn Chemistry[10847:629814] [Purchases] - DEBUG: Valid Products:
2021-02-16 22:59:14.955819+0100 Learn Chemistry[10847:629814] [Purchases] - DEBUG: tip_small_099 - <SKProduct: 0x2814ca160>
2021-02-16 22:59:14.955899+0100 Learn Chemistry[10847:629814] [Purchases] - DEBUG: Invalid Product Identifiers - (
)
仅当第一次加载视图时才会出现此问题。当我返回上一个屏幕并返回显示产品的视图时,它会正确显示它。
第一次加载视图时,如何使正确的数据也显示?还是 RC 框架中的错误?
谢谢!
BSM