【发布时间】: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