การบันทึกรหัสการตอบกลับโฆษณาด้วย Firebase Crashlytics

Firebase Crashlytics เป็นเครื่องมือรายงานข้อขัดข้องแบบเรียลไทม์ที่มีน้ำหนักเบา ซึ่งช่วยให้คุณจัดการปัญหาความเสถียรในแอปได้อย่างง่ายดาย Crashlytics ช่วยประหยัดเวลาในการแก้ปัญหาด้วยการจัดกลุ่มข้อขัดข้องอย่างชาญฉลาดและไฮไลต์สถานการณ์ที่ทําให้เกิดข้อขัดข้อง

คู่มือนี้อธิบายวิธีผสานรวม Crashlytics เข้ากับโปรเจ็กต์ Xcode เพื่อให้คุณบันทึกรหัสการตอบกลับโฆษณาได้ ต่อมา เมื่อแก้ปัญหาข้อขัดข้องในแอป คุณสามารถค้นหารหัสการตอบสนองของโฆษณาและใช้ศูนย์ตรวจสอบโฆษณาในAdMobเพื่อค้นหาและบล็อกโฆษณา

ขั้นตอนที่ 1: เพิ่ม Firebase ลงในแอปพลิเคชัน iOS

  1. หากต้องการลองบันทึกด้วย Firebase จากแอปที่สะอาด คุณดาวน์โหลดหรือโคลนตัวอย่าง Google Mobile Ads SDK สําหรับ iOS จากที่เก็บใน GitHub ได้ คู่มือนี้ใช้ ตัวอย่างแบนเนอร์โดยเฉพาะ

    หากมีแอปอยู่แล้ว คุณควรทำตามขั้นตอนอื่นๆ ได้ด้วยรหัสชุดของแอป คุณใช้ขั้นตอนเดียวกันกับตัวอย่างอื่นๆ ในที่เก็บได้ด้วย โดยจะมีการปรับเปลี่ยนเล็กน้อย

  2. หากต้องการใช้ Firebase Crashlytics คุณต้องสร้างโปรเจ็กต์ Firebase แล้วเพิ่มแอปลงในโปรเจ็กต์ สร้างโปรเจ็กต์ Firebase หากยังไม่ได้สร้าง อย่าลืมลงทะเบียนแอปกับบริการนี้

    1. ในหน้า Crashlytics ของคอนโซล Firebase ให้คลิกตั้งค่า Crashlytics

    2. ในหน้าจอที่ปรากฏขึ้น ให้คลิกไม่ > ตั้งค่าแอป Firebase ใหม่

  3. ใน Podfile ให้เพิ่ม Pods สําหรับ Google Analytics และ Firebase Crashlytics

    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. ในเทอร์มินัลหรือ Command Prompt ให้ติดตั้งและอัปเดต Pods โดยทำดังนี้

    pod install --repo-update
    
  5. เปิดไฟล์ BannerExample.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 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 ให้กดปุ่มหยุด แล้วเปิดแอปอีกครั้งผ่านเครื่องจำลอง หลังจากโหลดแอปแล้ว คุณสามารถคลิกปุ่มข้อขัดข้องได้ กลับมาที่ Xcode แล้วคลิกปุ่ม Play เพื่ออัปโหลดบันทึกข้อขัดข้องไปยัง Crashlytics

ขั้นตอนที่ 3: บันทึกรหัสการตอบกลับโฆษณา

หากคุณโหลดโฆษณาหลายรายการและแสดงโฆษณาในเวลาที่ต่างกัน คุณควรบันทึกรหัสคำตอบของโฆษณาแต่ละรายการด้วยคีย์แยกต่างหาก เช่น คู่มือนี้ใช้ตัวอย่างที่มีโฆษณาแบนเนอร์เพียงรายการเดียว เราจึงบันทึกรหัสการตอบกลับของโฆษณาเป็นคีย์ banner_ad_response_id ในสนิปเพลตต่อไปนี้

นอกจากนี้ คุณยังสร้างคู่คีย์/ค่าที่กําหนดเองหลายคู่ใน Firebase Crashlytics ได้สําหรับโฆษณาประเภทต่างๆ และเหตุการณ์โฆษณา ดูการแจ้งเตือนเกี่ยวกับวงจรของคำขอโฆษณา

ดูข้อมูลเพิ่มเติมเกี่ยวกับการบันทึกที่กำหนดเองได้ที่ปรับแต่งรายงานข้อขัดข้องของ Firebase Crashlytics

Swift

เพิ่มโค้ดต่อไปนี้ลงใน ViewController.swift โดยพื้นฐานแล้ว จะใช้ฟังก์ชัน Crashlytics.setCustomValue() ในฟังก์ชัน 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

เพิ่มโค้ดต่อไปนี้ลงใน 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 ชั่วโมงจึงจะปรากฏในแดชบอร์ด