Ghi nhật ký mã phản hồi quảng cáo bằng Firebase Crashlytics

Firebase Crashlytics là trình báo cáo sự cố theo thời gian thực và gọn nhẹ, giúp bạn dễ dàng quản lý các vấn đề về độ ổn định trong ứng dụng của mình. Crashlytics giúp bạn tiết kiệm thời gian khắc phục sự cố bằng cách nhóm các sự cố và làm nổi bật những tình huống dẫn đến các sự cố đó theo cách thông minh.

Hướng dẫn này mô tả cách tích hợp Crashlytics vào dự án Xcode để bạn có thể ghi nhật ký mã phản hồi quảng cáo. Sau này, khi khắc phục sự cố trong ứng dụng của mình, bạn có thể tra cứu mã phản hồi quảng cáo và dùng Trung tâm xem xét quảng cáo trong AdMob để tìm và chặn quảng cáo.

Bước 1: Thêm Firebase vào một ứng dụng iOS

  1. Nếu muốn thử ghi nhật ký bằng Firebase từ một ứng dụng sạch, bạn có thể tải hoặc sao chép các ví dụ về SDK Quảng cáo của Google trên thiết bị di động cho kho lưu trữ iOS trên GitHub. Cụ thể, hướng dẫn này sử dụng Ví dụ về quảng cáo biểu ngữ.

    Nếu đã có một ứng dụng, bạn sẽ có thể tiến hành các bước khác bằng mã nhận dạng gói của ứng dụng. Bạn cũng có thể áp dụng các bước tương tự cho các ví dụ khác trong kho lưu trữ chỉ với các điều chỉnh nhỏ.

  2. Để sử dụng Firebase Crashlytics, bạn phải tạo một dự án Firebase và thêm ứng dụng của bạn vào dự án đó. Tạo một dự án Firebase nếu bạn chưa tạo. Hãy nhớ đăng ký ứng dụng của bạn cho dự án đó.

    1. Trên trang Crashlytics trong bảng điều khiển của Firebase, hãy nhấp vào Thiết lập Crashlytics.

    2. Trên màn hình xuất hiện, hãy nhấp vào Không > Thiết lập ứng dụng Firebase mới.

  3. Trong Podfile, hãy thêm các Nhóm cho Google Analytics và 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. Trên Cửa sổ dòng lệnh hoặc lời nhắc lệnh, hãy cài đặt và cập nhật Nhóm của bạn:

    pod install --repo-update
    
  5. Mở tệp BannerExample.xcworkspace cho Xcode để tải dự án.

Bước 2: Định cấu hình Firebase cho ứng dụng của bạn

Swift

Trong AppDelegate.swift, hãy thêm các dòng sau:

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

Trong AppDelegate.m, hãy thêm các dòng sau:

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

Trong Xcode, hãy mở Build Settings (Cài đặt bản dựng), nhấp vào thẻ Build Phases (Giai đoạn tạo). Thêm tập lệnh chạy Fabric:

Xoá thư mục bản dựng của bạn, rồi tạo và chạy ứng dụng. Bây giờ, bạn có thể đăng nhập vào bảng điều khiển web của Firebase và truy cập vào trang tổng quan của Crashlytics.

(Không bắt buộc): Kiểm tra thông tin thiết lập của bạn

Bằng cách Thêm nút sự cố, bạn có thể buộc xảy ra sự cố để gây ra sự cố ứng dụng sau mỗi lần nhấn nút. Việc thiết lập thử nghiệm này sẽ kích hoạt mã ở Bước 3 để gửi nhật ký tuỳ chỉnh đến trang tổng quan Firebase Crashlytics.

Swift

Trong ViewController.swift, hãy thêm các dòng sau vào hàm 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)
    }

Sau đó, hãy thêm @IBAction này vào cuối phần khai báo lớp:

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

Objective-C

Trong ViewController.m, hãy thêm các dòng sau vào phương thức 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];
}

Sau đó, hãy thêm IBAction này vào cuối phần khai báo lớp:

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

Trong thanh công cụ Xcode, hãy nhấn vào nút Dừng, rồi khởi chạy lại ứng dụng thông qua trình mô phỏng. Sau khi tải ứng dụng, bạn có thể nhấp vào nút Sự cố. Quay lại Xcode và nhấp vào nút Phát để tải nhật ký sự cố lên Crashlytics.

Bước 3: Ghi nhật ký mã phản hồi quảng cáo

Nếu tải nhiều quảng cáo và hiển thị các quảng cáo đó vào các thời điểm khác nhau, bạn nên ghi nhật ký từng mã phản hồi quảng cáo bằng một khoá riêng. Ví dụ: hướng dẫn này sử dụng một ví dụ chỉ có một quảng cáo biểu ngữ. Do đó, chúng tôi ghi nhật ký mã phản hồi quảng cáo làm khoá banner_ad_response_id trong đoạn mã sau.

Bạn cũng có thể tạo nhiều cặp khoá/giá trị tuỳ chỉnh trong Firebase Crashlytics cho các loại quảng cáo và sự kiện quảng cáo khác nhau. Hãy tham khảo thông báo về vòng đời yêu cầu quảng cáo của

Hãy xem bài viết Tuỳ chỉnh báo cáo sự cố trong Firebase Crashlytics để biết thêm thông tin về cách ghi nhật ký tuỳ chỉnh.

Swift

Thêm mã sau vào ViewController.swift của bạn. Về cơ bản, hàm này sử dụng hàm Crashlytics.setCustomValue() trong hàm 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

Thêm mã sau vào ViewController.m. Về cơ bản, hàm này sử dụng hàm [FIRCrashlytics crashlytics] setCustomValue trong hàm 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

Xin chúc mừng! Bây giờ, bạn sẽ thấy adResponseId gần đây nhất trong mục khoá của các phiên hoạt động có sự cố trên trang tổng quan Crashlytics. Xin lưu ý rằng có thể mất tới 1 giờ thì một số khoá mới xuất hiện trên trang tổng quan của bạn.