【问题标题】:Strange Behaviour with iAd InterstitialiAd 插页式广告的奇怪行为
【发布时间】:2014-11-19 19:28:56
【问题描述】:

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

有时会出现全屏显示 X(POTRAIT FUllSCREEN 广告 - 我的应用仅限横向)。你点击 X 就可以回到我的菜单了。

但有时广告会在没有 X(LANDSCAPE FUllSCREEN AD) 的情况下展示。如果您等待 DiDFinish 代表永远不会被调用。所以我试着点击它离开。然后它会显示另一个带有 X(横向全屏广告)的广告。所以我点击 X。然后它转到另一个广告(横向全屏广告),其中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 声望

【问题讨论】:

    标签: ios ios7 ios8 iad interstitial


    【解决方案1】:

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

    Here

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

    根据我所见,我会建议:

            -(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 实现。在 viewDidLoad 方法中设置策略允许框架预先缓存资产并开始从 iAd 服务器获取任何广告。准备好了,所以当调用“showFullScreenAd”方法时,广告应该准备好了。

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

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

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

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

    当它是景观时,[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.
              }
            }
        }**
    }
    
    }
    

    供参考。

    我所做的更改允许广告框架在 4.3 - 8.X 的所有 iOS 版本上正常工作

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

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

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

    对于这种情况,您通过 [UIViewController requestInterstitialAdPresentation] 向框架请求广告;方法。如果有广告,控制器将创建一个视图并展示它。您不再获得委托方法, "- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id) 对象 改变:(NSDictionary *)改变 上下文:(void *)context"

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

    这意味着您的 VC 的逻辑不必检查它是否一直在展示全屏广告。

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

    【讨论】:

    • 修复了除此行之外的所有错误。[对象显示横幅广告] 表示选择器没有已知的实例方法
    • 抱歉,您需要强制转换,因此在该行之前放置类似:ADIntersitualAd* ad = (ADIntersitualAd*) 对象,然后将 if 中的方法更改为 [ad displayBannerAd];
    • 同样的错误..- (void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { ADInterstitialAd 广告 = (ADInterstitialAd*) 对象; if([keyPath isEqualToString:@"displayingBannerAd"] == YES) { if([ad displayBannerAd] == false) {
    • 尝试 ad.displayingBannerAd 或任何自动完成建议的内容
    • no autocorrect is available says no visible @interface for 'ADInterstitialAd' 声明选择器 'displayingBannerAd'... 如果我注释掉此方法,一切正常 :) rev mob 和 iAd .. 什么这是 observeValueKeyPath 函数的目的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多