Firebase Crashlytics는 앱의 안정성 문제를 쉽게 관리할 수 있는 간단한 실시간 비정상 종료 보고 도구입니다. Crashlytics를 사용하면 비정상 종료를 지능적으로 분류하고 비정상 종료로 이어지는 상황을 식별하여 문제 해결 시간을 단축할 수 있습니다.
이 가이드에서는 Crashlytics를 Xcode 프로젝트에 통합하여 광고 응답 ID를 로깅하는 방법을 설명합니다. 나중에 앱의 비정상 종료 문제를 해결할 때 광고 응답 ID를 찾아 AdMob의 광고 심사 센터를 사용하여 광고를 찾고 차단할 수 있습니다.
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 'BannerExample' do use_frameworks! pod 'Google-Mobile-Ads-SDK' pod 'Firebase/Crashlytics' pod 'Firebase/Analytics' end
터미널 또는 명령 프롬프트에서 포드를 설치하고 업데이트합니다.
pod install --repo-update
Xcode의
BannerExample.xcworkspace
파일을 열어 프로젝트를 로드합니다.
2단계: 앱에 Firebase 구성
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 } }
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 대시보드에 커스텀 로그를 전송합니다.
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") }
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 비정상 종료 보고서 맞춤설정을 참고하세요.
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") } } }
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시간이 걸릴 수 있습니다.