Как получить GADErrorCode из 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 enum: 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 Перечислить объект?

1 ответ

Решение

На самом деле есть 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 вместо сообщения об ошибке рекламного баннера. Собственно эта ошибка (kCFErrorDomainCFNetworkcode -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 ИЛИ до запроса баннера

Когда у вас было подключение к Интернету во время вызова конфигурации GADMobileAds.configure и SDK успешно инициализирован, тогда вы всегда получите один из кодов ошибки, упомянутых в GADErrorCode перечисление.

Чтобы убедиться в этом, мы можем легко отменить загрузку баннера двумя способами

1) Вы можете запустить ваше приложение, имеющее подключение к Интернету, чтобы инициализировать SDK, затем перед созданием и загрузкой запроса баннера просто отключите Интернет и затем вызовите этот код,

bannerView.load(GADRequest())

Теперь вы получите error code 2 что это за случай case networkError = 2 в GADErrorCode перечисление, которое заявляет,

При загрузке данных из сети произошла ошибка.

2) Прокомментируйте строку кода ниже, подключитесь к интернету и запустите приложение,

bannerView.rootViewController = self

Теперь вы получите error code 0 который case invalidRequest = 0 и причина этой ошибки упоминается в документации как

Запрос объявления недействителен. Описание ошибки localizedFailureReason будет содержать более подробную информацию. Обычно это связано с тем, что в объявлении не указан идентификатор рекламного блока или контроллер корневого просмотра.

Таким образом, когда SDK инициализируется, вы всегда получите правильное error code в delegatedidFailToReceiveAdWithError,

Другие вопросы по тегам