将广告添加到SwiftUI网格的最佳方法是什么?

问题描述

您好,我想将广告添加到swiftUI网格中。网格中包含我从Firebase后端获取图片,每两张图片之后,我都想要一个广告。

我对SwiftUi和使用广告都是很陌生的,所以我不确定代码的正确性,但这就是我到目前为止所得到的。

// Code for the pictures Grid
struct PicturesGrid: View {
private let data: [Item]

var body: some View {
    let gridItems = [GridItem(.fixed(UIScreen.screenWidth / 2),alignment: .leading),GridItem(.fixed(UIScreen.screenWidth / 2),alignment: .leading)]
    
    return ScrollView(showsIndicators: false) {
        LazyVGrid(columns: gridItems) {
            ForEach(0..<self.data.count,id: \.self) { index in
                
                // Using this workaround for the ad to be on the whole width of the screen
                // Also,after every six images I am adding and ad
                if index != 0,index % 6 == 0 {
                    AdView()
                        .frame(width: UIScreen.screenWidth,height: 280)
                        .padding(.top,20)
                    Spacer()
                    
                    item
                        .frame(width: UIScreen.screenWidth / 2)
                } else {
                    item
                        .frame(width: UIScreen.screenWidth / 2)
                    
                }
            }
        }
    }
}

// this is for the picture
var item: some View {
    NavigationLink(destination: DetailView(viewmodel: Detailviewmodel(item: itemAtIndexPath))) {
        Cell(viewmodel: Cellviewmodel(item: itemAtIndexPath))
    }
    .buttonStyle(PlainButtonStyle())
}
}

这是我当前用于加载,创建和显示广告的代码

// Code for the ad that I am currently using
struct AdView: UIViewControllerRepresentable {

func makeUIViewController(context: Context) -> UIViewController {
    let adController = AdViewController(self)
    
    return adController
}

func updateUIViewController(_ uiViewController: UIViewController,context: Context) {}
}

class AdViewController: UIViewController {
private var adView: AdView

/// The height constraint applied to the ad view,where necessary.
var heightConstraint: NSLayoutConstraint?

/// The ad loader. You must keep a strong reference to the GADAdLoader during the ad loading
/// process.
var adLoader: GADAdLoader!

/// The native ad view that is being presented.
var nativeAdView: GADUnifiednativeAdView!

/// The ad unit ID.
let adUnitID = "ca-app-pub-3940256099942544/3986624511"

init(_ adView: AdView) {
    self.adView = adView
    
    super.init(nibName: nil,bundle: nil)
}

required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override func viewDidLoad() {
    super.viewDidLoad()
    
    var nibView: Any?
    nibView = Bundle.main.loadNibNamed("ListAdView",owner: nil,options: nil)?.first
    
    guard let nativeAdView = nibView as? GADUnifiednativeAdView else {
        return
    }
    setAdView(nativeAdView)
    
    adLoader = GADAdLoader(adUnitID: adUnitID,rootViewController: self,adTypes: [.unifiednative],options: nil)
    
    
    
    adLoader.delegate = self
    dispatchQueue.global(qos: .background).async {
        self.adLoader.load(GADRequest())
    }
}

func setAdView(_ adView: GADUnifiednativeAdView) {
    // Remove the prevIoUs ad view.
    dispatchQueue.main.async { [weak self] in
        guard let weakSelf = self else {
            return
        }
        weakSelf.nativeAdView = adView
        weakSelf.view.addSubview(weakSelf.nativeAdView)
        weakSelf.nativeAdView.translatesAutoresizingMaskIntoConstraints = false
        
        // Layout constraints for positioning the native ad view to stretch the entire width and height
        let viewDictionary = ["_nativeAdView": weakSelf.nativeAdView!]
        weakSelf.view.addConstraints(
            NSLayoutConstraint.constraints(
                withVisualFormat: "H:|[_nativeAdView]|",options: NSLayoutConstraint.FormatOptions(rawValue: 0),metrics: nil,views: viewDictionary)
        )
        weakSelf.view.addConstraints(
            NSLayoutConstraint.constraints(
                withVisualFormat: "V:|[_nativeAdView]|",views: viewDictionary)
        )
    }
}
}

extension AdViewController: GADUnifiednativeAdLoaderDelegate {
    func adLoader(_ adLoader: GADAdLoader,didFailToReceiveAdWithError error: 

GADRequestError) {
    
    print("didFailToReceiveAdWithError: \(error)")
}

func adLoader(_ adLoader: GADAdLoader,didReceive nativeAd: GADUnifiednativeAd) {
    
    print("Received unified native ad: \(nativeAd)")
    // Deactivate the height constraint that was set when the prevIoUs video ad loaded.
    heightConstraint?.isActive = false
    
    // Populate the native ad view with the native ad assets.
    // The headline and mediaContent are guaranteed to be present in every native ad.
    (nativeAdView.headlineView as? UILabel)?.text = nativeAd.headline
    nativeAdView.mediaView?.mediaContent = nativeAd.mediaContent
    
    // This app uses a fixed width for the GADMediaView and changes its height to match the aspect
    // ratio of the media it displays.
    if let mediaView = nativeAdView.mediaView,nativeAd.mediaContent.aspectRatio > 0 {
        heightConstraint = NSLayoutConstraint(
            item: mediaView,attribute: .height,relatedBy: .equal,toItem: mediaView,attribute: .width,multiplier: CGFloat(1 / nativeAd.mediaContent.aspectRatio),constant: 0)
        heightConstraint?.isActive = true
    }
    
    // This asset is not guaranteed to be present. Check that it is before
    // showing or hiding it.
    (nativeAdView.advertiserView as? UILabel)?.text = nativeAd.advertiser
    nativeAdView.advertiserView?.isHidden = nativeAd.advertiser == nil
    
    // In order for the SDK to process touch events properly,user interaction should be disabled.
    nativeAdView.callToActionView?.isUserInteractionEnabled = false
    
    // Associate the native ad view with the native ad object. This is
    // required to make the ad clickable.
    // Note: this should always be done after populating the ad views.
    nativeAdView.nativeAd = nativeAd
}
}

我想提一下,目前这是可行的,但我想解决的问题却不知道如何解决

  1. 带有图片的网格会加载,但是当我在广告上滚动时,广告要加载并显示需要几秒钟。如何至少在加载时使其隐藏或使其更快?
  2. 如果我滚动浏览一个广告,则该广告会加载;如果我继续滚动,则当我向上滚动时,该广告将不再加载,必须等待它再次加载。我怎样才能解决这个问题?或针对这种情况的最佳实践是什么?
  3. 我应该使用多个广告吗?要在显示之前加载它们?如果是,那我应该怎么做?
  4. 在这里所做的事情看起来是否还正确?请...我需要一些帮助

解决方法

在SwiftUI网格中展示广告的最佳方法是在您的应用中实施原生广告,以提供个性化的广告体验