Firebase vs Supabase
منصة Google الشاملة للموبايل Firebase تواجه Supabase، البديل مفتوح المصدر القائم على PostgreSQL. عند اختيار خدمة الخلفية الجاهزة (Backend-as-a-Service)، ما الأنسب؟
SDK مجانية وخفيفة من Google لتتبع الأعطال (crash)
تتبع الأخطاء + الأداء + إعادة تشغيل الجلسة في منصة واحدة، قابلة للاستضافة الذاتية
قاعدة واضحة: إذا كنت تبحث فقط عن إجابة سؤال "متى تعطّل التطبيق" وميزانيتك صفر، فـ Crashlytics هو الخيار — يستغرق إعداده دقائق ولا يحمل خطر فاتورة مفاجئة. أما إذا أردت الأخطاء والأداء وإعادة تشغيل الجلسة (session replay) في لوحة واحدة، أو كنت بحاجة إلى إبقاء البيانات في بنيتك التحتية الخاصة بموجب GDPR، فنطاق Sentry يبرر هذه التكلفة. تستخدم فرق كثيرة الأداتين معًا؛ إن اخترت هذا المسار، قِس أثر وجود SDK مزدوج على حجم التطبيق ووقت الإقلاع في بنائك (build) الخاص.
| الفئة | Firebase Crashlytics | Sentry |
|---|---|---|
| الأداء | 7/10 | 9/10 |
| سهولة التعلّم | 9/10 | 6/10 |
| النظام البيئي | 6/10 | 9/10 |
| المجتمع | 8/10 | 8/10 |
| سوق العمل | 6/10 | 7/10 |
| الاستدامة المستقبلية | 7/10 | 8/10 |
// Firebase Crashlytics - Android (Kotlin): الإعداد وتسجيل الأخطاء غير القاتلة (non-fatal)
// build.gradle.kts (app)
// plugins { id("com.google.gms.google-services"); id("com.google.firebase.crashlytics") }
// dependencies { implementation(platform("com.google.firebase:firebase-bom:34.19.0"))
// implementation("com.google.firebase:firebase-crashlytics") }
import com.google.firebase.Firebase
import com.google.firebase.crashlytics.crashlytics
import com.google.firebase.crashlytics.setCustomKeys
class CheckoutViewModel {
private val crashlytics = Firebase.crashlytics
fun onPaymentStarted(orderId: String, amount: Double) {
// Breadcrumb: لمعرفة الخطوة التي حدث فيها العطل إن حدث
crashlytics.log("payment_started order=$orderId amount=$amount")
crashlytics.setCustomKeys {
key("order_id", orderId)
key("payment_amount", amount)
key("user_tier", "premium")
}
}
fun onPaymentFailed(error: Throwable, orderId: String) {
// تسجيل الخطأ دون تعطيل التطبيق (non-fatal)
crashlytics.setCustomKey("order_id", orderId)
crashlytics.recordException(error)
}
fun identifyUser(userId: String) {
crashlytics.setUserId(userId)
}
}
// AndroidManifest.xml: firebase_crashlytics_collection_enabled=false (فعّله بعد موافقة المستخدم)
// Runtime: Firebase.crashlytics.setCrashlyticsCollectionEnabled(true)// Sentry - iOS (Swift): الأخطاء + الأداء + إعادة تشغيل الجلسة في SDK واحدة
// Package.swift / SPM: https://github.com/getsentry/sentry-cocoa
import Sentry
func configureSentry() {
SentrySDK.start { options in
options.dsn = "https://<public-key>@o<org-id>.ingest.sentry.io/<project-id>"
options.debug = false
// تتبع الأداء (Performance tracing)
options.tracesSampleRate = 0.2
// UI Profiling (sentry-cocoa 9.x): مرتبط بدورة حياة التتبع (trace lifecycle)
options.configureProfiling = {
$0.lifecycle = .trace
$0.sessionSampleRate = 1.0
}
// Session Replay: يسجّل مسار الشاشة قبل حدوث العطل
options.sessionReplay.onErrorSampleRate = 1.0
options.sessionReplay.sessionSampleRate = 0.1
// لقطة شاشة + التسلسل الهرمي للعرض عند حدوث الخطأ
options.attachScreenshot = true
options.attachViewHierarchy = true
}
}
// Breadcrumb + سياق مخصص + التقاط الأخطاء غير القاتلة (non-fatal)
func onPaymentFailed(_ error: Error, orderId: String) {
let crumb = Breadcrumb(level: .error, category: "payment")
crumb.message = "payment_failed order=\(orderId)"
SentrySDK.addBreadcrumb(crumb)
SentrySDK.configureScope { scope in
scope.setTag(value: orderId, key: "order_id")
scope.setUser(User(userId: "u_123"))
}
SentrySDK.capture(error: error)
}
// رفع dSYM تلقائيًا (Xcode Run Script Build Phase):
// sentry-cli debug-files upload --include-sources "$DWARF_DSYM_FOLDER_PATH"قاعدة واضحة: إذا كنت تبحث فقط عن إجابة سؤال "متى تعطّل التطبيق" وميزانيتك صفر، فـ Crashlytics هو الخيار — يستغرق إعداده دقائق ولا يحمل خطر فاتورة مفاجئة. أما إذا أردت الأخطاء والأداء وإعادة تشغيل الجلسة (session replay) في لوحة واحدة، أو كنت بحاجة إلى إبقاء البيانات في بنيتك التحتية الخاصة بموجب GDPR، فنطاق Sentry يبرر هذه التكلفة. تستخدم فرق كثيرة الأداتين معًا؛ إن اخترت هذا المسار، قِس أثر وجود SDK مزدوج على حجم التطبيق ووقت الإقلاع في بنائك (build) الخاص.
احصل على استشارة مجانيةCrashlytics يكفي إن كان تتبع الأعطال وحده كافيًا والميزانية يجب أن تكون صفرًا؛ أما Sentry فهو الخيار الصحيح للفريق الذي يريد إلى جانب تتبع الأخطاء تتبع الأداء (tracing) وإعادة تشغيل الجلسة، والاستضافة الذاتية عند الحاجة. كلاهما يقدّم SDK سهلة الإعداد، والقرار يعود إلى سؤالي النطاق والميزانية.