3

我已经实现了 AdMob 横幅视图广告,以及GADBannerViewDelegate此处定义的协议: https ://developers.google.com/admob/ios/banner

所以我可以使用这个回调:

/// Tells the delegate an ad request failed.
func adView(_ bannerView: GADBannerView,
    didFailToReceiveAdWithError error: GADRequestError) {
    print("adView:didFailToReceiveAdWithError: \(error.localizedDescription)")
}

我可以从定义的文件中看到GADRequestError还有一个GADErrorCode枚举: https ://github.com/floatinghotpot/google-admob-sdk/blob/master/src/ios/GADRequestError.h

此处记录: https ://developers.google.com/ad-manager/mobile-ads-sdk/ios/api/reference/Enums/GADErrorCode

-

但是,我真的很难从错误对象中获取GADErrorCode枚举对象。GADRequestError

-

这是GADRequestError由于设备离线而无法加载广告时的错误对象的值:

Error Domain=com.google.admob Code=-1009 "The Internet connection appears to be offline." UserInfo={NSUnderlyingError=0x600000f46880 {Error Domain=kCFErrorDomainCFNetwork Code=-1009 "The Internet connection appears to be offline." UserInfo={NSErrorFailingURLStringKey=https://googleads.g.doubleclick.net/mads/static/sdk/native/sdk-core-v40.html?sdk=afma-sdk-i-v7.36.0, NSErrorFailingURLKey=https://googleads.g.doubleclick.net/mads/static/sdk/native/sdk-core-v40.html?sdk=afma-sdk-i-v7.36.0, _kCFStreamErrorCodeKey=50, _kCFStreamErrorDomainKey=1, NSLocalizedDescription=The Internet connection appears to be offline.}}, NSErrorFailingURLStringKey=https://googleads.g.doubleclick.net/mads/static/sdk/native/sdk-core-v40.html?sdk=afma-sdk-i-v7.36.0, NSErrorFailingURLKey=https://googleads.g.doubleclick.net/mads/static/sdk/native/sdk-core-v40.html?sdk=afma-sdk-i-v7.36.0, _kCFStreamErrorDomainKey=1, _kCFStreamErrorCodeKey=50, NSLocalizedDescription=The Internet connection appears to be offline.}

可以以某种方式将其转换为GADErrorCode枚举对象吗?

4

1 回答 1

2

实际上有一个code属性(一个Int),GADRequestError所以你可以使用它来创建GADErrorCode如下,

func adView(_ bannerView: GADBannerView, didFailToReceiveAdWithError error: GADRequestError) {
    let gadErrorCode = GADErrorCode(rawValue: error.code)
}

现在让我们谈谈 SDK 行为。

Admob SDK 初始化前没有互联网连接

当绝对没有互联网连接并且您使用以下命令初始化 SDK 时,

GADMobileAds.configure(withApplicationID: "ca-app-pub-3940256099942544~1458002511")

您将收到与您的问题相同的错误,并且委托方法didFailToReceiveAdWithError也将收到此 SDK 失败错误,而不是横幅广告失败错误。实际上这个错误(kCFErrorDomainCFNetwork code -1009)意味着你甚至没有连接到互联网连接。您可以在此处查看更多详细信息。

因此,现在如果您GADErrorCode从此代码创建-1009,它将始终转到您在语句default case中使用它的任何位置。switch如下所示,

let gadErrorCode = GADErrorCode(rawValue: error.code)!
switch gadErrorCode {
case .internalError:
    print( "Internal Error code \(gadErrorCode.rawValue)")
default:
    print( "Unknown Error Code \(gadErrorCode.rawValue)")
}

输出

Unknown Error Code -1009

所以这就是SDK未初始化时的解释。


Admob SDK 初始化后或横幅请求前没有互联网连接

如果您在进行配置调用时有 Internet 连接并且 SDK 已成功初始化,那么您将始终收到枚举GADMobileAds.configure中提到的错误代码之一。GADErrorCode

为了验证这一点,我们可以通过以下两种方式轻松加载横幅广告

1)您可以启动您的应用程序具有互联网连接,以便初始化 SDK,然后在创建和加载横幅请求之前,只需关闭互联网,然后调用此代码,

bannerView.load(GADRequest())

现在,您将得到enum 中error code 2的这种情况case networkError = 2 ,其中指出,GADErrorCode

从网络加载数据时出错。

2)在您的代码中注释掉下面的行,连接到互联网连接并运行您的应用程序,

bannerView.rootViewController = self

现在您将得到error code 0哪个是case invalidRequest = 0,并且该错误的原因在文档中提到为

广告请求无效。本地化失败原因错误描述将​​有更多详细信息。这通常是因为广告没有设置广告单元 ID 或根视图控制器。

因此,当 SDK 初始化时,您将始终error codedelegate didFailToReceiveAdWithError.

于 2018-12-13T06:03:07.173 回答