Registrar IDs de respuesta a solicitudes de anuncios con Firebase Crashlytics

Firebase Crashlytics es una herramienta sencilla que genera informes sobre fallos en tiempo real, lo que te permite gestionar problemas de estabilidad en tu aplicación fácilmente. Gracias a esta solución, puedes ahorrar tiempo a la hora de solucionar problemas, ya que agrupa los fallos de manera inteligente y muestra las circunstancias que los han provocado.

En esta guía se explica cómo integrar Crashlytics en tu proyecto de Xcode para que puedas registrar los ID de respuesta a solicitudes de anuncios. Así, cuando vayas a solucionar fallos que se produzcan en tu aplicación, puedes buscar los ID de respuesta a solicitudes de anuncios para localizar y bloquear anuncios concretos en el centro de revisión de anuncios de AdMob .

Paso 1: Añadir Firebase a una aplicación iOS

  1. Si quieres probar a generar registros con Firebase en una aplicación nueva, puedes descargar o clonar en GitHub el repositorio de ejemplos de iOS del SDK de anuncios de Google para móviles. Concretamente, en esta guía se utilizan ejemplos de anuncios de banner.

    Si ya tienes una aplicación, probablemente puedas continuar con los pasos que quedan utilizando el ID de paquete de la aplicación. Puedes seguir estas instrucciones con otros ejemplos del repositorio adaptándolas ligeramente.

  2. Para utilizar Firebase Crashlytics, deberás crear un proyecto de Firebase y añadir tu aplicación en él. Si aún no lo has hecho, crea el proyecto ahora y añádele tu aplicación.

    1. En la página de Crashlytics de la consola de Firebase, haz clic en Configurar Crashlytics.

    2. En la pantalla que aparece, haz clic en No > Configura una nueva aplicación de Firebase.

  3. En el Podfile, añade los pods de Google Analytics y Firebase Crashlytics.

    source 'https://github.com/CocoaPods/Specs.git'
    
    platform :ios, '8.0'
    
    target 'BannerExample' do
      use_frameworks!
      pod 'Google-Mobile-Ads-SDK'
      pod 'Firebase/Crashlytics'
      pod 'Firebase/Analytics'
    end
    
  4. Usa el terminal o una petición de comando para instalar y actualizar los pods:

    pod install --repo-update
    
  5. Abre el archivo BannerExample.xcworkspace para que Xcode cargue el proyecto.

Paso 2: Configurar Firebase en la aplicación

Swift

En AppDelegate.swift, añade las siguientes líneas:

import UIKit

// Import the Firebase library
import FirebaseCore

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?

  func application(_ application: UIApplication,
      didFinishLaunchingWithOptions launchOptions:
          [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Configure an instance of Firebase
    FirebaseApp.configure()
    return true
  }
}

Objective‑C

En AppDelegate.m, añade las siguientes líneas:

@import AppDelegate.h;

// Import the Firebase library
@import FirebaseCore;

@interface AppDelegate ()

@end

@implementation AppDelegate

‐ (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    // Initialize Firebase
    [FIRApp configure];
    return YES;
}

En Xcode, abre Build Settings (Configuración de compilación) y haz clic en la pestaña Build Phases (Fases de compilación). Añade la secuencia de comandos de ejecución de Fabric:

Limpia la carpeta de compilación y, a continuación, compila y ejecuta tu aplicación. Entonces, ya podrás iniciar sesión en la consola web de Firebase y acceder al panel de control de Crashlytics.

Probar la configuración (opcional)

Si añades un botón para forzar fallos, puedes provocar que se produzcan errores en la aplicación cada vez que lo pulses. Esta configuración de prueba activará el código del paso 3 para enviar registros personalizados a los paneles de control de Firebase Crashlytics.

Swift

En ViewController.swift, añade las siguientes líneas a la función viewDidLoad():

    override func viewDidLoad() {
        super.viewDidLoad()
        print("Google Mobile Ads SDK version: \(GADRequest.sdkVersion())")
        bannerView.delegate = self
        bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716"
        bannerView.rootViewController = self
        bannerView.load(GADRequest())
        let button = UIButton(type: .roundedRect)
        button.frame = CGRect(x: 20, y: 50, width: 100, height: 30)
        button.setTitle("Crash", for: [])
        button.addTarget(self, action: #selector(self.crashButtonTapped(_:)),
            for: .touchUpInside)
        view.addSubview(button)
    }

Luego, añade esta @IBAction al final de la declaración de clase:

    @IBAction func crashButtonTapped(_ sender: AnyObject) {
        fatalError("Test Crash Happened")
    }

Objective‑C

En ViewController.m, añade las siguientes líneas al método viewDidLoad:

‐ (void)viewDidLoad {
    [super viewDidLoad];

    /// ...

    UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(20, 50, 100, 30);
    [button setTitle:@"Crash" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(crashButtonTapped:)
        forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

Luego, añade esta IBAction al final de la declaración de clase:

‐ (IBAction)crashButtonTapped:(id)sender {
    assert(NO);
}

En la barra de herramientas de Xcode, pulsa el botón de parada y, a continuación, vuelve a ejecutar la aplicación desde un simulador. Cuando la aplicación se haya cargado, podrás usar el botón para forzar fallos. Vuelve a Xcode y haz clic en el botón de reproducción para que el registro de fallos se suba a Crashlytics.

Paso 3: Registrar el ID de respuesta a solicitud de anuncio

Si cargas varios anuncios y los muestras en distintos momentos, te puede resultar útil registrar cada ID de respuesta a solicitudes de anuncios con una clave distinta. En esta guía se muestra un ejemplo que solo incluye un anuncio de banner. Por lo tanto, registramos el ID de respuesta a las solicitudes de anuncios como la clave banner_ad_response_id en el siguiente fragmento de código.

También puedes crear varios pares clave-valor personalizados en Firebase Crashlytics para distintos tipos y eventos de anuncios. Consulta las notificaciones del ciclo de vida de las solicitudes de anuncios sobre los siguientes elementos:

Visita cómo personalizar informes sobre fallos de Firebase Crashlytics para obtener más información sobre los registros personalizados.

Swift

En tu archivo ViewController.swift, añade el código que se indica a continuación. Básicamente, utiliza la función Crashlytics.setCustomValue() en la función de retrollamada adViewDidReceiveAd.

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADBannerViewDelegate {

    /// The banner view.
    @IBOutlet weak var bannerView: GADBannerView!

    override func viewDidLoad() {
       super.viewDidLoad()
       ...
       bannerView.delegate = self
       ...
    }

    /// Tells the delegate an ad request loaded an ad.
    func adViewDidReceiveAd(_ bannerView: GADBannerView) {
        if let responseInfo = bannerView.responseInfo,
                responseId = responseInfo.responseId {
            print("adViewDidReceiveAd from network:
                \(responseInfo.adNetworkClassName), response Id='\(responseId)'")
            Crashlytics.sharedInstance().setCustomValue(responseId,
                forKey: "banner_ad_response_id")
        }
    }
}

Objective‑C

En tu archivo ViewController.m, añade el código que se indica a continuación. Básicamente, utiliza la función [FIRCrashlytics crashlytics] setCustomValue en la función adViewDidReceiveAd.

@import GoogleMobileAds;
@interface ViewController ()

@property(nonatomic, strong) GADBannerView *bannerView;

@end

@implementation ViewController

‐ (void)viewDidLoad {
  [super viewDidLoad];

  // In this case, we instantiate the banner with desired ad size.
  self.bannerView = [[GADBannerView alloc]
      initWithAdSize:GADAdSizeBanner];

  [self addBannerViewToView:self.bannerView];
}

‐ (void)addBannerViewToView:(UIView *)bannerView {
  bannerView.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:bannerView];
  [self.view addConstraints:@[
    [NSLayoutConstraint constraintWithItem:bannerView
                               attribute:NSLayoutAttributeBottom
                               relatedBy:NSLayoutRelationEqual
                                  toItem:self.bottomLayoutGuide
                               attribute:NSLayoutAttributeTop
                              multiplier:1
                                constant:0],
    [NSLayoutConstraint constraintWithItem:bannerView
                                 attribute:NSLayoutAttributeCenterX
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:self.view
                                kattribute:NSLayoutAttributeCenterX
                                multiplier:1
                                  constant:0]
                             ]];
}

- (void)adViewDidReceiveAd:(GADBannerView *)bannerView {
  NSString *adResponseId = bannerView.responseInfo.responseId;
  if (adResponseId) {
    NSLog(@"adViewDidReceiveAd from network: %@ with response Id: %@",
        bannerView.responseInfo.adNetworkClassName, adResponseId);
    [[FIRCrashlytics crashlytics] setCustomValue:adResponseId
                                          forKey:@"banner_ad_response_id"];
  }
}

@end

¡Enhorabuena! Ya puedes ver el adResponseId más reciente. Para ello, accede al panel de control de Crashlytics y ve a la sección de claves de las sesiones de fallos. Ten en cuenta que algunas claves pueden tardar hasta una hora en aparecer en el panel de control.