【问题标题】:Getting An Interstitial Ad Error When Ad Not Ready - Swift广告未就绪时出现插页式广告错误 - Swift
【发布时间】:2021-08-12 20:06:54
【问题描述】:

我目前正在为我的视图控制器投放一个插页式广告。问题是当广告没有准备好时,我的应用程序会因错误而崩溃。如果有人可以帮助我解决以下问题,我将不胜感激!谢谢

视图控制器:问题是当广告未准备好时,应用程序因错误而崩溃。

class JournalViewController: UIViewController, GADFullScreenContentDelegate {
    
    var interstitial: GADInterstitialAd!   
 
    override func viewDidLoad() {

        super.viewDidLoad()

        let request = GADRequest()
        GADInterstitialAd.load(withAdUnitID:"id ...",
                                      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
                            }
          )
                
       let randomTime = Double(arc4random() + 20).truncatingRemainder(dividingBy: 60.0)
        Timer.scheduledTimer(timeInterval: randomTime, target: self, selector: #selector(ViewController.CreateAd), userInfo: nil, repeats: false)
        
    }
    @objc func CreateAd() -> GADInterstitialAd {
        
        if interstitial != nil {
                    interstitial.present(fromRootViewController: self)
                    let randomTime = Double(arc4random() + 20).truncatingRemainder(dividingBy: 60.0)
                    Timer.scheduledTimer(timeInterval: randomTime, target: self, selector: #selector(ViewController.CreateAd), userInfo: nil, repeats: false)
        } else {
            print("Ad not ready") // Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffee788bff8)
            interstitial = CreateAd()
        }
        return interstitial
            }

此外,如果有人有时间也看看这个。我想让广告多次运行。我知道插页式广告不允许这样做,为了解决这个问题,我实现了这个功能,但它不起作用。这是不正确的吗?

    func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
        
        interstitial = CreateAd()
        
    }

【问题讨论】:

  • 你为什么在CreateAd里面设置interstitial = CreateAd()
  • 我的理由是,如果广告还没有准备好,它将运行一个循环,直到广告准备好再次展示。这可能不正确或不合理,但这只是我的思考过程
  • 您正在调用 CreateAd() 1) 从内部 adDidDismissFullScreenContent(_:),2) 从内部 viewDidLoad,以及 3) 从内部 CreateAd() 本身。这不可能。您可能会导致无限递归,使其崩溃。
  • 就 adDidDismissFullScreenContent 而言,这样做的目的是让插页式广告在关闭后可以重复播放。我会看看如何改进这一点,至少我现在知道这些是问题所在。谢谢你

标签: swift interstitial googlemobileads


【解决方案1】:

你不应该从CreateAd()返回广告,应该在调用GADInterstitialAd.load(..)的completionHandler时设置广告。

这应该是您的 createAd 函数(不返回任何内容):

var interstitial: GADInterstitialAd?


func createAd() {
    GADInterstitialAd.load(withAdUnitID:"id ...",
                                  request: GADRequest(),
                        completionHandler: { ad, error in
                          if let error = error {
                            print("Failed to load interstitial ad with error: \(error.localizedDescription)")
                            return
                          }
                            interstitial = ad
                            interstitial?.fullScreenContentDelegate = self
                        }
      )
}

然后随时呈现,并在广告关闭后再次致电createAd()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多