iAd非页内广告的奇怪行为

4Ge*_*lOf 5 interstitial ios iad ios7 ios8

我在ios7和8中都遇到了一些奇怪的行为.

有时会发生全屏显示X(POTRAIT FUllSCREEN AD - 我的应用仅限横向).你点击X,你可以回到我的菜单.

但有时广告会显示没有X(LANDSCAPE FUllSCREEN AD).如果等待DiDFinish委托,则永远不会被调用.那么我试着点击它就消失了.然后它会显示另一个带有X的广告(LANDSCAPE FUllSCREEN AD).所以我点击X.然后转到另一个广告(LANDSCAPE FUllSCREEN AD),在那里DiDFinish被调用.iOS7它只会冻结显示的第3个广告.ios8它会显示第三个广告,然后转到黑屏?有没有人处理过这样的事情?

不确定当第一个广告以纵向显示时,它是否正常工作,是否有线索?

此外,显示的多个广告都是iAd而不是rev​​ mob和iAd组合,因为我有100%的iAd填充率.目前我只是试图让iAds全屏广告始终如一地运作

我知道委托被设置为didLoad当广告加载时调用委托这也是iPhone和iPad的问题

有没有其他人有这些问题?

使用..

[interstitial presentFromViewController:self];
Run Code Online (Sandbox Code Playgroud)

代替..

[interstitial presentInView:self.view];
Run Code Online (Sandbox Code Playgroud)

使一切正常工作presentFromViewController:..但现在已弃用

在此输入图像描述

这是我用的代码......

-(void)showFullScreenAd {
    //Check if already requesting ad
    if (requestingAd == NO) {
        //[ADInterstitialAd release];
        interstitial = [[ADInterstitialAd alloc] init];
        interstitial.delegate = self;
        self.interstitialPresentationPolicy = ADInterstitialPresentationPolicyManual;
        [self requestInterstitialAdPresentation];
        NSLog(@"interstitialAdREQUEST");
        requestingAd = YES;
    }
}

-(void)interstitialAd:(ADInterstitialAd *)interstitialAd didFailWithError:(NSError *)error {
    interstitial = nil;
    requestingAd = NO;
    NSLog(@"interstitialAd didFailWithERROR");
    NSLog(@"%@", error);

    [revmobFS loadWithSuccessHandler:^(RevMobFullscreen *fs) {
        [fs showAd];
        NSLog(@"Ad loaded");
    } andLoadFailHandler:^(RevMobFullscreen *fs, NSError *error) {
        NSLog(@"Ad error: %@",error);
    } onClickHandler:^{
        NSLog(@"Ad clicked");
    } onCloseHandler:^{
        NSLog(@"Ad closed");
    }];
}

-(void)interstitialAdDidLoad:(ADInterstitialAd *)interstitialAd {
    NSLog(@"interstitialAdDidLOAD");
    if (interstitialAd != nil && interstitial != nil && requestingAd == YES) {
        [interstitial presentInView:self.view];
        NSLog(@"interstitialAdDidPRESENT");
    }//end if
}

-(void)interstitialAdDidUnload:(ADInterstitialAd *)interstitialAd {
    interstitial = nil;
    requestingAd = NO;
    NSLog(@"interstitialAdDidUNLOAD");
}

-(void)interstitialAdActionDidFinish:(ADInterstitialAd *)interstitialAd {
    interstitial = nil;
    requestingAd = NO;
    NSLog(@"interstitialAdDidFINISH");
}
Run Code Online (Sandbox Code Playgroud)

如果有人可以发布完全在那里工作的代码供我试用也将获得+50声望

Nau*_*sel 3

我没有工作代码,但我查看了文档并找到了带有 iAd 方法的 UIViewController 类别

这里

看来您正在将旧代码与新代码混合在一起。

根据我所看到的,我建议:

        -(void)showFullScreenAd {
        //Check if already requesting ad
        if (requestingAd == NO) {
            [self requestInterstitialAdPresentation];
            requestingAd = YES;
        }
    }

    -(void)viewDidLoad()
{
    [super viewDidLoad];
// Any other setup.
 self.ADInterstitialPresentationPolicy = ADInterstitialPresentationPolicyManual

}
Run Code Online (Sandbox Code Playgroud)

这是继新的 iOS7 实施之后的。在 viewDidLoad 方法中设置策略允许框架预先缓存资源并开始从 iAd 服务器获取任何广告。准备就绪,因此当调用“showFullScreenAd”方法时,广告应该已准备就绪。

+(void)prepareInterstitialAds您还可以在加载视图或执行其他数据任务时调用类方法,这可以让框架预先缓存资产(如果可以),这意味着后续请求会更快。

对于 RevMob 处理广告失败的情况:[self requestInterstitialAdPresentation];返回一个布尔值,这意味着您可以处理该问题并告诉 RevMob 它失败了,等等。对于广告何时关闭。最好对presentingFullScreenAdViewController 的属性执行一些 KVO。其中说明是否显示FullScreenAd,我相信这只是iAd,Full Ad的。

得到如此不同结果的原因是因为您有两种在同一视图控制器中请求和呈现广告的方法。

当广告呈现为Portrait时,[self requestInterstitialAdPresentation];检索广告失败,但ADInterstitialAd实例的Instantiation已发送另一个请求。该文件已加载,因为您没有为实例的视图设置框架,它不知道它应该是横向的,因此会呈现纵向版本。由于现在在视图中呈现,视图不知道/关心它所处的方向,因此根据其几何形状呈现广告视图。

当它是风景时,就取决于成功者[self requestInterstitialAdPresentation];。顶部的广告是本次通话中的广告。我不确定为什么广告的其余部分显示景观,除非这是来自框架的内容,即 [self requestInterstitialAdPresentation]; 内部决定它必须是 ViewControllers 布局的横向布局,因此所有后续广告请求都适合此布局,除非 VC 方向再次更改。

[编辑] - 我整理了一个基本的示例片段。这是根据记忆/文档完成的,因此可能不是 100% 正确,并且很可能无法直接复制和粘贴。这是给一个想法,其中还包括对iOS7之前版​​本的支持

//.h 

@import UIKit;
@import iAd;

@interface MyInterstitialViewController : UIViewController <ADInterstitialAdDelegate>
{

}
@property (strong) ADInterstitialAd *fullScreenAd;

@end

//.m

#include MyInterstitialViewController.h

@implementation MyInterstitialViewController
{
    - (instancetype)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
    {
        if(self = [super initWithNibName:nibName bundle:nibBundle])
        {

        }
        return self;
    }


    -(void)viewDidLoad()
    {
        [super viewDidLoad];

        if([self respondsToSelector:@selector(requestInterstitialAdPresentation)] == YES)
        {
            self.ADInterstitialPresentationPolicy = ADInterstitialPresentationPolicyManual;
        }
    }

    -(void)viewWillDisappear
    {
        @try 
        {
                    **[self  removeObserver:self forKeyPath:@"isPresentingFullScreenAd"];**
                }
                @catch (NSException * __unused exception) 
        {
        }
    }

    -(void)showFullScreenAd()
    {
        if([self respondsToSelector:@selector(requestInterstitialAdPresentation)] == NO)
        {
            self.fullScreenAd = [[ADInterstitialAd alloc] init];
            self.fullScreenAd.delegate = self;
        }
        else
        {
            if([self requestInterstitialAdPresentation] == NO)
            {
                //Report back to RevMob Controller that the Ad Failed.
                [revmobFS loadWithSuccessHandler:^(RevMobFullscreen *fs) 
                { 
                    [fs showAd]; 
                    NSLog(@"Ad loaded"); 
                } andLoadFailHandler:^(RevMobFullscreen *fs, NSError *error) 
                { 
                    NSLog(@"Ad error: %@",error); 
                } onClickHandler:^{
                    NSLog(@"Ad clicked"); 
                } onCloseHandler:^{
                    NSLog(@"Ad closed"); 
                }]; 
            }
            else
            {
                **[self addObserver:self forKeyPath:@"isPresentingFullScreenAd" options:NSKeyValueObservingOptions.NSKeyValueObservingOptionNew context:nil];**
            }
        }
    }

//ADInterstitialAd Delegate Methods.
-(void)interstitialAd:(ADInterstitialAd *)interstitialAd didFailWithError:(NSError *)error 
{
    interstitial = nil; 
    NSLog(@"interstitialAd didFailWithERROR"); 
    NSLog(@"%@", error); 
    [revmobFS loadWithSuccessHandler:^(RevMobFullscreen *fs) 
        { 
            [fs showAd]; 
            NSLog(@"Ad loaded"); 
        } andLoadFailHandler:^(RevMobFullscreen *fs, NSError *error) 
        { 
            NSLog(@"Ad error: %@",error); 
        } onClickHandler:^{
            NSLog(@"Ad clicked"); 
        } onCloseHandler:^{
            NSLog(@"Ad closed"); 
        }]; 
} 
-(void)interstitialAdDidLoad:(ADInterstitialAd *)interstitialAd 
{
    NSLog(@"interstitialAdDidLOAD"); 
    if (self.fullScreenAd != nil) 
    { 
                   CGRect interstitialFrame = self.view.bounds;
 interstitialFrame.origin = self.view.origin;
 UIView *view = [[UIView alloc] initWithFrame:interstitialFrame];
 [self.view addSubview:view];
[self.fullScreenAd presentInView:view];


        NSLog(@"interstitialAdDidPRESENT"); 
    }//end if
}
-(void)interstitialAdDidUnload:(ADInterstitialAd *)interstitialAd 
{
    NSLog(@"interstitialAdDidUNLOAD");
}
-(void)interstitialAdActionDidFinish:(ADInterstitialAd *)interstitialAd
{
    NSLog(@"interstitialAdDidFINISH"); 
}


//KVO Responding

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{
    **if([keyPath isEqualTo:"isPresentingFullScreenAd"] == YES)
    {
        if([object === self])
        {
          if([self isPresentingFullScreenAd] == false)
          {
             //Handle logic for your app. New Screen etc.
          }
          else
          {
            //Handle logic for your app. Pause current activity etc.
          }
        }
    }**
}

}
Run Code Online (Sandbox Code Playgroud)

以供参考。

我所做的更改允许广告框架按照您期望的方式在 iOS 4.3 - 8.X 的所有版本上运行

从 iOS 4.3 - 6.X 开始,一般流程是:

创建一个广告,在委托方法中设置它的委托、呈现和句柄。

从 7 - 8.X(以前在 UIViewController 中呈现的方式在 iOS 7 中已被弃用,但弃用意味着以前的方法通常可以在下一个 X.0 版本之前使用。)

对于这种情况,您通过 [UIViewController requestInterstitialAdPresentation] 向框架请求广告;方法。如果有广告,控制器将创建一个视图并呈现它。您不再获得委托方法,“- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context”

方法允许您在广告完成显示时实质上获得委托调用,以便您可以继续应用程序的逻辑。本质上是“AdDidFinish”委托调用。但是,由于我们在控制器卸载之前不会删除观察者,因此如果已显示新广告,则有逻辑来处理。

这意味着 VC 的逻辑不必检查它是否始终呈现全屏广告。

您仍然可以使用 iOS 4.3 - 6.X 中的流程,但使用presentInView 方法。正如 iAd 编程指南中所述,如果您内部有内容视图,则应该使用此方法,我提出的是“过渡广告”方法。