Firebase Crashlytics هي أداة خفيفة الوزن لإعداد تقارير الأعطال في الوقت الفعلي، وتسهّل عليك إدارة مشاكل الثبات في تطبيقك. توفّر عليك Crashlytics الوقت المستغرَق في تحديد المشاكل وحلّها من خلال تجميع الأعطال بذكاء وإبراز الظروف التي أدّت إلى حدوثها.
يوضّح هذا الدليل كيفية دمج Crashlytics في مشروع Xcode حتى تتمكّن من تسجيل أرقام تعريف استجابة الإعلان. في وقت لاحق، عند تحديد وحلّ المشاكل المتعلّقة بالأعطال في تطبيقك، يمكنك البحث عن رقم تعريف استجابة الإعلان واستخدام "مركز مراجعة الإعلانات" في مدير الإعلانات للعثور على الإعلانات وحظرها.
الخطوة 1: إضافة Firebase إلى تطبيق iOS
إذا أردت تجربة تسجيل الدخول باستخدام Firebase من تطبيق جديد، يمكنك تنزيل أو استنساخ أمثلة حزمة تطوير البرامج (SDK) الخاصة بـ "إعلانات Google على الأجهزة الجوّالة" لنظام التشغيل iOS من المستودع على GitHub. يستخدم هذا الدليل مثال البانر على وجه التحديد.
إذا كان لديك تطبيق، من المفترض أن تتمكّن من الانتقال إلى الخطوات الأخرى باستخدام معرّف حزمة تطبيقك. يمكن أيضًا تطبيق الخطوات نفسها على الأمثلة الأخرى في المستودع مع إجراء تعديلات بسيطة.
لاستخدام Firebase Crashlytics، عليك إنشاء مشروع على Firebase وإضافة تطبيقك إليه. أنشئ مشروعًا على Firebase، إذا لم يسبق لك ذلك. احرص على تسجيل تطبيقك في هذا الحساب.
في صفحة Crashlytics ضِمن وحدة تحكّم Firebase، انقر على إعداد Crashlytics.
في الشاشة التي تظهر، انقر على لا > إعداد تطبيق جديد على Firebase.
في ملف Podfile، أضِف حِزم Pods لخدمة "إحصاءات Google" وFirebase Crashlytics.
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' target 'AdManagerBannerExample' do use_frameworks! pod 'Google-Mobile-Ads-SDK' pod 'Firebase/Crashlytics' pod 'Firebase/Analytics' end
في "الوحدة الطرفية" أو موجه الأوامر، ثبِّت مجموعات Pods وحدثها:
pod install --repo-update
افتح ملف
AdManagerBannerExample.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، افتح إعدادات الإنشاء، ثم انقر على علامة التبويب مراحل الإنشاء. أضِف نص تشغيل Fabric:
نظِّف مجلد الإنشاء، ثم أنشئ تطبيقك وشغِّله. يمكنك الآن تسجيل الدخول إلى وحدة تحكّم 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(AdManagerRequest) 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 وانقر على الزر تشغيل ليتم تحميل سجلّ الأعطال إلى 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: AdManagerBannerView! override func viewDidLoad() { super.viewDidLoad() ... bannerView.delegate = self ... } /// Tells the delegate an ad request loaded an ad. func adViewDidReceiveAd(_ bannerView: AdManagerBannerView) { 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. يُرجى العِلم أنّ ظهور بعض المفاتيح في لوحة البيانات قد يستغرق مدة تصل إلى ساعة.