菜鸟教程小白 发表于 2022-12-13 06:38:30

ios - 在 iOS 上使用共享横幅切换标签时显示 AdMob 和/或 iAd


                                            <p><p>我有一个带有 <code>UITabBarController</code> 的应用程序,其中包含 5 个选项卡,其中每个选项卡都是一个 <code>UIViewController</code>,其中嵌入了一个 <code>UITableView</code>。我带来了iAds 和 AdMobs 到我的应用程序,将使用 IAP 删除。这是一个通用的 iPhone 和 iPad 应用程序。 </p>

<p>起初,我只使用共享横幅和 <code>AppDelegate</code> 实现了 iAd,效果非常好。现在,在发布之前,我还将使用 AdMob 横幅作为备用,以防 iAd 横幅无法加载。我以与 iAd 横幅相同的方式设置它。 </p>

<p>以同样的方式实现实际的 AdMob 横幅不是问题,但我在更改标签时遇到了问题。 </p>

<p><strong>问题</strong></p>

<p>如果加载 iAd 横幅并且我从第一个选项卡移动到第二个选项卡,它会继续显示 iAd 横幅。如果加载了 AdMob 横幅并且我从第一个选项卡移动到第二个选项卡,则 AdMob 横幅会消失,直到它再次加载。 </p>

<p>代码:</p>

<pre><code>- (void)viewWillAppear:(BOOL)animated
{
    ;
    NSLog(@&#34;VIEW WILL APPEAR&#34;);
    if (![ boolForKey:@&#34;IAPSuccessful&#34;])
    {
      NSLog(@&#34;View will appear and the IAP is not Successful&#34;);
      ;
    }
    else
    {
      NSLog(@&#34;View will appear and the IAP IS Successful&#34;);
      self.adBanner.hidden = YES;
      self.adMobBannerView.hidden = YES;
    }
}

- (void)displayiAdsOrNot
{
    NSLog(@&#34;Display iAds or Not&#34;);

    self.adMobBannerView.hidden = YES;
    self.adBanner = [ adBanners];
    self.adBanner.delegate = self;

    if (IDIOM == IPAD)
    {
      NSLog(@&#34;***This is the iPad****&#34;);
       bounds].size.height-80, 320, 50)];
      ;

      ;
      NSLayoutConstraint *myConstraint =[NSLayoutConstraint
                                           constraintWithItem:self.adBanner
                                           attribute:NSLayoutAttributeLeading
                                           relatedBy:NSLayoutRelationEqual
                                           toItem:self.view
                                           attribute:NSLayoutAttributeLeading
                                           multiplier:1.0
                                           constant:0];

      ;



      myConstraint =[NSLayoutConstraint constraintWithItem:self.adBanner
                                                   attribute:NSLayoutAttributeTrailing
                                                   relatedBy:NSLayoutRelationEqual
                                                      toItem:self.view
                                                   attribute:NSLayoutAttributeTrailing
                                                multiplier:1
                                                    constant:0];

      ;

      myConstraint =[NSLayoutConstraint constraintWithItem:self.adBanner
                                                   attribute:NSLayoutAttributeBottom
                                                   relatedBy:NSLayoutRelationEqual
                                                      toItem:self.view
                                                   attribute:NSLayoutAttributeBottom
                                                multiplier:1
                                                    constant:0];

      ;

    }
    else
    {
      NSLog(@&#34;*** THIS IS THE IPHONE ***&#34;);
       bounds].size.height-98, 320, 50)];
      ;
    }

}
</code></pre>

<p>委托(delegate)方法:</p>

<pre><code>- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    NSLog(@&#34;bannerViewDidLoadAd gets called&#34;);

    if (![ boolForKey:@&#34;IAPSuccessful&#34;])
    {
      NSLog(@&#34;bannerViewDidLoadAd gets called and the IAP is not successful, so we hide the AdMob and show the iAd&#34;);
      self.adMobBannerView.hidden = YES;
      self.adBanner.hidden = NO;
    }
    else
    {
      NSLog(@&#34;bannerViewDidLoadAd gets called and the IAP IS Successful so we hide the AdMob and iAd&#34;);
      self.adMobBannerView.hidden = YES;
      self.adBanner.hidden = YES;
    }


}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
    NSLog(@&#34;The didFailToReceiveAdWithError is called and it is unable to show ads in Timeline. Error: %@ %@&#34;, , );
    self.adBanner.hidden = true;
    ;
}

- (void)displayAdMobBannerOrNot
{
    NSLog(@&#34;DisplayAdMobBannerOrNot is called&#34;);
    if (![ boolForKey:@&#34;IAPSuccessful&#34;])
    {
      NSLog(@&#34;The DisplayAdMonBannerOrNot is called and the IAP is not Successful&#34;);
      self.adMobBannerView.hidden = NO;
      self.adMobBannerView = [ adMobBanners];
      self.adMobBannerView.rootViewController = self;
      self.adMobBannerView.delegate = self;

      self.adMobBannerView.adUnitID = @&#34;ca-app-pub-394025609333333333335716&#34;;

      if (IDIOM == IPAD)
      {
            NSLog(@&#34;The DisplayAdMobBannerOrNot is called and we are using an iPad&#34;);
             bounds].size.height-80, 320, 50)];
            ;

            ;
            NSLayoutConstraint *myConstraint =[NSLayoutConstraint
                                             constraintWithItem:self.adMobBannerView
                                             attribute:NSLayoutAttributeLeading
                                             relatedBy:NSLayoutRelationEqual
                                             toItem:self.view
                                             attribute:NSLayoutAttributeLeading
                                             multiplier:1.0
                                             constant:0];

            ;

            myConstraint =[NSLayoutConstraint constraintWithItem:self.adMobBannerView
                                                       attribute:NSLayoutAttributeTrailing
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:self.view
                                                       attribute:NSLayoutAttributeTrailing
                                                      multiplier:1
                                                      constant:0];

            ;

            myConstraint =[NSLayoutConstraint constraintWithItem:self.adMobBannerView
                                                       attribute:NSLayoutAttributeBottom
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:self.view
                                                       attribute:NSLayoutAttributeBottom
                                                      multiplier:1
                                                      constant:0];

            ;

      }
      else
      {
            NSLog(@&#34;The DisplayAdMobBannerOrNot is called and we are using an iPhone&#34;);
             bounds].size.height-98, 414, 50)];

            ;

                GADRequest *request = ;
                request.testDevices = @[ @&#34;151111111111ffb836f4d823ac&#34; ];
                ;
      }
    }
    else
    {
      NSLog(@&#34;The DisplayAdMobBannerOrNot is called and the IAP IS Successful so we&#39;ll just hide the iAd and the adMobBanner&#34;);
      self.adBanner.hidden = YES;
      self.adMobBannerView.hidden = YES;
    }
}
</code></pre>

<p>所以,当 <code>viewWillAppear</code> 被调用时(每次我回到这个 <code>UIViewController</code>),我正在检查 <code>IAPSuccessful</code> <code>BOOL</code> 为真。如果它是假的,我加载 <code>displayiAdsOrNot</code> 方法。如果失败,它的委托(delegate)将被调用,它调用 <code>displayAdMobBannerOrNot</code>。 </p>

<p>现在,我完全明白为什么当我显示 AdMob 横幅并从一个 View 移动到另一个 View 时,它会删除 AdMob 横幅,因为当我回来时,<code>viewWillAppear</code> 会加载共享iAd 而不是 AdMob 的横幅。 </p>

<p>考虑到这一点,我不确定我需要做什么。我想确保 AdMob 每次加载共享横幅时都会加载它。因此,我将 <code>displayAdMobBannerOrNot</code> 中的共享横幅代码放入 <code>displayiAdOrNot</code> 并没有改变行为,因为它没有调用实际放置广告的功能(<code>displayAdMobBannerOrNot</code>)。 </p>

<p>作为测试,在<code>viewWillAppear</code>中,当<code>IAPSuccessful</code>为false时,我调用了<code>;</code> 而不是其他任何东西,并且有效。当我从标签一移动到标签二时,它会一直显示 AdMob 横幅。但是,这当然不是生产代码。我只是无法清楚地看到这一点。 </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您将 <code>adMobBannerView</code> 隐藏在 <code>displayiAdsOrNot</code> 函数中。每次 <code>viewWillAppear</code> 时都会调用此函数。删除它,你应该会得到你想要的结果。</p>

<p>至于您的其余代码,您有很多事情要做。首先,为了简化事情,您应该在 <code>viewWillAppear</code> 下移动所有创建和布置 <code>adBanner</code> 和 <code>adMobBannerView</code> 的代码,当 <code>[ boolForKey:@"IAPSuccessful"]</code> 为 false,并自动设置两个横幅 <code>.hidden = YES</code>。这将消除对您的 <code>displayiAdsOrNot</code> 和 <code>displayAdMobBannerOrNot</code> 的需要,您可以在其中重复许多相同的 <code>if</code> 语句来检查 IAP 和用户的设备正在使用。完成此操作后,在您的委托(delegate)方法中,您可以简单地隐藏或显示正确的横幅,具体取决于 iAd 现在是否失败。例如,如果 iAd 加载广告失败,请将其隐藏值设置为 <code>NO</code>,将 AdMob 的隐藏值设置为 <code>YES</code>,反之亦然。我确定您每次都在检查 IAP,以防用户在当前 session 中购买它,以便您可以删除广告。一个更简单的解决方案是在 IAP 完成时将广告移出屏幕边界,然后在下一次启动应用程序时根本不创建任何横幅,如果 <code>[ boolForKey:@"IAPSuccessful "]</code> 是真的。
需要指出的其他一些事情是,您应该在提交应用程序之前删除您的 <code>request.testDevices</code> AdMob 请求,并且您似乎正在多次定义您的 <code>NSLayoutConstraint *myConstraint</code>。我不太确定你想在这里做什么。另外,在 <code>didFailToReceiveAdWithError</code> 中有 <code>self.adBanner.hidden = true</code>,它应该是 <code>self.adBanner.hidden = YES</code>。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 iOS 上使用共享横幅切换标签时显示 AdMob 和/或 iAd,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/29891026/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/29891026/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 iOS 上使用共享横幅切换标签时显示 AdMob 和/或 iAd