SwiftUI 中的 Google AdMob 集成
Posted
技术标签:
【中文标题】SwiftUI 中的 Google AdMob 集成【英文标题】:Google AdMob integration in SwiftUI 【发布时间】:2019-08-24 21:14:52 【问题描述】:我没有找到如何将其与 swiftui 集成的示例。有人找到教程吗? 问题在于根控制器的部分。
【问题讨论】:
【参考方案1】:在 Apple SwiftUI 教程中 - integration in SwiftUI
你可以通过UIViewControllerRepresentable
找到如何解决这个问题
我创建了一个这样的示例
import GoogleMobileAds
import SwiftUI
import UIKit
struct GADBannerViewController: UIViewControllerRepresentable
func makeUIViewController(context: Context) -> UIViewController
let view = GADBannerView(adSize: kGADAdSizeBanner)
let viewController = UIViewController()
view.adUnitID = "your ad unit id in there."
view.rootViewController = viewController
viewController.view.addSubview(view)
viewController.view.frame = CGRect(origin: .zero, size: kGADAdSizeBanner.size)
view.load(GADRequest())
return viewController
func updateUIViewController(_ uiViewController: UIViewController, context: Context)
那么您可以像这样在 SwiftUI 视图的主体中使用 GADBannerViewController
HStack
Spacer()
GADBannerViewController()
.frame(width: kGADAdSizeBanner.size.width, height: kGADAdSizeBanner.size.height)
Spacer()
如果您有任何问题,请告诉我。?
【讨论】:
非常感谢! SwiftUI 和 AdMob 广告的绝妙技巧。 你觉得我的实现怎么样? ***.com/questions/60200602/… 如何使用智能横幅尺寸?【参考方案2】:您应该使用UIViewRepresentable
而不是UIViewControllerRepresentable
。
我使用以下代码实现了自适应横幅:
struct AdView : UIViewRepresentable
@State private var banner: GADBannerView = GADBannerView(adSize: kGADAdSizeBanner)
func makeUIView(context: UIViewRepresentableContext<AdView>) -> GADBannerView
#if DEBUG
banner.adUnitID = "ca-app-pub-debug"
#else
banner.adUnitID = "ca-app-pub-prod"
#endif
guard let rootViewController = UIApplication.shared.windows.first?.rootViewController else
return banner
banner.rootViewController = rootViewController
let frame = () -> CGRect in
return banner.rootViewController!.view.frame.inset(by: banner.rootViewController!.view.safeAreaInsets)
()
let viewWidth = frame.size.width
banner.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth)
banner.load(GADRequest())
return banner
func updateUIView(_ uiView: GADBannerView, context: UIViewRepresentableContext<AdView>)
然后你可以调用你的堆栈使用
AdView().frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 300)
.frame(width: kGADAdSizeBanner.size.width, height: kGADAdSizeBanner.size.height)
【讨论】:
究竟为什么比 UIViewControllerRepresentable 更好? 因为您想向视图控制器添加视图,而不是视图控制器。 我尝试了您的解决方案,但横幅放错了位置 - 不仅覆盖了状态栏,而且还高了一点。 工作得很好!非常感谢? 这就是我实施横幅广告的方式,但我发现我有成千上万的请求。例如,在 AdMob 上,我看到 6.35K 请求仅获得 153 次展示,因为它不断调用 updateUIView。可以吗?【参考方案3】:要改进 Mcatach 并避免将视图添加到应用的根视图控制器:
struct GADBannerViewController: UIViewControllerRepresentable
@State private var banner: GADBannerView = GADBannerView(adSize: kGADAdSizeBanner)
func makeUIViewController(context: Context) -> UIViewController
let bannerSize = GADBannerViewController.getAdBannerSize()
let viewController = UIViewController()
banner.adSize = bannerSize
banner.adUnitID = "ca-pub-ad-id-12345678"
banner.rootViewController = viewController
viewController.view.addSubview(banner)
viewController.view.frame = CGRect(origin: .zero, size: bannerSize.size)
banner.load(Ads.createRequest())
return viewController
func updateUIViewController(_ uiViewController: UIViewController, context: Context)
let bannerSize = GADBannerViewController.getAdBannerSize()
banner.frame = CGRect(origin: .zero, size: bannerSize.size)
banner.load(Ads.createRequest())
static func getAdBannerSize() -> GADAdSize
if let rootView = UIApplication.shared.windows.first?.rootViewController?.view
let frame = rootView.frame.inset(by: rootView.safeAreaInsets)
return GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(frame.width)
//No root VC, use 320x50 ad banner
return kGADAdSizeBanner
布局代码:
private func adSection() -> some View
HStack
let size = GADBannerViewController.getAdBannerSize()
Spacer()
GADBannerViewController()
.frame(width: size.size.width, height: size.size.height)
Spacer()
【讨论】:
不错的补充!这样更好以上是关于SwiftUI 中的 Google AdMob 集成的主要内容,如果未能解决你的问题,请参考以下文章
Google Admob 横幅广告在 swiftui 中不起作用
我在 AdMob 控制台中的应用不再与 Google Play 关联?
AdMob/Firebase 使用 cocoapods 与 SwiftUI 集成:发现意外的 Mach-O 标头代码:0x72613c21