רישום של מזהה תגובה למודעה באמצעות 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. ב-Terminal או בשורת פקודה, מתקינים ומעדכנים את ה-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, פותחים את Build Settings ולוחצים על הכרטיסייה Build Phases. מוסיפים את סקריפט ההרצה של Fabric:

מנקים את תיקיית ה-build, יוצרים את האפליקציה ומריצים אותה. עכשיו אפשר להתחבר למסוף האינטרנט של 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, מוסיפים את השורות הבאות ל-method 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 ולוחצים על הלחצן Play כדי להעלות את יומן הקריסה ל-Crashlytics.

שלב 3: מתעדים ביומן את מזהה התגובה למודעה

אם אתם טוענים כמה מודעות ומציגים אותן בזמנים שונים, מומלץ לרשום כל מזהה של תגובה לבקשת מודעה במפתח נפרד. למשל, במדריך הזה מוצגת דוגמה שכוללת מודעת באנר אחת בלבד. לכן, אנחנו מתעדים את מזהה התגובה של המודעה כמפתח banner_ad_response_id בקטע הקוד הבא.

אפשר גם ליצור כמה צמדי מפתח/ערך מותאמים אישית ב-Firebase Crashlytics לאירועי מודעות ולסוגי מודעות שונים. מומלץ לעיין בהתראות לגבי מחזור החיים של בקשות להצגת מודעות לגבי:

מידע נוסף על רישום ביומן בהתאמה אישית זמין במאמר התאמה אישית של דוחות קריסה ב-Firebase Crashlytics.

Swift

מוסיפים את הקוד הבא לקובץ ViewController.swift. בעיקרון, היא משתמשת בפונקציה Crashlytics.setCustomValue() בפונקציית הקריאה החוזרת 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. חשוב לזכור שיכול להיות שיחלפו עד שעה עד שמפתחות מסוימים יופיעו במרכז הבקרה.