Cómo registrar el ID de la respuesta del anuncio con Firebase Crashlytics

Firebase Crashlytics es una herramienta liviana para informar fallas en tiempo real que te facilita la administración de los problemas de estabilidad de tu app. Crashlytics agrupa las fallas de forma inteligente y destaca las circunstancias que las originaron para ahorrarte tiempo de solución de problemas.

En esta guía, se describe cómo integrar Crashlytics en tu proyecto de Xcode para que puedas registrar los IDs de respuesta de los anuncios. Más adelante, cuando soluciones problemas de fallas en tu app, puedes buscar el ID de respuesta del anuncio y usar el Centro de revisión de anuncios en Ad Manager para encontrar y bloquear los anuncios.

Paso 1: Agrega Firebase a una aplicación para iOS

  1. Si quieres intentar acceder con Firebase desde una app limpia, puedes descargar o clonar los ejemplos del SDK de anuncios de Google para dispositivos móviles para el repositorio de iOS en GitHub. En esta guía, se usa específicamente el ejemplo de banner Ejemplo de banner.

    Si ya tienes una app, deberías poder continuar con otros pasos con el ID del paquete de tu app. Los mismos pasos también se pueden aplicar a otros ejemplos en el repositorio con adaptaciones menores.

  2. Para usar Firebase Crashlytics, debes crear un proyecto de Firebase y agregarle tu app. Si aún no lo has hecho, crea un proyecto de Firebase. Asegúrate de registrar la app en ella.

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

    2. En la pantalla que aparece, haz clic en No > Configurar una app nueva de Firebase.

  3. En el Podfile, agrega los Pods para Google Analytics y Firebase Crashlytics.

    source 'https://github.com/CocoaPods/Specs.git'
    
    platform :ios, '8.0'
    
    target 'AdManagerBannerExample' do
      use_frameworks!
      pod 'Google-Mobile-Ads-SDK'
      pod 'Firebase/Crashlytics'
      pod 'Firebase/Analytics'
    end
    
  4. En la terminal o en un símbolo del sistema, instala y actualiza tus Pods:

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

Paso 2: Configura Firebase para tu app

Swift

En tu AppDelegate.swift, agrega 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 tu AppDelegate.m, agrega 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 y haz clic en la pestaña Build Phases. Agrega la secuencia de comandos de ejecución de Fabric:

Limpia la carpeta de compilación y, luego, compila y ejecuta la app. Ahora puedes acceder a la consola web de Firebase y al panel de Crashlytics.

(Opcional): Prueba tu configuración

Si agregas un botón de falla, puedes forzar una falla que provoque una falla de la app cada vez que se presione el botón. Esta configuración de prueba activará el código del paso 3 para enviar registros personalizados a los paneles de Firebase Crashlytic.

Swift

En tu ViewController.swift, agrega 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, agrega este @IBAction al final de la declaración de la clase:

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

Objective‑C

En tu ViewController.m, agrega 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, agrega este IBAction al final de la declaración de la clase:

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

En la barra de herramientas de Xcode, presiona el botón Detener y reinicia la app a través de un simulador. Después de cargar la app, puedes hacer clic en el botón Crash. Vuelve a Xcode y haz clic en el botón Reproducir para que se suba el registro de fallas a Crashlytics.

Paso 3: Registra el ID de respuesta del anuncio

Si cargas varios anuncios y los muestras en diferentes momentos, es una buena idea registrar cada ID de respuesta del anuncio con una clave diferente. Por ejemplo, en esta guía se utiliza un ejemplo que tiene solo un anuncio de banner. Por lo tanto, registramos el ID de respuesta del anuncio como la clave banner_ad_response_id en el siguiente fragmento.

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

Consulta Cómo personalizar tus informes de fallas de Firebase Crashlytics para obtener más información sobre los registros personalizados.

Swift

Agrega el siguiente código a tu ViewController.swift. En esencia, usa la función Crashlytics.setCustomValue() en la función de devolución de llamada 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

Agrega el siguiente código a tu ViewController.m. En esencia, usa 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

¡Felicitaciones! Ahora verás el adResponseId más reciente en la sección clave de las sesiones con fallas en el panel de Crashlytics. Ten en cuenta que algunas claves pueden tardar hasta una hora en volverse visibles en tu panel.