在 SwiftUI (5) 和 Xcode (12.4) 中实现 AdMob 插页式广告

2024-04-23

我正在努力在我的应用程序中实现插页式广告,但对 AdMob 提供的文档和新的 SwiftUI 应用程序结构遇到了一些困惑。

这里是app.swift文件,显示我已经实现了 GoogleMobileAds 并在didFinishLaunchingWithOptions method.

import SwiftUI
import GoogleMobileAds
    
@main
struct AdamsCalcApp: App {
    var calculator = Calculator()
        
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
        
    var body: some Scene {
        WindowGroup {
            ContentView().environmentObject(calculator)
        }
    }
}
    
class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        // Setup Google AdMob instance
        GADMobileAds.sharedInstance().start(completionHandler: nil)
        return true
    }
}

In my ContentView.swift文件中,我创建了间隙变量,如下所示:

@State var interstitial: GADInterstitialAd?

然后,在视图的主堆栈上,我调用onAppear(perform:)加载广告:

.onAppear(perform: {
    let request = GADRequest()
    GADInterstitialAd.load(withAdUnitID:"ca-app-pub-3940256099942544/4411468910",
                           request: request,
                           completionHandler: { [self] ad, error in
                               if let error = error { return }
                               interstitial = ad
                               interstitial?.fullScreenContentDelegate = self
                           }
    )
})

但是,我不断收到此错误:

“无法将‘ContentView’类型的值分配给‘GADFullScreenContentDelegate’类型?”

在尝试了几种不同的解决方法并尝试查找与我类似的设置后,我感觉有点无能为力。 AdMob 文档仍然只展示如何实现它UIViewController但我想知道如何在 SwiftUI 中做到这一点。


import SwiftUI
import GoogleMobileAds
import AppTrackingTransparency
import AdSupport

class AdsManager: NSObject, ObservableObject {
    
    private struct AdMobConstant {
        static let interstitial1ID = "..."
    }
    
    final class Interstitial: NSObject, GADFullScreenContentDelegate, ObservableObject {

        private var interstitial: GADInterstitialAd?
        
        override init() {
            super.init()
            requestInterstitialAds()
        }

        func requestInterstitialAds() {
            let request = GADRequest()
            request.scene = UIApplication.shared.connectedScenes.first as? UIWindowScene
            ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
                GADInterstitialAd.load(withAdUnitID: AdMobConstant.interstitial1ID, request: request, completionHandler: { [self] ad, error in
                    if let error = error {
                        print("Failed to load interstitial ad with error: \(error.localizedDescription)")
                        return
                    }
                    interstitial = ad
                    interstitial?.fullScreenContentDelegate = self
                })
            })
        }
        func showAd() {
            let root = UIApplication.shared.windows.last?.rootViewController
            if let fullScreenAds = interstitial {
                fullScreenAds.present(fromRootViewController: root!)
            } else {
                print("not ready")
            }
        }
        
    }
    
    
}


class AdsViewModel: ObservableObject {
    static let shared = AdsViewModel()
    @Published var interstitial = AdsManager.Interstitial()
    @Published var showInterstitial = false {
        didSet {
            if showInterstitial {
                interstitial.showAd()
                showInterstitial = false
            } else {
                interstitial.requestInterstitialAds()
            }
        }
    }
}

@main
struct YourApp: App {
    let adsVM = AdsViewModel.shared
    init() {
        GADMobileAds.sharedInstance().start(completionHandler: nil)
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(adsVM)
    }
}

切换显示插页式广告中的参数广告视图模型应用程序中的任何位置都会显示广告。

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

在 SwiftUI (5) 和 Xcode (12.4) 中实现 AdMob 插页式广告 的相关文章

随机推荐

  • 使用 cscope 在头文件和实现文件之间切换的 Vim 脚本

    我目前使用的是A vim http vim wikia com wiki Easily switch between source and header file在头文件和实现文件之间交换的插件 该脚本的局限性在于 它仅在两者位于同一文件夹
  • 开发期间初始安装标签的使用和验证

    我正在尝试在我们的应用程序中使用 ODR 并创建了标签并将其分组在 预取 下的 初始安装标签 选项下 我不确定如何使用开发配置文件在模拟器和设备上验证这一点 TestFlight 是验证初始安装标签使用情况的唯一选项吗 即使对于标记为初始安
  • websocket握手问题

    我正在使用 python 实现一个简单的 websocket 服务器 我使用的握手来自 握手本身似乎有效 但是当我点击发送时 我收到一个 JavaScript 错误 未捕获的错误 INVALID STATE ERR DOM 异常 11 这是
  • 使用易失性变量和信号量 - Java

    我从线程 信号量 易失变量等开始 我想知道当我使用信号量时是否有必要将变量定义为易失性 我的意思是 有 2 个线程 一个增加变量 另一个减少变量 例如 显然 在每次访问之前 我有一个互斥体 它随时控制只有一个线程正在 玩 变量 有必要定义为
  • 如何在java中排队并调用实际方法(而不是立即评估)?

    有一个对时间敏感的任务列表 但在这种情况下 时间 对于另一个程序告诉我的内容是任意的 它更像是 滴答声 而不是时间 但是 我不希望立即评估所述方法 我希望一个在另一个完成后执行 我在队列中使用链表 但我不确定如何 是否可以访问类中的实际方法
  • 为什么querySkuDetails需要在IO上下文中运行?

    根据https developer android com google play billing integrate https developer android com google play billing integrate th
  • 没有可判定的相等性或排除中间值的鸽巢证明

    在软件基础中IndProp v https softwarefoundations cis upenn edu lf current IndProp html lab244一个人被要求证明鸽巢原理 并且可以使用排除中间 但有人提到这并不是绝
  • 提交后用成功消息替换 HTML 表单,表单使用单独的 php 文件发送邮件

    我有一个内置于index html 中的html 联系表单 然后我有一个mail php 文件 用于发送邮件并使用一些Javascript 当我填写表单并提交时 我已对其进行编码以发送邮件 然后弹出一个成功消息框 然后重定向回index h
  • 从 C 中的路径中分割文件名

    我是 C 新手 但精通 Python 我正在寻找 C 中 string split 1 函数的功能等效项 到目前为止 我已经能够创建一个包含我的整个路径的字符数组 我想分割该字符串 所以我只有文件名 下面我提供了一个示例 char inpu
  • ERRORLEVEL 与 %ERRORLEVEL% 与感叹号 ERRORLEVEL 感叹号

    我想我对 ERRORLEVEL 与 ERRORLEVEL 有基本的了解 但是 ERRORLEVEL 让我困惑 我正在制作一个调用可执行文件的脚本 然后使用任务列表来查看它是否正在运行 然后使用taskkill来杀死它 如果是 然后尝试输出错
  • 如何在 Objective-C 的 switch 语句中使用 goto?

    在我的代码中 我需要能够在同一个 switch 语句中跳转 转到 不同的情况 有没有办法做到这一点 我的代码是这样的 有很多代码我都省略了 switch viewNumber case 500 break case 501 break ca
  • MATLAB - 函数的多个返回值?

    我正在 matlab 中编写 2 个函数 一个初始化函数和一个将项目插入数组的函数 将其视为双向链表 但是 我的初始化函数仅返回 ans 和初始化的数组 我怎样才能让它也设置其他变量的值 这是我的代码 function array list
  • Symfony2功能测试:直接传递表单数据

    我正在使用 phpunit 来运行功能测试 但我在使用某些表单时遇到问题 问题是 phpunit 不支持 JS 而我有一个带有动态填充选择框的表单 需要 jQuery 所以我需要直接传递表单数据 书 给出了以下例子 Directly sub
  • geom_tile单色为0,然后是色标

    我想生成一个热图 其中调色板为绿色到红色 但 0 值为白色 我开始了基于因子具有不同高填充颜色的 geom tile 热图 https stackoverflow com questions 10232525 geom tile heatm
  • 使用 PHP 上传 DOC 或 PDF

    我可以很好地上传图像 但是当我将类型从 image jpg image gif 更改为 application msword 和 application pdf 时 它不起作用 这是我的代码 完全相同的代码适用于图像 但对于上传文档和 pd
  • 使用 Ardulink 命令 Arduino Uno

    我试图在我的 JAVA 应用程序中使用 Ardulink 库来命令我的 Arduino Uno 但没有成功 我不知道我错过了什么 这是我的代码 Link link Link getDefaultInstance boolean connec
  • Prometheus - 监控容器中的命令输出

    我需要监控 eks 集群中具有 nfs 挂载路径的许多旧容器 使用 nfs client helm 图表映射容器 i 中的 nfs 目录 我需要监视我的安装路径何时由于某种原因丢失 而我发现做到这一点的唯一方法是在容器中执行命令 bin b
  • List.empty 与 List() 与 new List()

    有什么区别List empty List and new List 我什么时候应该使用哪个 首先 new List 不会工作 因为List类是抽象的 另外两个选项定义如下the List object http www scala lang
  • Android Studio:“创建新 AVD”窗口中禁用“确定”按钮

    我下载并安装了最新的 Android Studio 版本 0 8 6 测试版 但在尝试创建新的 Android 虚拟设备时遇到了困难 我尝试按照以下步骤操作 https developer android com training wear
  • 在 SwiftUI (5) 和 Xcode (12.4) 中实现 AdMob 插页式广告

    我正在努力在我的应用程序中实现插页式广告 但对 AdMob 提供的文档和新的 SwiftUI 应用程序结构遇到了一些困惑 这里是app swift文件 显示我已经实现了 GoogleMobileAds 并在didFinishLaunchin