天道酬勤,学无止境

Interstitial iAD:如何在 iOS 8 上检测关闭?(Interstitial iAD: How to detect closing on iOS 8?)

问题

我们在级别之间显示插页式 iAd。 由于 iAd 似乎需要相当多的内存(我们曾经在它们显示时收到许多内存警告并经历了一些崩溃),因此我们不会在插页式广告关闭之前加载新视图(因此,我们首先卸载游戏视图,然后我们显示插页式广告,然后我们加载游戏视图)。

为此,我们使用了旧的/已弃用的方式来显示插页式广告:

  1. 分配 ADInterstitialAd 并设置委托

    _interstitial = [[ADInterstitialAd alloc] init]; _interstitial.delegate = self;
  2. 准备好后,在一些视图控制器中呈现广告:

     [_interstitial presentFromViewController:_rootViewController];
  3. 侦听委托方法以检测用户何时关闭插页式广告:

     - (void)interstitialAdActionDidFinish:(ADInterstitialAd *)interstitialAd { [self proceedToNextLevel]; }

这曾经在 iOS 7 中工作。然而,在 iOS8 中,虽然大多数委托函数被调用,但 interstitialAdActionDidFinish 没有被调用(interstitialAdDidUnload 确实被调用,但只在 5 分钟后)。

因此,似乎有一些通过 UIViewController 上的类别显示插页式广告的新方法:https://developer.apple.com/library/ios/documentation/iAd/Reference/UIViewController_iAd_Additions/index.html#//apple_ref/occ /instm/UIViewController/shouldPresentInterstitialAd

所以新的方法是:

  1. 通过静态方法调用准备广告:

     [UIViewController prepareInterstitialAds];
  2. 准备好后,请求显示广告:

     _rootViewController.interstitialPresentationPolicy = ADInterstitialPresentationPolicyManual; [_rootViewController requestInterstitialAdPresentation];

这确实显示了插页式广告 - 但是,由于不再有委托,因此无法判断用户何时关闭了插页式广告。

所以问题是:我们如何在 iOS 8(也兼容 iOS 7)上判断用户何时关闭了插页式广告?

//编辑:我也尝试查询

    viewController.isPresentingFullScreenAd

用计时器重复,但虽然这适用于 iOS 7,但在 iOS 8 上,即使用户关闭插页式广告,该属性也始终返回 true

回答1

当一个插页式 iAd 关闭时,您的 VC 中会调用 viewDidAppear。

这是我如何实施...

当我想展示广告时,我会从我的 SKScene 调用以下代码。

    MyScene.m

    if ([viewController showIAd]) // attempting to show an ad
    {
        NSLog(@"showIAd returned YES, ad shown");
        // Do nothing.  Wait for viewDidAppear to be called.
    }
    else
    {
        // No ad was ready, do what needs to happen after ad.
    }

当显示 iAd 时,我设置了一个名为 currentShowingAnIAd 的 BOOL。 当 viewDidAppear 运行时,它知道它是从广告返回的。

viewController.m

-(void)viewDidAppear:(BOOL)animated
{
    NSLog(@"viewDidAppear");

    if (self.currentlyShowingAnIAd)
    {
        self.currentlyShowingAnIAd = NO;

        // Do what needs to happen after ad.
    }
}

-(BOOL)showIAd
{
    NSLog(@"showIAd method run");
    self.currentlyShowingAnIAd = [self requestInterstitialAdPresentation];
    return self.currentlyShowingAnIAd;
}

希望这可以帮助 :)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • iPhone上的iAds非页内广告?(iAds interstitial adverts on iPhone?)
    问题 我和我的开发人员以前曾尝试在iPhone和iPad上加载插页式广告,但是只能在iPad上使用。 在我们的测试过程中,我们发现iPhone不支持插页式广告,但是自iOS7发行以来,有人说这是可行的。 但是我找不到关于它的任何体面的文档。 尽管我通过iAd和Admob插页式广告整合到iPhone上,但这个堆栈问题让我再次感到困惑 那么,使用iAd的iPhone上是否可以使用全屏插页式广告? 回答1 我也一直在等待来自iAd的iPhone插页式广告。 我终于将它实现到我的一个应用程序中,并且它可以正常运行并显示测试广告。 该应用程序目前正在审核中,批准后我将更新答案,我可以测试是否投放了任何实际的广告。 同时,这是我用来实施iAd插页式广告的代码: ViewController.h @interface ViewController : UIViewController <ADInterstitialAdDelegate> { ADInterstitialAd *interstitial; BOOL requestingAd; } -(void)showFullScreenAd; ViewController.m -(void)viewDidLoad { requestingAd = NO; } // Interstitial iAd -(void)showFullScreenAd
  • iPhone 上的 iAd 和 Admob 插页式集成(iAd & Admob Interstitial Integration on iPhone)
    问题 我目前在我的 iPhone 应用程序中使用 Admob GADInterstitial,并希望利用 iOS 7 中 iAd UIViewController 添加项中提供的插页式广告。 我的猜测是 Apple 的填充率不会那么高,所以如果广告不可用,我想退回到 Admob。 不幸的是,iAd 的 API 看起来非常不透明,而且我看不到确定广告是否可用的方法。 有没有人成功做到这一点,如果是这样,如何? 回答1 我错过了手动演示方法,调用 requestInterstitialAdPresentation,返回一个 BOOL,表示是否将显示广告。 理论上,我可以用这个来控制是否回退到admob。 稍后我会发表评论,说明它是否有效。 编辑:它有效! 事实证明 requestInterstitialAdPresentation 确实正确回答了 true 或 false。 那么唯一要让它感觉像其他 API 的事情就是弄清楚广告 VC 何时被关闭。 如果广告已启动,我通过在托管视图控制器的 viewDidAppear: 方法中做出响应来做到这一点。 我实际上将它封装在 AdManager 类中,并使用 NSNotification 来传达 viewDidAppear:,因此能够非常干净地放入 iAd。 回答2 您可以查看以下库,它将无缝集成 iAd 和 Google Ads。
  • iAd 插页式委托​​方法不会被调用(iAd interstitial delegate methods doesn't get called)
    问题 我想在我的应用程序中使用插页式广告,所以我实现了所有必要的委托方法。 问题是,如果我使用 [self requestInterstitialAdPresentation] 来显示广告,则只会调用 interstitialAdDidLoad: 方法。 interstitialAdActionDidFinish: 方法不会被调用... 但是,如果我使用已弃用的 [self.interstitial presentFromViewController:self] 来显示广告,则一切正常。 有什么新东西要实施才能使事情正常进行吗? 提前致谢 回答1 好的,我解决了问题。 由于 IOS7 带有 iAd Additions,因此不需要 adInterstitialDelegate。 唯一要做的就是准备广告或将 interstitialPresentationPolicy 设置为 none(如您在文档中所读),并作为使用 requestInterstitialAdPresentation: 方法请求广告的最后一步。 回答2 iOS 9.2.1、Xcode 7.2.1、ARC 已启用 @Jellyjoey 我确认,当广告关闭时会调用viewDidAppear 。 正如您所料,当您点击广告时,会viewDidDisappear 。 这与您展示插页式广告的方式有关:
  • iAd & Admob Interstitial Integration on iPhone
    I'm currently using Admob GADInterstitial in my iPhone app, and would like to take advantage of the interstitials offered in the iAd UIViewController additions in iOS 7. My guess is that Apple's fill rate will not be that high, so I'd like to fall back to Admob if an ad isn't available. Unfortunately the API for iAd looks really opaque, and I don't see a way to determine if an ad is available. Has anyone successfully done this, and if so, how?
  • iAds interstitial adverts on iPhone?
    My developer and I had previously tried to get interstitial adverts loading on iPhone and iPad, however only managed to get this working on iPad. During our testing we discovered that interstitials weren't supported on iPhone, but since the release of iOS7 some people now say this is possible. However I can't find any decent documentation on this. This Stack question has got me wondering again though iAd & Admob Interstitial Integration on iPhone So, are full screen interstitials possible on iPhone using iAds?
  • iAd插页式广告不能始终显示? 而且根本不在模拟器上(iAd Interstitials not showing consistently? And not at all on the simulator)
    问题 iAd插页式广告完全没有显示在iPhone模拟器上,并且也没有始终显示在我的iPhone上。 我进入了“开发人员”设置,将填充率更改为100%,然后启用了“无限广告展示”。 没什么...插页式广告通常会在第一个显示时间,然后在几分钟到十五分钟的任何时间都不会显示。 不知道是什么原因造成了时间上的差异。 此外,似乎还没有一种方法可以跟踪插页式广告是否显示/是否确实显示了插页式广告。 我意识到有一个非页内广告代表,但似乎已不再使用。 我致电插页式广告的方式是使用viewController.interstitialPresentationPolicy = ADInterstitialPresentationPolicy.Automatic 谢谢! 回答1 因此,似乎仅在将ADInterstitialPresentationPolicy设置为Automatic时才使用requestInterstitialAdPresentation 。 当使用实现您的插页式广告Manual ADInterstitialPresentationPolicy您必须使用presentInView在你自己的时间间隔来呈现广告。 以这种方式展示插页式广告时,它不会加载自己的关闭按钮来关闭自己。 因此,我完成的工作是创建一个UIView来展示插页式广告,并使用插页式广告代理方法关闭UIView 。
  • 使用 iOS9 的 Admob 和插页式广告(Admob and Interstitial Ads with iOS9)
    问题 今天我注册了 adMob 并开始在我的应用程序中处理 adMob 广告。第一个是游戏(带有视图控制器),我想在游戏结束后立即显示一个插页式广告,所以我想在之后立即加载插页式广告游戏过载的视图(只有在游戏结束后才能访问此视图,并且游戏持续一分钟,所以它不应该经常出现) 我在 youtube 和 admob 网站上看过很多教程,我遇到了很多问题,例如:即使我导入了 admob 框架也找不到它,我禁用了位码以避免构建时出现链接器错误,但我仍然看不到测试广告在我的应用程序、模拟器和真实设备上。 我导入了admob 所需的所有框架,在xcode 中我在GoogleMobileAds 框架附近有一个问号,这是什么意思? 关于 admob 的第一行是: import GoogleMobileAds 内部视图控制器 var interstitial: GADInterstitial! func createNloadAd () -> GADInterstitial { var ad = GADInterstitial(adUnitID: "XXX") var request = GADRequest() request.testDevices = [kGADSimulatorID] ad!.loadRequest(request) return ad } 内部视图加载 self
  • iAd interstitial delegate methods doesn't get called
    I want to use interstitial ads in my app, so I implemented all necessary delegate methods. The problem is, if I use [self requestInterstitialAdPresentation] to show the ad, only the interstitialAdDidLoad: method gets called. The interstitialAdActionDidFinish: methods doesn't get called... But if I use the deprecated [self.interstitial presentFromViewController:self] to show the ad, everything works. Is there anything new to implement to get things work ? Thanks in advance
  • iAd Interstitials not showing consistently? And not at all on the simulator
    iAd interstitials aren't showing up at all on the iPhone simulator, and they don't show up consistently on my iPhone. I've gone to the Developer settings, changed the fill rate to 100%, and turned on Unlimited Ad Presentation. No difference... an interstitial will generally show the first time it's supposed to, and then won't show again for anywhere from a few minutes to fifteen minutes. No idea what is causing the difference in time. Also, there doesn't seem to be a way to track if the interstitial is going to show or not / if it actually showed or didn't. I realize there's an interstitial
  • 在 Swift SpriteKit 中的场景之间显示 Admob 插页式广告(Show Admob Interstitial ads between scenes in Swift SpriteKit)
    问题 当我展示我的 GameOverScene 时,我想知道如何设置 Admob 插页式广告。 我应该怎么做才能只在游戏结束时才显示广告? 我如何在 Swift 中实现它? 我指的是这篇文章 How to call admob interstitial ad using swift, spritekit and xcode? 但我想知道如何在场景之间调用广告。 编辑这是我用来展示广告的代码 class GameViewController: UIViewController, GADInterstitialDelegate { var interstitial = GADInterstitial() var intersitialRecievedAd = false let defaults = NSUserDefaults.standardUserDefaults() override func viewDidLoad() { super.viewDidLoad() interstitial.delegate = self self.interstitial = createAndLoadAd() let timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector:
  • Admob and Interstitial Ads with iOS9
    Today I registered to adMob and I started working on adMob ads inside my apps.The first one is a game (with viewcontrollers) and i want to show an interstitial ad right after the game over screen, so i want to load the interstitial right after the view with game over loads (this view is accessible only after game over and a game lasts for one minute so it should not appear too often) I have seen many tutorials, on youtube and on admob website, i had many problems like: admob framework not found even if I imported it, i disabled bitcode to avoid linker errors when i build, but i still can't see
  • 如何制作Android非页内广告?(How to create Android interstitial ads?)
    问题 我尝试了许多博客的内容,但没有一个提供逐步解决方案。 我应该在AdMob网站上进行修改吗? 我是通过“网站和应用程序”标签下的“广告坐/应用程序”选项创建的网站。 我使用了以下代码: interstitial = new InterstitialAd(this, "MyAdMobID"); // Set Ad Listener to use the callbacks below interstitial.setAdListener(this); // Create ad request AdRequest adRequest = new AdRequest(); adRequest.addTestDevice(AdRequest.TEST_EMULATOR); // Begin loading your interstitial interstitial.loadAd(adRequest); adRequest.setTesting(true); 回答1 使用最新的Android框架,我发现每次关闭广告时都需要调用load()函数。 import com.google.android.gms.ads.*; import android.os.Handler; import android.os.Looper; import android.app.Activity
  • iAd错误“广告资源不可用”(iAd error “Ad inventory unavailable”)
    问题 我正在将iAd添加到我的应用中。 现在,在模拟器,它工作得很好,但是当我打开它的设备上(V4.1)的ADBannerViewDelegate调用bannerView:didFailToReceiveAdWithError:与上error.userInfo这种描述 { ADInternalErrorCode = 3; NSLocalizedFailureReason = "Ad inventory unavailable"; } 我认为我的iAd广告网络设置正确。 我是自己添加广告还是iAd Network像在模拟器中一样自动发送测试广告? 编辑:我认为这是调度广告的iAd网络服务器的延迟问题。 我想当网络上有我的应用程序的广告时,它就可以正常工作。 回答1 如果您使用开发证书运行,则即使在设备上运行,您也只会获得测试广告。 从《 iAd编程指南》中: 在开发应用程序时,iAd Network会将测试广告发送到您的应用程序。 为了帮助您验证实施,iAd网络有时会返回错误以测试您的错误处理代码。 您还可以通过关闭设备的无线功能来测试错误处理支持。 因此,您应该在设备上看到测试广告,但永远不会看到真实的实时广告。 回答2 是的,在我的情况下,从设备中删除应用程序并重建即可解决。 回答3 这是分派广告的iAd网络服务器的延迟问题。 我想当网络上有我的应用程序的广告时,它就可以正常工作
  • 如何多次显示 admob 插页式广告?(Displaying admob interstitals multiple times how?)
    问题 我有一个小游戏应用程序,它有一个故事板,在它里面创建了像开始菜单-游戏区域-分数这样的场景我已经添加了 admob 横幅视图和插页式广告。我的横幅视图工作正常,但我的插页式广告只能工作一次。 我在我的 viewdidload 上加载我的插页式广告并在调用游戏会话结束的函数中触发它,正如我所说的那样,它可以工作,但只有一次当用户启动另一款游戏并失败时,这次没有插页式广告(下面的错误)。那又如何呢?我应该做些什么来修复它我希望我的游戏在我想要的时候多次显示插页式广告。 错误:请求错误:不会发送请求,因为已使用插页式对象。 标题: #import "GADBannerView.h" #import "GADInterstitial.h" @class GADInterstitial; @class GADRequest; ////////////code UIviewcontroller////////// GADBannerView *bannerView_; GADInterstitial *interstitial_; 执行 -(void)viewdidload { //////////////////gaming code/////////// interstitial_ = [[GADInterstitial alloc] init]; interstitial_
  • iOS9 self.canDisplayBannerAds = true 未显示任何广告 [关闭](iOS9 self.canDisplayBannerAds = true is not showing any ads [closed])
    问题 关闭。 此问题不可重现或由拼写错误引起。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 5年前关闭。 改进这个问题 非常简单的 iAd 代码: import UIKit import iAd class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.canDisplayBannerAds = true } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } iAd.framework已加载。 它曾经工作过。 iOS9后,不工作。 iAd 的模拟器设置为 100%,刷新率为 15 秒。 不显示任何广告。 在实际的 iPhone 6、5S、4S 和 iPad Air2 上试用。 不显示任何广告。 我在这里错过了什么吗? 快要疯了……我所有的应用程序过去都可以毫无问题地显示 iAd,现在完全没有显示 iAd。 回答1 这不再是问题。 self.canDisplayBannerAds = true在运行 iOS 9 或更高版本的设备和模拟器上按预期工作。
  • iOS:全页插页式广告关闭后显示黑屏(iOS: full page interstitial ad shows black screen after close)
    问题 我使用此代码显示全屏广告,该代码可显示整页广告。 问题是当我关闭广告时,我只有一个空白屏幕。 它不再显示我的应用程序。 我的代码: -(void)showFullScreenAd { if (requestingAd == NO) { interstitial = [[ADInterstitialAd alloc] init]; interstitial.delegate = self; self.interstitialPresentationPolicy = ADInterstitialPresentationPolicyManual; [self requestInterstitialAdPresentation]; NSLog(@"interstitialAdREQUEST"); requestingAd = YES; } } 回答1 找到了解决办法。 我只需要在广告关闭后再次展示我的视图控制器。 我使用了以下代码: -(void)interstitialAdActionDidFinish:(ADInterstitialAd *)interstitialAd { interstitial = nil; requestingAd = NO; NSLog(@"interstitialAdDidFINISH"); // present my view controller
  • requestInterstitialAdPresentation 只工作一次(requestInterstitialAdPresentation Works only one Time)
    问题 我想知道为什么[self requestInterstitialAdPresentation]; 只工作一次。 我的意思是我将此调用绑定到 UIButton,第一次运行我的应用程序并单击此按钮时,广告正确显示,但是,当我关闭广告并尝试再次调用另一个广告时,尽管 nslog 表示该功能,但广告并未出现被称为。 在启动应用程序时,我使用[UIViewController prepareInterstitialAds];预加载广告[UIViewController prepareInterstitialAds]; 回答1 我刚刚遇到了这个问题,似乎是时候阻止人们在每隔一段时间后向用户发送垃圾邮件了。 我不知道它是否会有所不同,但我自己刚刚尝试过,超时大约为 2 分钟。 回答2 试试这个: 呈现策略确定呈现的时间是完全由框架管理还是​​应该仅在应用程序调用 -requestInterstitialAdPresentation 时发生。 默认情况下,该政策为“无”,因此为了能够展示插页式广告,必须将其更改为“自动”或“手动”。 @property (nonatomic, assign) ADInterstitialPresentationPolicy interstitialPresentationPolicy NS_AVAILABLE_IOS(7_0); 就像是: self
  • Swift iAd-超过10个ADBannerView警告和CGAffineTransformInvert实例:奇异矩阵输出(Swift iAd - More than 10 instances of ADBannerView warning and CGAffineTransformInvert: singular matrix output)
    问题 因此,我尝试在应用程序中设置一个简单的iAd标语,但在输出中收到以下两个警告: WARNING: More than 10 instances of ADBannerView or ADInterstitialView currently exist. This is a misuse of the iAd API, and ad performance will suffer as a result. This message is printed only once. 和 <Error>: CGAffineTransformInvert: singular matrix. 这就是我用来实现ADBannerView : var adBannerView = ADBannerView() func loadAds() { adBannerView = ADBannerView(frame: CGRect.zeroRect) adBannerView.center = CGPoint(x: adBannerView.center.x, y: view.bounds.size.height - adBannerView.frame.size.height / 2) adBannerView.delegate = self adBannerView.hidden = true
  • iAd正在关闭。 我应该从所有应用程序中删除iAd框架吗?(iAd is shutting down. Should I remove the iAd framework from all my applications?)
    问题 您收到此电子邮件的原因是您签订了《开发者广告服务协议》(以下简称“协议”),以使用iAd的广告网络和相关服务。 感谢您允许Apple在您的移动媒体资源上投放广告。 如您所知,iAd App Network和相关的广告服务将于2016年6月30日终止。有关iAd App Network关闭的更多详细信息,请点击此处。 注意:应在2016年9月30日之前从Apple支付任何未偿还款项,并且活动报告数据将在2016年12月31日之前可用。此电子邮件应作为书面通知,告知Apple将行使其选择权以终止协议,自太平洋标准时间2016年6月30日晚上11:59开始生效。 本通知中包含的任何内容或从中忽略的任何内容均不应视为放弃苹果的任何权利,救济或抗辩,所有这些权利,救济或抗辩均已明确保留。 此致App Store小组敬上 我想知道iAd广告网络的下一个最佳选择。 易于集成和设置。 另外,我应该从其他应用程序中删除iAd框架吗? 回答1 iAd框架将被弃用。 您现在不必删除iAd实施,但最终必须删除。 苹果已经提供了有关将要发生的事情的大量信息:关于iAd App网络关闭 未更新的应用将遇到以下不利条件: 您的应用程序中不会退回任何广告。 弃用警告将出现在Xcode中。 如果您的应用实现了ADBannerView和ADBannerViewDelegate(即bannerView
  • iAd Banner 不出现但代码和权利(iAd Banner does not appear but the code and right)
    问题 我有 iAd 的问题。 我遵循了许多质量上乘的教程,几天前我能够在测试应用程序中正确插入 iAd。 现在,即使我尝试创建一个仅使用 iAd 作为测试的新应用程序,该方法也不起作用! 我无法理解以下文字出现在我看来的问题。 我使用 xCode 5 和 iOS 7 SDK。 iAD prova[3158:a0b] [AppDeveloper] ADBannerView:未处理的错误(没有委托或委托未实现 didFailToReceiveAdWithError:):错误域=ADErrorDomain Code=3“操作无法完成。广告资源不可用” UserInfo=0xa5aaaf0 { ADInternalErrorCode=3, ADInternalErrorDomain=ADErrorDomain, NSLocalizedFailureReason=广告库存不可用} 2013-09-20 12:24:59.887 iAD prova[3158:a0b] [AppDeveloper] ADBannerView:未处理的错误(无委托或委托):未实现AdReceiveWith didFail Error Domain=ADErrorDomain Code=5 “操作无法完成。横幅视图可见但没有内容” UserInfo=0xa5af280 {ADInternalErrorCode=5