2014-09-13 77 views
1

我在我的视图控制器(通过协议)上实现了一种方法,我的游戏引擎调用该方法来呈现插页式广告。iOS7:如何等待requestInterstitialAdPresentation完成

我希望在播放全屏广告时防止控制循环返回调用方,并且不会影响广告清理和延迟处理时发生的SKScene对象的后续动画。

我用下面的代码实现了这一点,它检查是否会显示广告,并阻止当前线程,直到广告不再显示,并且该视图不为该广告卸载。 (没有解雇检查,我的转换似乎太早)。

我知道iOS7中的iAD模型更简单,不需要实现委托等等。但是,等待插页式广告在iOS7中完成的正确方法是什么? (注意,我使用SpriteKit,而不是故事板)。我是否必须恢复使用iOS6或更少的样式代表?

-(void)presentFullScreenAd 
{ 
    if([self requestInterstitialAdPresentation]) 
    { 
     while(self.isPresentingFullScreenAd || self.isBeingDismissed) 
     { 
      // wait till we have finished before continuing 
      [NSRunLoop.currentRunLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; 
     } 
    } 
} 

回答

1

上面的代码不iOS8上(模拟器中在iPhone上4S测试)工作,它将无限循环。所以我不得不改变它。

这并不完美,但在转换之间仍然存在一些颠簸,但却不那么黑客。

首先,在视图控制器,创建一个辅助方法,暂停和取消暂停当前SKView

-(void)pauseCurrentSKView:(bool)paused 
{ 
    if([self.view isKindOfClass:[SKView class] ]) 
    { 
     SKView* pView = (SKView*)self.view; 
     pView.paused = paused; 
    } 
} 

然后让你的全屏广告法立即暂停的看法,但取消暂停,如果广告没” t显示。稍后你会停下来。

-(void)presentFullScreenAd 
{ 
    // pause ASAP - requestInterstitialAdPresentation may take some time 
    // so you need to pause before your transitions kick in. 
    [self pauseCurrentSKView:YES]; 

    if([self requestInterstitialAdPresentation]==NO) 
    { 
     [self pauseCurrentSKView:NO]; 
    } 
} 

然后处理您的视图重新开始播放时 - 并恢复动画。

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    if(self.isPresentingFullScreenAd) 
    { 
     // we are about to stop presenting full screen ads 
     [self pauseCurrentSKView:NO]; 
    } 
    else 
    { 
     // we are presenting the normal view or the full screen ad 
    } 
} 

最关键的事情是要确保你打电话后presentFullScreenAd方法,你把你的代码中遵循块行动,打击在节点中的观点,这样你就不必担心“的时候广告不见了,做这个代码'。

如果有人有任何改进 - 请广告。 我有意不包含额外的代码,我只会每三分钟发布一次全屏广告 - 容易做到。