我正在Swift中集成Superwall和RevenueCat。我决定使用Superwall,因为它易于配置和设置,但实际上我很难有条件地仅向未订阅该平台的用户呈现付费墙。如果用户正确订阅,是否有专业的方式来签入(isUserSubscribed)?
extension PaywallService: PaywallDelegate {
// 1
func purchase(product: SKProduct) {
Task {
do {
let result = try await Purchases.shared.purchase(product: StoreProduct(sk1Product: product))
// React to the purchase here
print(result)
} catch {
// Handle purchase error here
}
}
}
// 2
func restorePurchases(completion: @escaping (Bool) -> Void) {
Task {
do {
let purchaserInfo = try await Purchases.shared.restorePurchases()
// check purchaserInfo to see if subscription "MyEntitlement" is now active
let restored = purchaserInfo.entitlements.all["subPlan"]?.isActive == true
completion(restored)
} catch {
completion(false)
}
}
}
// 3
func **isUserSubscribed**() -> Bool {
// TODO: I need to check here if the user is correctly subscribed, but this first run always gives false and the user is ALWAYS getting the paywall.
var isSub:Bool = false
Purchases.shared.getCustomerInfo { purchaserInfo, error in
// access latest purchaserInfo
if (purchaserInfo?.entitlements.all["subPlan"]?.isActive == true) {
isSub = purchaserInfo?.entitlements.all["subPlan"]?.isActive == true
} else {
isSub = false
}
}
return isSub
}
}
非常感谢!
我的第一次运行总是给假的,用户总是得到付费墙。
1条答案
按热度按时间ryhaxcpt1#
问题是
Purchases.shared.getCustomerInfo
有一个异步的完成块,这意味着isSub
的值在完成块有机会更新isSub
之前立即返回,这就是为什么它总是false
。要同时管理RevenueCat和Superwall,我们建议您创建一个名为
PaywallManager.swift
的类来处理这一切(请记住替换您的API密钥):在AppDelegate中调用此函数:
它的作用是在配置
Paywall
之前先配置和设置Purchases
的委托。当它这样做时,委托函数purchases(_:,receivedUpdated:)
接收到一个包含最新CustomerInfo
的回调。从那里,它在调用isUserSubscribed()
之前确定和存储用户的订阅状态。请注意,对于全新安装的应用程序,如果您有
session_start
触发器,则在RevenueCat有机会更新订阅状态之前仍将调用isUserSubscribed()
,因为RevenueCat正在从在线检索客户信息。对于后续打开的应用程序,用户订阅状态将是正确的。我们将在应用程序的下一次重大更新中修复此问题,但是,除非有订阅的用户正在重新下载应用程序,否则你应该没问题。