Firebase Crashlytics는 앱의 안정성 문제를 쉽게 관리할 수 있는 간단한 실시간 비정상 종료 보고 도구입니다. Crashlytics를 사용하면 비정상 종료를 지능적으로 분류하고 비정상 종료로 이어지는 상황을 식별하여 문제 해결 시간을 단축할 수 있습니다.
이 가이드에서는 Crashlytics를 Xcode 프로젝트에 통합하여 광고 응답 ID를 로깅하는 방법을 설명합니다. 나중에 앱의 비정상 종료 문제를 해결할 때 광고 응답 ID를 찾아 Ad Manager의 광고 심사 센터를 사용하여 광고를 찾고 차단할 수 있습니다.
1단계: iOS 애플리케이션에 Firebase 추가
클린 앱에서 Firebase로 로깅하려면 GitHub에서 iOS 저장소용 Google 모바일 광고 SDK 예를 다운로드하거나 클론하세요. 이 가이드에서는 배너 예를 사용합니다.
이미 앱이 있다면 앱의 번들 ID로 다른 단계를 진행할 수 있습니다. 저장소의 다른 예에도 동일한 단계를 약간 수정하여 적용할 수 있습니다.
Firebase Crashlytics를 사용하려면 Firebase 프로젝트를 만들어 프로젝트에 추가해야 합니다. Firebase 프로젝트를 아직 만들지 않았다면 만듭니다. 여기에 앱을 등록해야 합니다.
Firebase Console의 Crashlytics 페이지에서 Crashlytics 설정을 클릭합니다.
표시되는 화면에서 아니요 > 새 Firebase 앱 설정을 클릭합니다.
Podfile에서 Google 애널리틱스 및 Firebase Crashlytics용 포드(pod)를 추가합니다.
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
터미널 또는 명령 프롬프트에서 포드를 설치하고 업데이트합니다.
pod install --repo-update
Xcode의
AdManagerBannerExample.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시간이 걸릴 수 있습니다.