1

我正在处理 Admob 插页式广告,特别是我试图在我的特定ViewController应用加载时显示插页式广告。我使用了官方 Admob 插页式指南提供的代码,但它不起作用:https ://developers.google.com/admob/ios/interstitial?hl=it 。我也在这里关注了这个视频:https ://youtu.be/ahmQQ3OeY0Y?t= 787(13.04 分钟停止视频)。如果您查看代码与指南中的相同。我的目标是在出现广告时显示广告,RequestViewController因此我尝试在viewDidAppear函数中显示广告。无论如何它不起作用,控制台显示此错误:

要在此设备上获取测试广告,请调用:request.testDevices = @[ kGADSimulatorID ]

AppDelegate.swift

import UIKit
import UserNotifications
import GoogleMobileAds

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate,GADInterstitialDelegate {

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

        GADMobileAds.configure(withApplicationID: "ca-app-pub-*******")
    }
}

这是我展示广告的 ViewController:

RequestviewController.swift

class RequestViewController: UIViewController {

var myInterstitial : GADInterstitial?

override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewDidAppear(_ animated: Bool) {

    //display ad

    myInterstitial = createAndLoadInterstitial()

    if (myInterstitial?.isReady)!{
        print("\n\n\n\n\nReady")
        myInterstitial?.present(fromRootViewController: self)
    }else { print("\n\n\n\nAd wasn't ready") }
}

func createAndLoadInterstitial()->GADInterstitial {
    let interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")  //test Ad unit id
    interstitial.delegate = self
    interstitial.load(GADRequest())
    return interstitial
}
func interstitialDidReceiveAd(ad: GADInterstitial!) {
    print("interstitialDidReceiveAd")
}

func interstitial(ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) {
    print(error.localizedDescription)
}

func interstitialDidDismissScreen(ad: GADInterstitial!) {
    print("\n\n\n\n\n\ninterstitialDidDismissScreen")
    myInterstitial = createAndLoadInterstitial()
}
4

2 回答 2

0

你需要这样写,

appDelegate.createAndLoadInterstitial()

代替,

appDelegate.myInterstitial?.present(fromRootViewController: self)
于 2017-06-01T10:34:13.640 回答
0

看起来根本问题是 RequestViewController 的这一部分:

myInterstitial = createAndLoadInterstitial()

if (myInterstitial?.isReady)!{
    print("\n\n\n\n\nReady")
    myInterstitial?.present(fromRootViewController: self)
}else { print("\n\n\n\nAd wasn't ready") }

插页式广告是异步加载的,这意味着调用load()将在广告加载并准备好展示之前返回。如果您的应用程序正在调用load()createAndLoadInterstitial然后isReady立即检查,则广告没有时间实际加载,并且isReady总是错误的。

处理此问题的一个好方法是在您的第一个视图控制器中创建插页式广告,然后过渡到RequestViewController. 这将使广告有时间加载,并且在同一过渡期间仍会显示它。

FWIW,ViewControllers 之间的转换时间是您的应用程序流中使用插页式广告的好地方,在那里做得很好。

此外,该行:

要在此设备上获取测试广告,请调用:request.testDevices = @[ kGADSimulatorID ]

不是错误。Android 和 iOS SDK 始终将其打印到日志中,以便发布商知道如何为特定设备或模拟器获取测试广告。如果您在硬件设备而不是 iOS 模拟器上运行,您会在该行中看到设备的唯一标识符,然后您可以在代码中使用它来获取测试广告。

于 2017-06-02T16:21:02.433 回答