我们的应用程序在每个播放级别后显示插页式iAd。 在关卡完成后,我们会制作广告:
_interstitial = [[ADInterstitialAd alloc] init];
_interstitial.delegate = self;
并且委托实现以下回调方法:
- (void)interstitialAdDidUnload:(ADInterstitialAd *)interstitialAd
{
[self finish];
}
- (void)interstitialAd:(ADInterstitialAd *)interstitialAd didFailWithError:(NSError *)error
{
[self finish];
}
- (void)interstitialAdDidLoad:(ADInterstitialAd *)interstitialAd
{
[_interstitial presentFromViewController:self];
}
- (void)interstitialAdActionDidFinish:(ADInterstitialAd *)interstitialAd
{
[self finish];
}
然后,finish方法清理事物并将用户转发到主菜单。 从创建广告对象到调用完成方法的那一刻起,屏幕上就会显示一个旋转轮。
现在的问题是,如果没有加载广告(例如,如果没有可用的互联网连接),则不会调用任何回调函数,因此我们还会在创建广告时添加NSTimer,并在10秒后检查,例如这样:
_interstitial = [[ADInterstitialAd alloc] init];
_interstitial.delegate = self;
_timer = [NSTimer scheduledTimerWithTimeInterval:10
target:self
selector:@selector(checkForAds:)
userInfo:nil
repeats:false];
-(void)checkForAds:(NSTimer *)timer
{
[_timer invalidate];
if(!_interstitial.loaded)
[self finish];
}
但这看起来非常不干净 - 如果没有互联网连接可用,或者如果连接非常糟糕,它也会导致每个级别后10秒的旋转轮延迟。
所以,我的问题:
处理这个问题的正确方法是什么?我觉得这里的计时器不是正确的。
我正在考虑在关卡开始之前创建Ad对象,然后在关卡完成后立即检查_interstitial.loaded属性并在这种情况下显示广告,否则跳过它,而不使用计时器。问题是,一个级别的会话可能需要很长时间(我会说1到60分钟)并且我读到广告可能会过期,但是文档中没有任何迹象表明广告到期需要多长时间以及这个案例。如果广告在后台同时到期,_interstitial.loaded属性是否会返回false?是广告到期时调用的一些回调函数?这是在一个关卡开始之前创建广告对象的可行方法(即,在广告实际显示之前的1-60分钟),之后只检查_interstitial.loaded是否为真,在这种情况下是否显示广告?