SwiftUI:在rootViewController上未显示Admob间隙广告

SwiftUI:在rootViewController上未显示Admob间隙广告,swift,swiftui,interstitial,googlemobileads,gadinterstitial,Swift,Swiftui,Interstitial,Googlemobileads,Gadinterstitial,以快捷方式编码 我已经在我的SwiftUI应用程序中实现了一个设置页面,单击视图中的按钮即可显示该页面。此视图被包装在图纸中。您可以看到下面的代码: TabsBar(showOptionsTab: $showOptionsTab) .sheet(isPresented: $showOptionsTab) { OptionsTab(showOptionsTab: self.$showOptionsTab) } 我在这个“OptionsTab”中实现了一个间

以快捷方式编码

我已经在我的SwiftUI应用程序中实现了一个设置页面,单击视图中的按钮即可显示该页面。此视图被包装在图纸中。您可以看到下面的代码:

TabsBar(showOptionsTab: $showOptionsTab)
    .sheet(isPresented: $showOptionsTab)
    {
        OptionsTab(showOptionsTab: self.$showOptionsTab)
    }
我在这个“OptionsTab”中实现了一个间隙,它是在.onAppear()调用中加载options选项卡时创建的,在选择back按钮时显示。您可以从下面的选项选项卡中选择代码:

@State private var interstitial : GADInterstitial!

VStack
{
    ... other code

    Button(action:
    {
        if ( self.interstitial.isReady)
        { 
            let root = UIApplication.shared.windows.first?.rootViewController
            self.interstitial.present(fromRootViewController: root!)               
        }

        self.showOptionsTab.toggle()
    })
    {
        Image(systemName: "xmark")
            .font(.largeTitle)
    }
}
.onAppear
{
    self.interstitial = GADInterstitial(adUnitID: "addID")
    let req = GADRequest()
    self.interstitial.load(req) 
}
我在按钮中有额外的代码,它记录了间隙的状态,并显示为准备就绪,当前的代码正在被点击。。。但它从未出现过

我已经在ContentView中实现了这段代码,间隙加载非常好。此代码在工作表中的某些内容导致间隙不存在

当在从图纸显示的视图中时,rootViewController是否是加载间隙的不正确视图?否则,我还做错了什么

提前谢谢你的帮助

试试这个

TabsBar(showOptionsTab: $showOptionsTab)
    .sheet(isPresented: $showOptionsTab)
    {
        OptionsTab(showOptionsTab: self.$showOptionsTab)
            .OnDisapear 
            {    
                if ( self.interstitial.isReady)
                { 
                    let root = UIApplication.shared.windows.first?.rootViewController
                    self.interstitial.present(fromRootViewController: root!)               
                }
            } 
        }
    }
然后在此视图中添加state interstitual变量,并在ContextView的外观上创建interstitual。

解决方案2: (未测试,但应能正常工作): 在presentingViewController而不是rootViewController上显示

  if ( self.interstitial.isReady)
        { 
            let root = UIApplication.shared.windows.first?.rootViewController?.presentingViewController
            self.interstitial.present(fromRootViewController: root!)               
        }
在答案的末尾检查原因

解决方案1: 听起来好像有什么东西阻止了在已经呈现了工作表视图的情况下呈现间隙广告

在我的例子中,我想在展示图纸视图后立即展示广告,但这不起作用

有效的方法是,展示广告,然后在它被撤销后,将展示工作表视图,,它成功了

对于间隙,我使用了这个代码

import SwiftUI
import GoogleMobileAds
import UIKit

final class Interstitial:NSObject, GADInterstitialDelegate{
  var interstitialID = "ca-app-pub-3940256099942544/4411468910"
  var interstitial:GADInterstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")
  var sheet: (() -> Void)? = nil  //this closure will be executed after dismissing the ad

  override init() {
    super.init()
    LoadInterstitial()
  }

  func LoadInterstitial(){
    let req = GADRequest()
    self.interstitial.load(req)
    self.interstitial.delegate = self
  }

  func showAd(then sheet:(() -> Void)?){
    if self.interstitial.isReady{
      let root = UIApplication.shared.windows.first?.rootViewController
      self.interstitial.present(fromRootViewController: root!)
      self.sheet = sheet
    }
    else{
      print("Not Ready")
    }
  }

  func interstitialDidDismissScreen(_ ad: GADInterstitial) {
    self.interstitial = GADInterstitial(adUnitID: interstitialID)
    LoadInterstitial()
    if let presentSheet = sheet {
      presentSheet()
    }
  }
}
在这里,我们将传递希望发生在闭包上的任何事情,当调用
InterstitialIDDISMISSScreen
时将调用闭包

现在,不再在按下按钮时切换状态,而是在ad减弱后切换

在contentView的顶部:

    struct HistoryView: View {
      private var fullScreenAd: Interstitial!
    init() {
fullScreenAd = Interstitial()
}
    }
然后在按钮中:

   Button(action: {
            self.interstitial.showAd {
              self.showOptionsTab.toggle()

            }              

        })
注:我使用的代码间隙广告从这个

另外,如果我们不知道这是不是swiftUI中的一个bug,或者是googleAdmob应该处理的东西,那么google没有对swiftUI的支持,所以我们不能责怪他们

问题是,在iOS 13中,抓取根ViewController将返回显示工作表的视图控制器,并且当尝试显示广告时,UIKit将投诉您正在尝试显示视图控制器,而视图控制器已经存在(工作表), 解决方案简单,在显示的视图控制器(图纸)上显示广告