问题描述
我正在将 GADRewardedInterstitialAd
实现到游戏中。
https://developers.google.com/admob/ios/api/reference/Classes/GADRewardedInterstitialAd
我使用 presentFromrootViewController:userDidEarnRewardHandler
对完成广告的用户做出反应。
现在我还想知道如何对取消广告的用户做出反应。
如果我在调用 presentFromrootViewController 后直接继续,回调处理程序将不会被调用,因为系统是异步的,正如预期的那样。因此,任何游戏动画(例如屏幕淡入淡出、对话框关闭)都必须停止。
如果我只依赖处理程序,当广告被取消时我不会收到回调。
我的解决方案是建立一个等待 30+1 秒的计时器,让处理程序有机会被调用(希望在下一个主线程调度周期),然后对尚未被调用的它做出反应(假设取消由用户)。 我真的很讨厌那个计划。
- 这不是确定性的。
- 它不使用回调/委托/处理程序(这非常适合这种事情)
- 我必须编写计时器代码并在某处保留一个布尔标志......这很混乱。
- 当用户关闭广告时,它会为用户体验增加任意延迟(30+1 秒)!
我是否对此有错误的看法,还是这只是 Google 的做法,我将不得不接受它?
编辑:请注意,我说的是新的 GADRewardedInterstitialAd API,而不是 GADRewardedAd。
解决方法
我已经想通了;它通过设置 GADFullScreenContentDelegate fullScreenContentDelegate
并实现 adDidDismissFullScreenContent
来工作。
在那里你可以检查这个特定的 GADRewardedInterstitialAd
实例是否还没有得到奖励(如 userDidEarnRewardHandler
... 所通知的)
这一切都取决于 adDidDismissFullScreenContent
在 userDidEarnRewardHandler
之后被调用的断言,否则我已经假设没有奖励。让我们希望永远如此。