Geração de IDs de resposta de anúncio com o Firebase Crashlytics

O Firebase Crashlytics é uma ferramenta de relatório de falhas leve e em tempo real que facilita o gerenciamento de problemas de estabilidade no seu app. O Crashlytics economiza tempo na solução de problemas agrupando de forma inteligente as falhas e destacando as circunstâncias que levam a elas.

Este guia descreve como integrar o Crashlytics ao seu projeto do Xcode para registrar IDs de resposta de anúncios. Depois, ao resolver problemas de falhas no app, você pode procurar o ID de resposta do anúncio e usar a Central de revisão de anúncios na Ad Manager para encontrar e bloquear os anúncios.

Etapa 1: adicionar o Firebase a um aplicativo iOS

  1. Se você quiser tentar fazer login com o Firebase em um app limpo, faça o download ou clone os exemplos do SDK dos anúncios para dispositivos móveis do Google no repositório do iOS no GitHub. Este guia usa especificamente o Exemplo de banner.

    Se você já tiver um app, poderá prosseguir para outras etapas com o ID do pacote do app. As mesmas etapas também podem ser aplicadas a outros exemplos no repositório com pequenas adaptações.

  2. Para usar o Firebase Crashlytics, você precisa criar um projeto do Firebase e adicionar seu app a ele. Crie um projeto do Firebase, caso ainda não tenha feito isso. Registre seu app nele.

    1. Na página do Crashlytics no console do Firebase, clique em Configurar Crashlytics.

    2. Na tela que aparece, clique em Não > Configurar um novo app do Firebase.

  3. No Podfile, adicione os pods do Google Analytics e do 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. No Terminal ou em um prompt de comando, instale e atualize seus pods:

    pod install --repo-update
    
  5. Abra o arquivo AdManagerBannerExample.xcworkspace do Xcode para carregar o projeto.

Etapa 2:configurar o Firebase para seu app

Swift

Em AppDelegate.swift, adicione as seguintes linhas:

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

Em AppDelegate.m, adicione as seguintes linhas:

@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;
}

No Xcode, abra Build Settings, clique na guia Build Phases. Adicione o script de execução do Fabric:

Limpe a pasta de build e compile e execute o app. Agora você pode fazer login no console da Web do Firebase e acessar o painel do Crashlytics.

(Opcional): testar a configuração

Ao adicionar um botão de falha, você pode forçar uma falha que causa uma falha no app a cada vez que o botão é pressionado. Essa configuração de teste aciona o código na etapa 3 para enviar registros personalizados aos painéis do Firebase Crashlytics.

Swift

No ViewController.swift, adicione as seguintes linhas à função 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)
    }

Em seguida, adicione este @IBAction à parte de baixo da declaração de classe:

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

Objective-C

No ViewController.m, adicione as seguintes linhas ao 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];
}

Em seguida, adicione este IBAction à parte de baixo da declaração de classe:

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

Na barra de ferramentas do Xcode, pressione o botão Parar e reinicie o app usando um simulador. Depois que o app for carregado, clique no botão Crash. Volte para o Xcode e clique no botão Play para que o registro de falhas seja enviado ao Crashlytics.

Etapa 3: registrar o ID da resposta do anúncio

Se você carregar vários anúncios e os mostrar em momentos diferentes, é recomendável registrar cada ID de resposta do anúncio com uma chave separada. Por exemplo, este guia usa um exemplo com apenas um anúncio de banner. Portanto, registramos o ID de resposta do anúncio como a chave banner_ad_response_id no snippet a seguir.

Também é possível criar vários pares de chave-valor personalizados no Firebase Crashlytics para diferentes tipos e eventos de anúncios. Consulte as notificações do ciclo de vida das solicitações de anúncios

Acesse Personalizar relatórios de erros do Firebase Crashlytics para mais informações sobre o registro personalizado.

Swift

Adicione o seguinte código ao ViewController.swift: Essencialmente, ele usa a função Crashlytics.setCustomValue() na função de callback 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

Adicione o seguinte código ao ViewController.m: Essencialmente, ele usa a função [FIRCrashlytics crashlytics] setCustomValue na função 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

Parabéns! Agora você vai encontrar o adResponseId mais recente na seção principal das sessões de falha no painel do Crashlytics. Algumas chaves podem levar até uma hora para ficarem visíveis no painel.