Firebase Crashlytics เป็นเครื่องมือรายงานข้อขัดข้องแบบเรียลไทม์ที่มีน้ำหนักเบา ซึ่งช่วยให้คุณจัดการ ปัญหาด้านความเสถียรในแอปได้อย่างง่ายดาย Crashlytics ช่วยประหยัดเวลาในการแก้ปัญหาด้วยการจัดกลุ่มข้อขัดข้องอย่างชาญฉลาดและไฮไลต์สถานการณ์ที่นำไปสู่ ข้อขัดข้องเหล่านั้น
คู่มือนี้อธิบายวิธีผสานรวม Crashlytics เข้ากับโปรเจ็กต์ Xcode เพื่อให้คุณบันทึกรหัสการตอบกลับของโฆษณาได้ ต่อมาเมื่อแก้ปัญหาข้อขัดข้องในแอป คุณสามารถค้นหารหัสการตอบสนองโฆษณาและใช้ศูนย์ตรวจสอบโฆษณาใน Ad Manager เพื่อค้นหาและบล็อกโฆษณาได้
ขั้นตอนที่ 1: เพิ่ม Firebase ไปยังแอปพลิเคชัน iOS
หากต้องการลองบันทึกด้วย Firebase จากแอปที่สะอาด คุณสามารถ ดาวน์โหลดหรือโคลนตัวอย่าง SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google สำหรับ iOS ที่เก็บใน GitHub คู่มือนี้ใช้ตัวอย่างแบนเนอร์โดยเฉพาะ
หากมีแอปอยู่แล้ว คุณควรดำเนินการขั้นตอนอื่นๆ ต่อได้ ด้วยรหัสแพ็กเกจของแอป คุณยังใช้ขั้นตอนเดียวกันนี้กับตัวอย่างอื่นๆ ในที่เก็บได้ด้วยโดยปรับเปลี่ยนเล็กน้อย
หากต้องการใช้ Firebase Crashlytics คุณต้องสร้างโปรเจ็กต์ Firebase และ เพิ่มแอปของคุณลงในโปรเจ็กต์ สร้างโปรเจ็กต์ Firebase หากยังไม่ได้สร้าง อย่าลืมลงทะเบียนแอปกับบริการนี้
ในหน้า Crashlytics ของคอนโซล Firebase ให้คลิกตั้งค่า Crashlytics
ในหน้าจอที่ปรากฏ ให้คลิกไม่ใช่ > ตั้งค่าแอป Firebase ใหม่
ใน Podfile ให้เพิ่ม Pod สำหรับ Google Analytics และ 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
ในเทอร์มินัลหรือ Command Prompt ให้ติดตั้งและอัปเดต Pod ดังนี้
pod install --repo-update
เปิดไฟล์
AdManagerBannerExample.xcworkspace
เพื่อให้ Xcode โหลดโปรเจ็กต์
ขั้นตอนที่ 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 ให้เปิดการตั้งค่าบิลด์ แล้วคลิกแท็บระยะการบิลด์ เพิ่ม สคริปต์การเรียกใช้ Fabric ดังนี้
ล้างโฟลเดอร์บิลด์ จากนั้นสร้างและเรียกใช้แอป ตอนนี้คุณสามารถเข้าสู่ระบบคอนโซลเว็บของ Firebase และเข้าถึงแดชบอร์ด Crashlytics ได้แล้ว
(ไม่บังคับ): ทดสอบการตั้งค่า
การเพิ่มปุ่ม ข้อขัดข้อง จะช่วยให้คุณบังคับให้เกิดข้อขัดข้องเพื่อทำให้แอปขัดข้องได้ทุกครั้งที่กดปุ่ม การตั้งค่าการทดสอบนี้ จะทริกเกอร์โค้ดในขั้นตอนที่ 3 เพื่อส่งบันทึกที่กำหนดเองไปยังแดชบอร์ด Firebase Crashlytics
Swift
ใน ViewController.swift
ให้เพิ่มบรรทัดต่อไปนี้ลงในฟังก์ชัน
viewDidLoad()
override func viewDidLoad() { super.viewDidLoad() bannerView.delegate = self bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716" bannerView.rootViewController = self bannerView.load(AdManagerRequest) 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
method
‐ (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 ให้กดปุ่มหยุด แล้วเปิดแอปอีกครั้ง ผ่านโปรแกรมจำลอง หลังจากโหลดแอปแล้ว คุณจะคลิกปุ่มขัดข้อง ได้ กลับไปที่ Xcode แล้วคลิกปุ่มเล่นเพื่อให้ระบบอัปโหลดบันทึกข้อขัดข้องไปยัง Crashlytics
ขั้นตอนที่ 3: บันทึกรหัสการตอบกลับโฆษณา
หากคุณโหลดโฆษณาหลายรายการและแสดงโฆษณาเหล่านั้นในเวลาที่ต่างกัน คุณควร
บันทึกรหัสการตอบกลับของโฆษณาแต่ละรายการด้วยคีย์แยกต่างหาก เช่น คู่มือนี้ใช้ตัวอย่างที่มีโฆษณาแบนเนอร์เพียงรายการเดียว ดังนั้นเราจึงบันทึกรหัสการตอบกลับของโฆษณาเป็นคีย์
banner_ad_response_id
ในข้อมูลโค้ดต่อไปนี้
นอกจากนี้ คุณยังสร้างคู่คีย์ / ค่าที่กำหนดเองหลายคู่ใน Firebase Crashlytics สำหรับโฆษณาและเหตุการณ์โฆษณาประเภทต่างๆ ได้ด้วย ดูการแจ้งเตือนวงจรคำขอโฆษณา สำหรับ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการบันทึกที่กำหนดเองได้ที่ปรับแต่งรายงานข้อขัดข้องของ Firebase Crashlytics
Swift
เพิ่มโค้ดต่อไปนี้ลงใน ViewController.swift
โดยพื้นฐานแล้ว ฟังก์ชันนี้จะใช้ฟังก์ชัน
Crashlytics.setCustomValue()
ในฟังก์ชันเรียกกลับ adViewDidReceiveAd
import GoogleMobileAds import UIKit class ViewController: UIViewController, BannerViewDelegate { /// The banner view. @IBOutlet weak var bannerView: AdManagerBannerView! override func viewDidLoad() { super.viewDidLoad() ... bannerView.delegate = self ... } /// Tells the delegate an ad request loaded an ad. func adViewDidReceiveAd(_ bannerView: AdManagerBannerView) { 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
โดยพื้นฐานแล้ว ฟังก์ชันนี้จะใช้
[FIRCrashlytics crashlytics]
setCustomValue
ในฟังก์ชัน 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
ยินดีด้วย ตอนนี้คุณจะเห็น adResponseId
ล่าสุดในส่วนคีย์
ของเซสชันข้อขัดข้องในแดชบอร์ด Crashlytics โปรดทราบว่าคีย์บางรายการอาจใช้เวลาถึง 1 ชั่วโมงจึงจะปรากฏในแดชบอร์ด