Firebase Crashlytics로 광고 응답 ID 로깅

Firebase Crashlytics는 앱의 안정성 문제를 쉽게 관리할 수 있는 간단한 실시간 비정상 종료 보고 도구입니다. Crashlytics를 사용하면 비정상 종료를 지능적으로 분류하고 비정상 종료로 이어지는 상황을 식별하여 문제 해결 시간을 단축할 수 있습니다.

이 가이드에서는 Crashlytics를 Xcode 프로젝트에 통합하여 광고 응답 ID를 로깅하는 방법을 설명합니다. 나중에 앱의 비정상 종료 문제를 해결할 때 광고 응답 ID를 찾아 AdMob의 광고 심사 센터를 사용하여 광고를 찾고 차단할 수 있습니다.

1단계: iOS 애플리케이션에 Firebase 추가

  1. 클린 앱에서 Firebase로 로깅하려면 GitHub에서 iOS 저장소용 Google 모바일 광고 SDK 예를 다운로드하거나 클론하세요. 이 가이드에서는 배너 예를 사용합니다.

    이미 앱이 있다면 앱의 번들 ID로 다른 단계를 진행할 수 있습니다. 저장소의 다른 예에도 동일한 단계를 약간 수정하여 적용할 수 있습니다.

  2. Firebase Crashlytics를 사용하려면 Firebase 프로젝트를 만들어 프로젝트에 추가해야 합니다. Firebase 프로젝트를 아직 만들지 않았다면 만듭니다. 여기에 앱을 등록해야 합니다.

    1. Firebase Console의 Crashlytics 페이지에서 Crashlytics 설정을 클릭합니다.

    2. 표시되는 화면에서 아니요 > 새 Firebase 앱 설정을 클릭합니다.

  3. Podfile에서 Google 애널리틱스 및 Firebase Crashlytics용 포드(pod)를 추가합니다.

    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. 터미널 또는 명령 프롬프트에서 포드를 설치하고 업데이트합니다.

    pod install --repo-update
    
  5. Xcode의 BannerExample.xcworkspace 파일을 열어 프로젝트를 로드합니다.

2단계: 앱에 Firebase 구성

Swift

AppDelegate.swift에 다음 줄을 추가합니다.

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

AppDelegate.m에서 다음 줄을 추가합니다.

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

Xcode에서 Build Settings(빌드 설정)를 열고 Build Phases(빌드 단계) 탭을 클릭합니다. Fabric 실행 스크립트를 추가합니다.

빌드 폴더를 정리한 다음 앱을 빌드하고 실행합니다. 이제 Firebase 웹 콘솔에 로그인하고 Crashlytics 대시보드에 액세스할 수 있습니다.

(선택사항): 설정 테스트

비정상 종료 버튼을 추가하면 버튼을 누를 때마다 앱을 강제로 종료할 수 있습니다. 이 테스트 설정은 3단계의 코드를 트리거하여 Firebase Crashlytic 대시보드에 커스텀 로그를 전송합니다.

Swift

ViewController.swift에서 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)
    }

그런 다음 클래스 선언 하단에 이 @IBAction를 추가합니다.

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

Objective-C

ViewController.m에서 다음 행을 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];
}

그런 다음 클래스 선언 하단에 이 IBAction를 추가합니다.

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

Xcode 툴바에서 Stop 버튼을 누른 다음 시뮬레이터를 통해 앱을 다시 실행합니다. 앱이 로드된 후 비정상 종료 버튼을 클릭할 수 있습니다. Xcode로 돌아와 Crashlytics에 업로드할 비정상 종료 로그의 재생 버튼을 클릭합니다.

3단계: 광고 응답 ID 로깅

여러 광고를 로드하여 각기 다른 시간에 노출하는 경우에는 개별 키로 각 광고 응답 ID를 로깅하는 것이 좋습니다. 예를 들어 이 가이드에서는 배너 광고가 하나만 있는 예를 사용합니다. 따라서 광고 응답 ID는 다음 스니펫의 banner_ad_response_id 키로 로깅됩니다.

또한 Firebase Crashlytics에서 다양한 광고 유형 및 광고 이벤트에 대한 맞춤 키-값 쌍을 여러 개 만들 수도 있습니다. 다음에 대한 광고 요청 수명 주기 알림을 참고하세요.

커스텀 로깅에 대한 자세한 내용은 Firebase Crashlytics 비정상 종료 보고서 맞춤설정을 참조하세요.

Swift

ViewController.swift에 다음 코드를 추가합니다. 기본적으로 adViewDidReceiveAd 콜백 함수에서는 Crashlytics.setCustomValue() 함수가 사용됩니다.

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

ViewController.m에 다음 코드를 추가합니다. 기본적으로 adViewDidReceiveAd 함수에서는 [FIRCrashlytics crashlytics] setCustomValue 함수가 사용됩니다.

@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

축하합니다. 이제 Crashlytics 대시보드에 있는 비정상 종료 세션의 키 섹션에 최신 adResponseId가 표시됩니다. 일부 키는 대시보드에 표시되는 데 최대 1시간이 걸릴 수 있습니다.