ثبت شناسه پاسخ آگهی با Firebase Crashlytics

پلتفرم مورد نظر: اندروید، iOS و یونیتی

Firebase Crashlytics یک گزارشگر کرش سبک و بلادرنگ است که مدیریت مشکلات پایداری در برنامه شما را آسان می‌کند. Crashlytics با گروه‌بندی هوشمندانه کرش‌ها و برجسته کردن شرایطی که منجر به آنها می‌شود، در زمان عیب‌یابی شما صرفه‌جویی می‌کند.

این راهنما نحوه ادغام Crashlytics در پروژه Xcode شما را شرح می‌دهد تا بتوانید شناسه‌های پاسخ به تبلیغات را ثبت کنید. بعداً، وقتی در برنامه خود با مشکل خرابی مواجه شدید، می‌توانید شناسه پاسخ به تبلیغات را جستجو کرده و از مرکز بررسی تبلیغات در AdMob برای یافتن و مسدود کردن تبلیغات استفاده کنید.

مرحله 1: اضافه کردن Firebase به یک برنامه iOS

  1. اگر می‌خواهید از یک برنامه‌ی خالی، لاگ‌گیری با فایربیس را امتحان کنید، می‌توانید نمونه‌های SDK تبلیغات موبایلی گوگل را برای مخزن iOS در گیت‌هاب دانلود یا کلون کنید. این راهنما به‌طور خاص از مثال بنر استفاده می‌کند.

    اگر از قبل برنامه‌ای دارید، باید بتوانید با شناسه بسته برنامه خود به مراحل دیگر بروید. همین مراحل را می‌توان با کمی تغییر برای سایر مثال‌های موجود در مخزن نیز اعمال کرد.

  2. برای استفاده از Firebase Crashlytics، باید یک پروژه Firebase ایجاد کنید و برنامه خود را به آن اضافه کنید. اگر قبلاً این کار را نکرده‌اید، یک پروژه Firebase ایجاد کنید. حتماً برنامه خود را در آن ثبت کنید .

    1. در صفحه Crashlytics کنسول Firebase، روی Set up Crashlytics کلیک کنید.

    2. در صفحه‌ای که ظاهر می‌شود، روی خیر > تنظیم یک برنامه جدید Firebase کلیک کنید.

  3. در فایل Podfile، Podهای مربوط به 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. در ترمینال یا خط فرمان، پادها را نصب و به‌روزرسانی کنید:

    pod install --repo-update
    
  5. فایل BannerExample.xcworkspace را برای Xcode باز کنید تا پروژه بارگذاری شود.

مرحله 2: پیکربندی فایربیس برای برنامه شما

سویفت

در 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
  }
}

هدف-سی

در 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 را اضافه کنید:

پوشه ساخت خود را تمیز کنید؛ سپس، برنامه خود را بسازید و اجرا کنید. اکنون می‌توانید به کنسول وب Firebase وارد شوید و به داشبورد Crashlytics دسترسی پیدا کنید.

(اختیاری): تنظیمات خود را آزمایش کنید

با اضافه کردن یک دکمه‌ی کرش، می‌توانید با هر بار فشردن دکمه، باعث کرش شدن برنامه شوید. این تنظیمات آزمایشی، کد موجود در مرحله‌ی ۳ را برای ارسال گزارش‌های سفارشی به داشبوردهای Firebase Crashlytic فعال می‌کند.

سویفت

در فایل 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")
    }

هدف-سی

در 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، دکمه‌ی Stop را فشار دهید و سپس برنامه را از طریق شبیه‌ساز مجدداً اجرا کنید. پس از بارگذاری برنامه، می‌توانید روی دکمه‌ی Crash کلیک کنید. به Xcode برگردید و روی دکمه‌ی Play کلیک کنید تا گزارش خرابی در Crashlytics آپلود شود.

مرحله ۳: شناسه پاسخ تبلیغ را ثبت کنید

اگر چندین تبلیغ را بارگذاری می‌کنید و آنها را در زمان‌های مختلف نشان می‌دهید، ایده خوبی است که هر شناسه پاسخ تبلیغ را با یک کلید جداگانه ثبت کنید. برای مثال، این راهنما از مثالی استفاده می‌کند که فقط یک بنر تبلیغاتی دارد. از این رو، شناسه پاسخ تبلیغ را به عنوان کلید banner_ad_response_id در قطعه کد زیر ثبت می‌کنیم.

همچنین می‌توانید چندین جفت کلید/مقدار سفارشی در Firebase Crashlytics برای انواع مختلف تبلیغات و رویدادهای تبلیغاتی ایجاد کنید. برای اطلاع از چرخه عمر درخواست تبلیغات به بخش اعلان‌های درخواست تبلیغات مراجعه کنید.

برای اطلاعات بیشتر در مورد گزارش‌گیری سفارشی، به بخش گزارش‌های خرابی Firebase Crashlytics خود مراجعه کنید.

سویفت

کد زیر را به 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")
        }
    }
}

هدف-سی

کد زیر را به ViewController.m خود اضافه کنید. اساساً، این کد از تابع setCustomValue [FIRCrashlytics crashlytics] در تابع 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 خود مشاهده خواهید کرد. توجه داشته باشید که ممکن است برخی از کلیدها تا یک ساعت طول بکشد تا در داشبورد شما قابل مشاهده شوند.