如何从 GADRequestError 中获取 GADErrorCode?

How to get a GADErrorCode from a GADRequestError?

我已经实施了 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

-

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

-

这是由于设备离线导致广告无法加载时 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 枚举对象?

实际上 GADRequestError 中有一个 code 属性(一个 Int),因此您可以使用它来创建 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)意味着你甚至没有连接到互联网连接。您可以查看here了解更多详情。

所以现在,如果您从此代码 -1009 创建 GADErrorCode,它将始终转到 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 初始化后或横幅请求前无互联网连接

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

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

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

bannerView.load(GADRequest())

现在,您将在 GADErrorCode 枚举中得到 error code 2 也就是这种情况 case networkError = 2 ,其中指出,

There was an error loading data from the network.

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

bannerView.rootViewController = self

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

The ad request is invalid. The localizedFailureReason error description will have more details. Typically this is because the ad did not have the ad unit ID or root view controller set.

所以,当SDK初始化的时候,你总是会在delegate didFailToReceiveAdWithError.

中得到一个合适的error code