如何使Ad Mob横幅消失/清除,如果它没有加载广告在SwiftUI?

x759pob2  于 2023-04-10  发布在  Swift
关注(0)|答案(1)|浏览(128)

我已经在iOS应用中实现了SwiftUIBannerAd,但有时广告无法加载。在这种情况下,我希望广告横幅是透明的,这样它就不会占用屏幕上的任何空间。如何修改现有代码来实现这一点?
以下是我当前的banner实现:

public struct SwiftUIBannerAd: View {
@State var height: CGFloat = 0
@State var width: CGFloat = 0
@State var adPosition: AdPosition
let adUnitId: String

    public init(adPosition: AdPosition, adUnitId: String) {
        self.adPosition = adPosition
        self.adUnitId = adUnitId
    }
    
    public enum AdPosition {
        case top
        case bottom
    }
    
    public var body: some View {
        VStack {
            if adPosition == .bottom {
                Spacer()
            }
    
            //Ad
            BannerAd(adUnitId: adUnitId)
                .frame(width: width, height: height, alignment: .center)
                .onAppear {
                    setFrame()
                }
                .onReceive(NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)) { _ in
                    setFrame()
                }
    
            if adPosition == .top {
                Spacer()
            }
        }
    }
    
    func setFrame() {
        let safeAreaInsets = UIApplication.shared.windows.first(where: { $0.isKeyWindow })?.safeAreaInsets ?? .zero
        let frame = UIScreen.main.bounds.inset(by: safeAreaInsets)
    
        let adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(frame.width)
    
        self.width = adSize.size.width
        self.height = adSize.size.height
    }

}

class BannerAdVC: UIViewController, GADBannerViewDelegate {
let adUnitId: String

    init(adUnitId: String) {
        self.adUnitId = adUnitId
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    var bannerView: GADBannerView = GADBannerView()
    
    override func viewDidLoad() {
        bannerView.delegate = self
        bannerView.adUnitID = adUnitId
        bannerView.rootViewController = self
        view.addSubview(bannerView)
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
        loadBannerAd()
        
    }
    
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        coordinator.animate(alongsideTransition: nil) { _ in
            self.loadBannerAd()
        }
    }
    
    func loadBannerAd() {
        let frame = view.frame.inset(by: view.safeAreaInsets)
        let viewWidth = frame.size.width
    
        bannerView.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth)
    
        if #available(iOS 14, *) {
            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
                    let request = GADRequest()
                    DispatchQueue.main.async {
                        request.scene = self.view.window?.windowScene
                        self.bannerView.load(request)
                    }
                })
            }
        } else {
            let request = GADRequest()
            request.scene = view.window?.windowScene
            bannerView.load(request)
        }
    }

}

struct BannerAd: UIViewControllerRepresentable {
let adUnitId: String

    init(adUnitId: String) {
        self.adUnitId = adUnitId
    }
    
    
    func makeUIViewController(context: Context) -> BannerAdVC {
        return BannerAdVC(adUnitId: adUnitId)
    }
    
    func updateUIViewController(_ uiViewController: BannerAdVC, context: Context) {
    
    }

}

我试着用这个,但它什么也没做:

func bannerView(_ bannerView: GADBannerView, didFailToReceiveAdWithError error: Error) {
            print("Failed to receive ad: \(error.localizedDescription)")
            bannerView.backgroundColor = .clear
            bannerView.isHidden = true
        }

我在我的视图中显示这个横幅,如下所示:

if showBannerAd {
                HStack {
                    Spacer()
                    SwiftUIBannerAd(adPosition: .top, adUnitId: StaticCodes.bannerCode)
                        .frame(width: GADAdSizeBanner.size.width, height: GADAdSizeBanner.size.height)
                        .padding()
                    Spacer()
                }
            } else {
                EmptyView()
                    .frame(height: 0)
            }
chhkpiq4

chhkpiq41#

执行此操作并嵌入ZStack

VStack {
                Spacer()
                if showBannerAd {
                    HStack {
                        Spacer()
                        SwiftUIBannerAd(adPosition: .top, adUnitId: StaticCodes.bannerCode)
                            .frame(width: GADAdSizeBanner.size.width, height: GADAdSizeBanner.size.height)
                        Spacer()
                    }
                } else {
                    EmptyView()
                        .frame(height: 0)
                }
            }

相关问题