Delphi集成Google Play Billing:取消订阅到期后无需重启APP如何获取更新的订阅状态?
Delphi集成Google Play Billing:取消订阅到期后无需重启APP如何获取更新的订阅状态?
我之前在做Delphi安卓订阅功能的时候也碰到过一模一样的问题,当时折腾了好一阵才找到靠谱的解决办法,正好可以给你分享下经验:
别只靠
SetupInAppPurchase刷新状态!这个方法只是完成组件初始化,不会主动向Google Play服务器拉取最新的订阅数据,大概率用的是本地缓存的旧状态。你需要主动调用RestorePurchases方法,它会直接请求Google Play返回当前用户的所有有效/失效订阅记录,完全绕开本地缓存。
调用代码很简单:InAppPurchase.RestorePurchases;然后一定要在
OnRestorePurchasesComplete事件里处理返回的结果:procedure TMainForm.InAppPurchaseRestorePurchasesComplete(Sender: TObject; const Purchases: array of TPurchase); var SubPurchase: TPurchase; begin for SubPurchase in Purchases do begin // 核心判断:既要检查过期时间,也要确认取消原因 if (SubPurchase.ExpirationDate < Now) or (SubPurchase.CancelReason <> crNone) then begin // 订阅已过期或主动取消,执行失效逻辑 UpdateSubscriptionStatus(false); end else begin // 订阅仍在有效期内 UpdateSubscriptionStatus(true); end; end; // 如果没有返回任何订阅记录,说明用户没有有效订阅 if Length(Purchases) = 0 then UpdateSubscriptionStatus(false); end;要搞对订阅状态的判断逻辑:很多人会误以为只要取消订阅就立刻失效,但实际上Google Play是允许用户用到已付费周期结束的。只有当
ExpirationDate小于当前时间,并且CancelReason不是crNone的时候,才代表订阅真正失效了。定时主动刷新状态:如果你的APP需要实时感知订阅变化,可以在APP切换到前台时、或者每隔30分钟左右(别太频繁,避免被服务器限流)自动调用一次
RestorePurchases,这样不用用户重启APP,就能保证状态是最新的。避开缓存坑:TInAppPurchase的本地缓存有时候会“顽固”地保留旧状态,所以任何需要确认订阅有效性的场景(比如解锁付费功能、检查权限),都要走
RestorePurchases的流程,别依赖之前保存的本地数据。
内容来源于stack exchange
相关产品推荐
相关产品推荐

