רישום ביומן של מזהה התגובה למודעה באמצעות Firebase Crashlytics

בחירת פלטפורמה: Android iOS Unity

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

במדריך הזה מוסבר איך לשלב את Crashlytics בפרויקט Xcode כדי שתוכלו לרשום מזהים של תגובות למודעות. בשלב מאוחר יותר, כשמנסים לפתור בעיות שגורמות לקריסה באפליקציה, אפשר לחפש את המזהה של התגובה לבקשת המודעה ולהשתמש במרכז בקרת המודעות ב-AdMob כדי למצוא ולחסום את המודעות.

שלב 1: הוספת Firebase לאפליקציית iOS

  1. אם רוצים לנסות רישום באמצעות Firebase מאפליקציה חדשה, אפשר להוריד או לשכפל את הדוגמאות של Google Mobile Ads SDK ל-iOS ממאגר ב-GitHub. במדריך הזה נעשה שימוש ספציפי בדוגמה של באנר.

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

  2. כדי להשתמש ב-Firebase Crashlytics, צריך ליצור פרויקט ב-Firebase ולהוסיף אליו את האפליקציה. אם עדיין לא עשיתם זאת, צרו פרויקט Firebase. חשוב לרשום את האפליקציה ב-Azure AD.

    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. בטרמינל או בשורת הפקודה, מתקינים ומעדכנים את ה-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 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(Request)
        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() בפונקציית הקריאה החוזרת adViewDidReceiveAd.

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, BannerViewDelegate {

    /// The banner view.
    @IBOutlet weak var bannerView: BannerView!

    override func viewDidLoad() {
       super.viewDidLoad()
       ...
       bannerView.delegate = self
       ...
    }

    /// Tells the delegate an ad request loaded an ad.
    func adViewDidReceiveAd(_ bannerView: BannerView) {
        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

מעולה! בקטע המרכזי של הפעלות קריסה במרכז הבקרה של Crashlytics, יוצג עכשיו adResponseId האחרון. שימו לב: יכול להיות שיעברו עד שעה עד שמקשים מסוימים יופיעו במרכז הבקרה.