当前位置: 首页 > 知识库问答 >
问题:

iAd间质异常行为

易炳
2023-03-14

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

有时全屏显示X(POTRAIT全屏广告-我的应用程序仅为横向)。你点击X,就可以返回我的菜单了。

但有时会显示不带X的广告(LANDSCAPE FUllSCREEN AD)。如果您等待DiDFinish委托永远不会被调用。所以我尝试单击它以离开。然后它会显示另一个带有X的广告(LANDSCAPE FUllSCREEN AD)。所以我单击X。然后它会转到另一个广告(LANDSCAPE FUllSCREEN AD),其中调用DiDFinish。iOS7它会在第三个广告显示时冻结。ios8它会显示第三个广告一秒钟,然后转到黑屏?有人处理过这样的事情吗?

不确定第一个广告以纵向显示时效果是否良好,是否有线索?

此外,显示的多个广告都是iAd而不是rev mob和iAd,因为我有100%的iAd填充率。目前,我只是想让iAds的全屏广告始终如一地发挥作用

我知道代理被设置为didLoad,当广告加载时代理被调用,这也是iPhone和iPad都存在的问题

还有人有这些问题吗?

使用。。

[interstitial presentFromViewController:self];

而不是

[interstitial presentInView:self.view];

使一切正常运行。。但是现在不推荐使用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");
}

如果有人可以在那里发布代码,在那里的应用程序中完全工作,让我尝试也将获得50的声誉

共有1个答案

阎令
2023-03-14

我这边没有工作代码,但我查看了文档,找到了UIViewController与iAd方法的分类

在这里

您似乎将旧代码与新代码混合在一起。

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

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

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

}

这遵循新的iOS7实现。在viewddLoad方法中设置策略允许框架预先缓存资产并开始从iAd Server获取任何广告。准备好了,所以当调用“show FullScreenAd”方法时,广告应该准备好了。

在加载视图或执行其他数据任务时,也可以调用类方法prepareInterstitialAds,这使框架可以预缓存资产,这意味着后续请求更快。

对于ad失败的RevMob处理:<代码>[self-RequestInterstitalAdPresentation] 返回一个布尔值,这意味着您可以处理它,并告诉RevMob它失败了,等等,以确定广告何时关闭。最好在ViewController的presentingFullScreenAd属性上执行一些KVO。这说明它是否显示了全屏幕广告,我相信这只是iAd,全屏幕广告。

之所以会有如此不同的结果,是因为在同一视图控制器中有两种方式可以请求和显示广告。

当广告显示为纵向时,[自请求InterstitialAdPresent];无法检索广告,但ADInterstitialAd实例的实例化已发送另一个请求。这已加载,因为您没有为实例的视图设置框架,它不知道它是横向的,因此呈现纵向版本。由于现在在视图中呈现,视图不知道/关心它的方向,因此根据它的几何形状呈现广告视图。

当它是横向的时,取决于[self-RequestInterstitalAdPresentation] 成功。上面的广告就是这个电话的广告。我不知道为什么广告的其余部分会显示出来,除非这是来自框架的东西,即[自我请求的中间层表现];内部决定它必须是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.
          }
        }
    }**
}

}

供参考。

我所做的更改允许广告框架按照您的期望在4.3-8的所有版本的iOS上工作。X

来自iOS 4.3-6。X总流程为:

创建一个Ad,在delegate方法中设置它的delegate、present和handle。

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

对于这种情况,您可以通过[UIViewController RequestInterstitalAdPresentation]向框架请求广告;方法如果控制器有ad,它将创建一个视图并显示它。您不再获得委托方法,即“-(void)observeValueForKeyPath:(NSString*)对象的键路径:(id)对象更改:(NSDictionary*)更改上下文:(void*)上下文”

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

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

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

 类似资料:
  • 我正在我的项目中实施间隙IAD。每场比赛后,我都会尝试显示一个中间广告。然而,在我的测试中,我得到一个错误,即大约10场比赛后,中间广告太多了。如何删除这些插入式广告? 代码: 此外,我还试图在每次比赛结束后播放一则插播广告。然而,有时没有显示广告,我认为这是正常的,因为广告库存可能并不总是可用的。因此,游戏通常在结束时不显示广告。 是否有一种方法,我可以检测到是否不会显示间隙广告,以便我可以使用

  • 我得到java.lang.NoSuch方法例外请帮助我在这... 这就是我得到的错误- 错误:java.lang.运行时异常:java.lang.NoSuchmethod异常:com.nielsen.GRFE.processor.mapreduce.占位符$PlaceholderMapper.()在org.apache.hadoop.util.Reflse Utils.new实例(Reflse U

  • 本文向大家介绍质量保证与质量控制之间的差异,包括了质量保证与质量控制之间的差异的使用技巧和注意事项,需要的朋友参考一下 质量保证和质量控制都主要关注应用程序的无缺陷交付。在这两种质量保证中,质量保证被称为质量保证(QA),重点在于防止缺陷。质量保证可确保为项目设计的方法,技术,方法和过程能够正确实施,而质量控制被称为质量控制,重点在于发现缺陷。质量控制确保正确设计项目中设计的方法,技术,方法和过程

  • 问题内容: 我收到此异常。我正在使用Eclipse Juno和Tomcat 7.0。在控制台中,每10-15分钟至少发生一次此异常。怎么解决呢? 问题答案: 与其在eclipse.ini中进行更改,不如安装Java 8 。 我安装了Java 8,但现在没有异常。

  • 问题内容: 当运行上述代码片段时,在控制台中,我得到的输出为: 但我期望输出为 但是当在main()内部更改如下所述的逻辑时 我正在获得所需的输出 根据我的理解,TreeMap的entrySet()方法返回地图中包含的映射的集合视图。集合的迭代器以升序键顺序返回映射。那么,为什么在第一种情况下会发生这种情况? 任何建议都将受到高度赞赏。 问题答案: 因为在字典上小于。 这里有一个提示: 这是另一个

  • 我想在我的应用程序中使用插屏广告,所以我实现了所有必要的委托方法。问题是,如果我使用[self Request estInterstitialAdPresent]来显示广告,只有interstitialAdddLoad:方法被调用。interstitialAdActionddFinish:方法没有被调用... 但是,如果我使用已弃用的[self.interstitialPresinFromView