רישום של מזהה תגובה למודעה באמצעות 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, לוחצים על Set up Crashlytics (הגדרת Crashlytics).

    2. במסך שמופיע, לוחצים על No > Set up a new Firebase app (הגדרה של אפליקציית 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) ולוחצים על הכרטיסייה Build Phases. מוסיפים את הסקריפט להרצת Fabric:

מנקים את תיקיית ה-build, ואז בונים ומפעילים את האפליקציה. עכשיו אפשר להתחבר למסוף האינטרנט של Firebase ולגשת למרכז הבקרה של Crashlytics.

(אופציונלי): בדיקת ההגדרה

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

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. שימו לב: ייתכן שיחלפו עד שעה לפני שחלק מהמפתחות יופיעו בלוח הבקרה.