AdMob 刷新请求

2024-04-16

我有几个令我困惑的问题:

  1. 谁最负责广告刷新?加载请求后bannerView.load(GADRequest())让开发者或 Google 进行监控是最佳做法吗?

  2. 刷新时间应该短至 30 秒还是至少 60 秒?他们建议 60 秒,但给你选择 30 秒的选项,这似乎很奇怪。我在不同的帖子上读到过,您可能会因为各种各样的事情而受到处罚,并且您的 AdMob 帐户将被关闭,不会有任何问题。如果是这种情况,如果您在控制台中选择 30 秒,而他们建议 60 秒,如果他们觉得有什么“有趣”,他们可以仅根据这一点终止您的帐户。这是一个非常倾斜的过程。

  3. It says 如果您的应用自动刷新广告,请确保屏幕关闭时不会发出广告请求。如果我的第一个问题的答案是让谷歌监控/自动刷新(不使用我下面的代码)谷歌如何知道屏幕是否关闭?例如,广告显示在viewControllerA但用户按下按钮viewControllerB被推动。自从viewControllerA仍在堆栈上,广告将不断刷新,我不明白谷歌如何知道屏幕已关闭,直到viewControllerA被解除分配。另外,如果用户进入后台,谷歌怎么知道?我假设off意味着用户无法再看到屏幕,这意味着他们无法看到广告,因此无需刷新,因为他们要么切换选项卡,要么推送到另一个 VC,要么转到后台(所有情况都在下面的代码中处理)

  4. 刷新控制台页面的链接在哪里?在你可以去之前https://apps.admob.com https://apps.admob.com> 货币化,您最终会进入带有刷新选项的页面。当我登录时,我不再看到“获利”选项,而是看到一个带有一堆图标的侧边栏。没有任何图标带我进入刷新页面。仅供参考,我昨天刚开始使用 AdMob,只在视频和在线教程中看到了刷新页面,所以我以前从未使用过它。

It says (强调我的):

刷新广告

我们建议您保留广告60秒 或更长时间,具体取决于您的应用程序的功能。我们的内部 测试表明,这可以确保用户有足够的时间参与 与广告一起,为广告商和广告商提供最佳效果 出版商。此外,这些测试表明,刷新广告 更频繁地会损害我们发布商的填充率。

如果您的应用自动刷新广告,请确保广告请求 屏幕关闭时未制作。此外,如果用户导航至和离开 短时间内应用程序中包含广告的页面,新的广告请求 不应早于建议的时间进行60第二次评价。

但它也说here https://support.google.com/admob/answer/3245199?hl=en:

横幅广告

我们建议使用 Google 优化的自动刷新 速度。优化率是使用 AdMob 历史数据计算得出的 确保您的广告单元中展示的广告得到最佳刷新 横幅广告的费率。

您还可以设置自定义刷新率30-120秒或禁用 完全刷新率。

以下是我自己每 30 秒管理一次请求的方法,同时考虑到用户何时进入后台、切换选项卡或推送另一个 VC。如果我不执行所有这些操作并将其留给他们(“我们建议使用 Google 优化的自动刷新率”),Google 如何知道屏幕是否关闭?

var timer: Timer?

override viewDidLoad() {
    super.viewDidLoad()

    // instantiate bannerView ...

    NotificationCenter.default.addObserver(self, selector: #selector(startAdRefreshTimer), name: UIApplication.willEnterForegroundNotification, object: nil)

    // *** the screen is OFF
    NotificationCenter.default.addObserver(self, selector: #selector(stopAdRefreshTimer), name: UIApplication.willResignActiveNotification, object: nil)
}

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        startAdRefreshTimer()
}

// *** the screen is OFF
override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        stopAdRefreshTimer()
}

@objc func startAdRefreshTimer() {

    timer?.invalidate()
    timer = Timer.scheduledTimer(withTimeInterval: 30,
                                 repeats: true,
                                 block: { [weak self](timer) in
                                            self?.refreshAd()
    })
}

func refreshAd() {

    bannerView.load(GADRequest())
}


@objc func stopAdRefreshTimer() {
    if timer != nil {
        timer?.invalidate()
        timer = nil
    }
}

// this really isn't necessary because of what's in viewWillDisappear but I added it anyway
@objc func buttonToPushNextVCTapped() {

    let nextVC = NextVC()
    navigationController?.pushViewController(viewController: nextVC, animated: true, completion: { [weak self] in

        // *** the screen is OFF
        self?.stopAdRefreshTimer()
    })
}

这不是完美的解决方案,因为如果用户快速且重复地来回切换选项卡,请求将在 30 秒内发生,这可能会导致您的帐户被禁止。这仅用于示例目的。


回答我的第一、第二、第三个问题:

1号这是我的设置,我有 headerView 内的bannerView https://stackoverflow.com/a/57404928/4833705这似乎是完全没问题 https://ads-developers.googleblog.com/2012/03/embedding-google-admob-ads-within.html?m=1。我也在使用TabBarController。顺便说一句,collectionView所在的vc处理bannerView and load(GADRequest())。 headerView 仅显示广告,因此我不必担心它在用户滚动时不断被调用并且 headerView 被回收。您可以阅读我的设置中的链接以了解更多详细信息。

第二个 AdMob 的 BannerView 有一个委托方法 https://developers.google.com/admob/ios/banner当收到新广告时会调用该函数:

MyController: GADBannerViewDelegate {

    /// Tells the delegate an ad request loaded an ad.
    func adViewDidReceiveAd(_ bannerView: GADBannerView) {
        print("adViewDidReceiveAd")
    }
}

第三。我在该打印语句上放置了一个断点以查看会发生什么,以下是结果。

  1. 当我让 headerView 可见(没有将其滚动出场景)时,委托方法每 60 秒触发一次。我可能会晚几秒钟,因为我查看了计算机上的时间并且没有使用计时器。不管怎样,几乎每 60 秒就会遇到断点并且测试广告就会改变。

  2. 一旦我将 headerView 滚动出场景并等待断点就永远不会被命中,这意味着委托方法从未被调用。我等了 10 分钟,什么也没发生——没有广告投放。

  3. 当我将 headerView 滚动回场景时,我等待了几秒钟,最终命中断点,这意味着调用了委托。就像第一个场景一样,此后每 60 秒就会受到攻击。

  4. 我切换到另一个选项卡,离开了几分钟,并且发生了#2 中相同的事情,没有到达断点,因为没有调用委托。

  5. 当我返回带有标题视图的选项卡时,#3 中发生了同样的事情,每 60 秒就会命中断点,因为调用了委托。

  6. 我进入后台,再次像 #2 一样,断点没有被击中,因为委托没有被调用。

  7. 当我从后台返回时,就像 #3 一样,每 60 秒就会触发一次断点,因为委托被调用了。

我的结论是横幅视图绝对知道当它不在现场时。无论选项卡是否更改,应用程序都会转到后台(可能使用通知),最神秘的是,它甚至知道它何时是另一个视图的子视图,并且该视图在场景上滚动/滚动。

我在纽约布朗克斯,现在是早上 8 点(我在早上 7 点左右开始测试),广告基本上每 60 秒更换一次。也许在世界其他地方,一天中的不同时间,或一年中的不同时间,持续时间可能更长或更短?

据我现在所知,我认为最好让 Google 监控load(GADRequest())并在准备好后更改广告。每 60 秒更换一次广告对我来说没问题。如果场景可以吸引用户注意力超过一分钟,则投放 2 个广告。这更有益,因为我可以花更多的时间来吸引他们的注意力,而不是专注于向他们提供广告。

就我的问题中处理所有问题的代码而言off在这种情况下,bannerView 似乎能够自行处理所有这些问题。我需要维护和处理的代码更少,更重要的是,这减少了我担心因处理不当而被禁止的理由。

总结(这最适合我)

  1. 让 Google 处理/监控bannerView.load(GADRequest())投放新闻广告

  2. 不要自定义刷新,它似乎每 60 秒自行更改一次

  3. 当使用bannerView时(并且可能让Google监控load(GADRequest()))屏幕亮起时不会请求广告off所以不需要浪费时间担心它

回答我的第四个问题:

打开应用程序刷新的获利页面似乎不再存在。登录 AdMob 后,请按照以下 5 个步骤操作(在第 2 步中点击蓝色广告单元名称后,将出现一个新屏幕,显示第 3、4 和 5 步)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AdMob 刷新请求 的相关文章

随机推荐

  • 自定义通知声音未播放

    我正在尝试在状态栏通知上播放自定义声音 这 mp3文件位于res raw 但是当我通知用户时 声音不会播放 我尝试过使用 MediaPlayer 它可以工作 但我不想让它与 MediaPlayer 一起播放 这是我的方法 public vo
  • 在聚合物项目上转换 dart2js 时出错

    不支持的操作 无法在反射中使用ownerName 因为它未包含在 MirrorsUsed 注释中 ownerName只是聚合物元素上的已发布属性 我知道有一些这样的东西 在网络上 而不是在这里 但没有一个有可靠的答案 我还在下面得到了这个
  • bash 替换每行中的第一个字符

    我的文件如下所示 1 chrX 73833098 73834098 1 chrX 73889652 73890652 1 chrX 91194501 91195501 1 chrX 92000157 92001157 1 chrX 9210
  • 为什么导入的函数“作为”另一个名称保留其原始 __name__ ?

    Here from os path import exists as foo print foo name we get exists 为什么不 foo 哪个属性会给出 foo 您可以查看import foo as bar只是一个任务 你不
  • 有没有办法在不出现 PlatformNotSupportedException 的情况下读取响应标头?

    我正在为 ASP Net MVC 开发一个过滤器属性 当内容未被修改时 它将返回 304 响应 为了实现这一目标 能够读取控制器中设置的 Last Modified 标头值会很方便 似乎只是一个问题 在 Cassini Visual Stu
  • 我可以绕过 Windows 中 Statc 级联上下文菜单的 20 项限制(注册表项/子项)

    我正在为 Windows 中的 ImageMagick 创建详细的静态级联上下文菜单 一切似乎在功能方面都运行良好 直到我通过上下文菜单传递了 20 个项目 此后 单击命令将停止正常运行 项目也会消失 我知道这不是格式问题 因为我可以通过删
  • 为什么这个 .vimrc 映射在终端中不起作用(但在 MacVim 中起作用):map O

    我的 vimrc 文件中有两行 map
  • 使用Knockout将不同模型绑定到页面上的不同部分

    我在我的 asp net 应用程序中使用淘汰赛 javascript 库 对于淘汰赛我使用ko对象和应用绑定 方法来绑定它 现在我想将两个淘汰对象绑定到两个不同的用户界面部分 我如何使用第二个淘汰对象或第二个数据源 以便我可以在第二部分中使
  • Python:如何制作递归生成器函数

    我一直致力于为生物学问题生成所有可能的子模型 我有一个工作递归来生成我想要的所有子模型的大列表 然而 列表很快就会变得难以管理 在下面的示例中 N 12 是可能的 N gt 12 使用了太多内存 所以我想使用yield 将其转换为生成器函数
  • 如何注册音量变化通知?

    当 OS X 音量发生变化时 我需要通知我的应用程序 这适用于桌面应用程序 不适用于 iOS 我如何注册此通知 这可能有点棘手 因为某些音频设备支持主通道 但大多数不支持 因此音量将是每个通道的属性 根据您需要执行的操作 您可以仅观察一个通
  • 显示/隐藏 C# 控制台应用程序的控制台窗口

    我在谷歌上搜索了有关如何隐藏自己的控制台窗口的信息 令人惊讶的是 我能找到的唯一解决方案是涉及的 hacky 解决方案FindWindow 找到控制台窗口按其标题 我对 Windows API 进行了更深入的研究 发现有一种更好 更简单的方
  • 在 Core i7 Mac 上禁用睿频加速?

    有没有什么方法可以在运行 Mac OS X 的 Core i7 mac 上以编程方式禁用 Turbo Boost 我需要能够在代码优化等过程中出于基准测试目的执行此操作 如果做不到这一点 任何可以禁用 启用 Turbo Boost 的实用程
  • Mac 终端上的基本命令行不起作用

    我在尝试安装 mongodb 时更改了 bash 配置文件 但我的命令行均无法在终端上运行 我在网上读到我需要修复 PATH 但当我的命令都不起作用时我什至无法访问它 Help 错误地 我也遇到了同样的问题 要解决这个问题 我必须将 PAT
  • 生成随机布尔概率

    我只知道如何生成随机布尔值 真 假 默认概率为 50 50 但我怎样才能以自己的概率生成真假值呢 假设它返回 true 的概率为 40 60 或 20 80 等 一种方法是检查返回值Random Next 100 小于您期望的概率 但我无法
  • 在 Javascript 中根据 JSON 数据创建饼图

    我是 PHP 和 JavaScript 新手 我需要使用从 URL 获取的 JSON 数据创建一个饼图 JSON 数据是 Domain Artificial Intelligence Count 46 Domain Data Archite
  • Actionscript 内存管理、垃圾收集

    这个博客 http blogagic com 163 flex memory management and memory leaks varref 和其他人 指出 在清理对象时 您应该在 dispose 方法中将对象引用设置为 null 但
  • 人们可以放心地忽略宏和内置宏之间的区别吗?

    我从 Clojure 开始 这也是我的第一个 lisp 显然有很多东西需要吸收 为了减轻认知负担 我尝试找到我可以安全地忽略的部分 目前 人们能否安全地以相同的方式处理带有宏的表单和带有内置函数的表单 或者是否会出现以后出现的陷阱 换句话说
  • 修改现有表单值 - GetChoices() 不起作用

    为什么 getChoices https developers google com apps script reference forms list item getChoices 不适用于现有列表项 我有以下代码 它通过 ID 获取表单
  • Excel:如何使用数组连接 criteread 部分旁边的字符串(If 函数)

    今天是个好日子 我有一个 Excel 工作表 分为两列 如下所示 我知道如何使用带有 sum 的数组 if 函数来将满足条件的列旁边的所有值相加 如下所示 sum if A1 A5 YES B1 B5 但如何使用字符串进行操作并连接 以便它
  • AdMob 刷新请求

    我有几个令我困惑的问题 谁最负责广告刷新 加载请求后bannerView load GADRequest 让开发者或 Google 进行监控是最佳做法吗 刷新时间应该短至 30 秒还是至少 60 秒 他们建议 60 秒 但给你选择 30 秒