iOS SDK
SDK نیتیو Swift برای iOS، macOS و tvOS با تشخیص کرش، تشخیص ANR، ردیابی URLSession و مانیتورینگ عملکرد.
با Swift ساخته شده و از iOS 12 به بالا، macOS 10.14 به بالا و tvOS 12 به بالا پشتیبانی میکند (tvOS فقط از طریق Swift Package Manager)
exceptionهای مدیریتنشده، و همچنین کرشهای سیگنال نیتیو (SIGSEGV، SIGABRT و …) و Mach exceptionها را با PLCrashReporter میگیرد
رویدادهای «برنامه پاسخ نمیدهد» (مسدود شدن main thread) را تشخیص میدهد
مسیر کاربر را پیش از وقوع خطا ثبت میکند
ساخت خودکار spanهای عملکرد و breadcrumbهای HTTP
ارسال پیام با سطح debug، info، warning و error
ردیابی تأخیر API با URLSession و Alamofire
جمعآوری خودکار اطلاعات دستگاه، سیستمعامل و برنامه
نصب#
Swift Package Manager (پیشنهادی)
در Xcode از منوی File → Add Packages آدرس Abrova Center را وارد کنید:
https://center.abrova.ir/abrova/abrova-trace-ios-sdk.git
نسخهی 0.2.4 یا بالاتر را انتخاب کنید.
یا آن را به Package.swift اضافه کنید:
dependencies: [
.package(url: "https://center.abrova.ir/abrova/abrova-trace-ios-sdk.git", from: "0.2.4")
]CocoaPods
این خط را به Podfile اضافه کنید:
pod 'AbrovaTrace', :git => 'https://center.abrova.ir/abrova/abrova-trace-ios-sdk.git', :tag => '0.2.4'
سپس اجرا کنید:
pod install
نسخهها از Abrova Center نصب میشوند که داخل ایران کار میکند. کد منبع روی GitHub است (Abrova-co/abrova-trace-ios-sdk) با همان tagهای نسخه؛ پس هرجا GitHub در دسترس باشد https://github.com/Abrova-co/abrova-trace-ios-sdk.git هم کار میکند.
شروع سریع#
راهاندازی در UIKit
ابرووا تریس را در AppDelegate راهاندازی کنید:
import UIKit
import AbrovaTrace
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let config = AbrovaTraceConfigBuilder(apiKey: "ab_live_YOUR_API_KEY")
.environment("production")
.release(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String)
.debug(false)
.captureUncaughtExceptions(true)
.captureSignalCrashes(true)
.captureAnr(true)
.anrTimeoutMs(5000)
.build()
AbrovaTrace.shared.initialize(config: config)
return true
}
func applicationWillTerminate(_ application: UIApplication) {
AbrovaTrace.shared.close() // Optional: the SDK also does this on terminate
}
}راهاندازی در SwiftUI
import SwiftUI
import AbrovaTrace
@main
struct MyApp: App {
init() {
let config = AbrovaTraceConfigBuilder(apiKey: "ab_live_YOUR_API_KEY")
.environment("production")
.release(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String)
.debug(false)
.captureUncaughtExceptions(true)
.captureSignalCrashes(true)
.build()
AbrovaTrace.shared.initialize(config: config)
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}ثبت خطاها#
ثبت خطاهای Swift
do {
try riskyOperation()
} catch {
AbrovaTrace.shared.captureError(error)
}برای مقادیر Error در Swift از captureError(_:) و برای NSException از captureException(_:) استفاده کنید.
ثبت همراه با context
AbrovaTrace.shared.captureError(
error,
message: "Failed to load user profile",
extra: ["user_id": userId, "screen": "ProfileView"],
tags: ["feature": "user_profile"]
)ثبت پیامها
// Info message
AbrovaTrace.shared.captureMessage("User completed onboarding", level: .info)
// Warning message
AbrovaTrace.shared.captureMessage("API rate limit approaching", level: .warning)
// Error message with extra data
AbrovaTrace.shared.captureMessage(
"Payment failed",
level: .error,
extra: ["amount": 99.99]
)پیامها در کنسول، در بخش ابرووا تریس › پیامها، همراه با سطح، پلتفرم، دادههای تکمیلی و breadcrumbها نمایش داده میشوند. پیام هیچوقت مشکل (issue) نمیسازد. سطحها: .debug، .info (پیشفرض)، .warning و .error. سطح .fatal هم پذیرفته میشود و با سطح error ذخیره میشود. پیام را برای چیزهایی به کار ببرید که برنامه عمداً گزارش میدهد («پرداخت شروع شد»، «همگامسازی تمام شد»)؛ برای عیبیابی پرحجم از لاگها استفاده کنید.
Breadcrumbها#
// User action
AbrovaTrace.shared.addUserBreadcrumb("Added item to cart", data: ["product_id": "abc"])
// Navigation
AbrovaTrace.shared.addNavigationBreadcrumb(from: "HomeView", to: "ProductDetailView")
// HTTP request
AbrovaTrace.shared.addHttpBreadcrumb(
method: "POST",
url: "https://api.example.com/orders",
statusCode: 201,
duration: 0.342 // seconds (TimeInterval)
)
// Custom breadcrumb
AbrovaTrace.shared.addBreadcrumb("Order placed", type: .info, data: [
"order_id": "12345",
"total": 99.99
])ردیابی خودکار HTTP#
ردیابی سراسری HTTP
ردیابی خودکار درخواستهای URLSession را فعال کنید. هر درخواست بهصورت یک span عملکرد گزارش میشود و بهعنوان breadcrumb از نوع HTTP اضافه میشود:
// Registers AbrovaTraceURLProtocol globally (URLSession.shared and default-configured sessions) AbrovaTrace.shared.enablePerformanceTracking() // Requests are now tracked automatically let (data, response) = try await URLSession.shared.data(from: url)
ردیابی بر اساس session
// Create a tracked URLSession
let config = AbrovaTrace.shared.performanceSessionConfiguration()
// Equivalent to:
// config.protocolClasses = [AbrovaTraceURLProtocol.self] + (config.protocolClasses ?? [])
let session = URLSession(configuration: config)
// Requests through this session are tracked
let task = session.dataTask(with: url) { data, response, error in
// Handle response
}
task.resume()spanهای عملکردی که enablePerformanceTracking() میسازد آدرس کامل درخواست را، همراه با query string، ثبت میکنند؛ پس اطلاعات محرمانه را در URL نگذارید یا آن hostها را با setPerformanceExcludedHosts(_:) مستثنا کنید. متد جداگانهی AbrovaTraceHttpBreadcrumbProtocol.enable() breadcrumbهای HTTP را با پنهان کردن پارامترهای حساس query (token، api_key، apikey، key، secret، password، pwd، auth، authorization، access_token، refresh_token، session) اضافه میکند و پاسخهای 5xx و درخواستهای ناموفق را بهصورت پیام گزارش میدهد.
تشخیص کرش#
ابرووا تریس کرشها را با یک نسخهی تعبیهشده از PLCrashReporter ثبت میکند:
- NSExceptionهای مدیریتنشده: بلافاصله و پیش از بسته شدن برنامه فرستاده میشوند (
captureUncaughtExceptions) - رویدادهای ANR: مسدود ماندن main thread بیش از
anrTimeoutMs(captureAnr) - کرشهای نیتیو: سیگنالهای POSIX (SIGSEGV، SIGABRT، SIGBUS، SIGILL، SIGFPE، SIGTRAP) و Mach exceptionها (
captureSignalCrashes)
- هنگام راهاندازی، ابرووا تریس handlerهای async-signal-safe مربوط به PLCrashReporter را نصب میکند
- وقتی برنامه کرش میکند، یک گزارش کرش روی دیسک، داخل sandbox برنامه، نوشته میشود
- در اجرای بعدی،
initializeگزارش در انتظار را میخواند و آن را در پسزمینه به ابرووا تریس میفرستد؛ بنابراین اجرای برنامه هیچوقت منتظر شبکه نمیماند. گزارش فقط پس از تحویل موفق حذف میشود؛ اگر سرور یا شبکه خطا بدهد، نگه داشته میشود و در اجرای بعدی فرستاده میشود. به نسخهی 0.2.3 یا جدیدتر نیاز دارد.
کرشهای نیتیو در اجرای بعدی گزارش میشوند، پس فقط وقتی میرسند که کاربر دوباره برنامه را باز کند. SDK با دریافت اعلان will-terminate برنامه، خودش AbrovaTrace.shared.close() را صدا میزند؛ صدا زدن آن توسط شما اختیاری است و لاگهای بافرشده را میفرستد.
مانیتورینگ عملکرد (APM)#
تأخیر API و عملکرد درخواستهای HTTP را ردیابی کنید.
ردیابی خودکار HTTP با URLSession
// Enable performance tracking globally AbrovaTrace.shared.enablePerformanceTracking() // All URLSession requests are now tracked with timing data let (data, response) = try await URLSession.shared.data(from: url) // Method, URL, status code, and duration are automatically reported
استفاده با Alamofire
import Alamofire
// Create a session with AbrovaTrace tracking
let configuration = URLSessionConfiguration.default
configuration.protocolClasses = [AbrovaTraceURLProtocol.self] + (configuration.protocolClasses ?? [])
let session = Session(configuration: configuration)
// All requests through this session are tracked
session.request("https://api.example.com/users").response { response in
// Handle response
}ردیابی عملیات دلخواه
// Async (iOS 13+); use PerformanceTracker.track(_:) for synchronous work
let result = try await PerformanceTracker.trackAsync("load_user_profile") {
let user = try await fetchUser()
try await cacheUser(user)
return user
}
// Or time it manually
let tracker = PerformanceTracker(operation: "image_processing")
// ... do work
tracker.finish(status: .ok)گزارش دستی span
// HTTP request span
AbrovaTrace.shared.reportPerformanceSpan(
PerformanceSpan.fromHttpRequest(
method: "GET",
url: "https://api.example.com/products",
statusCode: 200,
durationMs: 245,
startTime: Date().addingTimeInterval(-0.245)
)
)
// Database query span
AbrovaTrace.shared.reportPerformanceSpan(
PerformanceSpan.forDbQuery(
queryType: "SELECT",
tableName: "products",
durationMs: 15,
startTime: Date().addingTimeInterval(-0.015),
rowsAffected: 50
)
)
// Custom operation span
AbrovaTrace.shared.reportPerformanceSpan(
PerformanceSpan.custom(
operation: "image_processing",
durationMs: 1250,
startTime: Date().addingTimeInterval(-1.25),
tags: ["format": "png"]
)
)لاگها#
ارسال لاگ ساختیافته با دستهبندی (batching) و تلاش مجدد خودکار. یک بار فعالش کنید و سپس از هر جای برنامه از متدهای سطحها استفاده کنید:
// Enable logging after initialization
AbrovaTrace.shared.enableLogging(sourceId: "my-ios-app")
AbrovaTrace.shared.info("User login successful", metadata: ["user_id": "user_123"])برای جزئیات کامل این مسیر (دستهبندی، سطحهای لاگ، مدیریت چرخهی عمر، ارسال دستی و تنظیمات) صفحهی لاگها در iOS SDK را ببینید.
گزینههای تنظیمات#
| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| apiKey | String | بله | کلید API پروژه (باید با ab_live_ شروع شود) |
| environment | String | خیر | نام محیط (پیشفرض: "production") |
| release | String? | خیر | شناسهی نسخهی برنامه (پیشفرض: CFBundleShortVersionString) |
| debug | Bool | خیر | فعال کردن لاگهای debug (پیشفرض: false) |
| enabled | Bool | خیر | فعال/غیرفعال کردن SDK (پیشفرض: true) |
| sampleRate | Double | خیر | نرخ نمونهبرداری ثبت خطا، ۰٫۰ تا ۱٫۰ (پیشفرض: 1.0) |
| maxBreadcrumbs | Int | خیر | حداکثر تعداد breadcrumbهای نگهداشتهشده (پیشفرض: 20) |
| httpTimeout | TimeInterval | خیر | مهلت درخواست HTTP به ثانیه (پیشفرض: 30) |
| enableOfflineStorage | Bool | خیر | خطاهایی را که به دلیل آفلاین بودن دستگاه فرستاده نشدهاند روی دیسک نگه میدارد (تا ۱۰۰ مورد، با حذف قدیمیترینها) و در اجرای بعدی یا به محض ارسال موفق خطای دیگری میفرستد. فقط خطاها: پیامها، لاگها و دادههای عملکرد ذخیره نمیشوند. با false چیزی روی دیسک نمیماند (پیشفرض: true) |
| captureUncaughtExceptions | Bool | خیر | گرفتن exceptionهای مدیریتنشده (پیشفرض: true) |
| captureSignalCrashes | Bool | خیر | تشخیص کرشهای سیگنال (پیشفرض: true) |
| captureAnr | Bool | خیر | تشخیص هنگ کردن main thread (پیشفرض: true) |
| anrTimeoutMs | Int64 | خیر | مهلت تشخیص ANR به میلیثانیه (پیشفرض: 5000) |
| apiUrl | String | خیر | آدرس پایهی API، برای نصب self-hosted (پیشفرض: "https://trace.abrova.ir") |
آپلود نمادهای debug (dSYM)#
برای دیدن نام فایلها و شمارهی خطها در stack traceهای iOS، فایلهای dSYM برنامه را آپلود کنید. هر build فایلهای dSYM مخصوص خودش را میسازد؛ برای هر نسخهی release یک dSYM جدید آپلود کنید.
۱. فایلهای dSYM را پیدا کنید
پس از build برنامه در Xcode، فایلهای dSYM در خروجیهای build قرار دارند:
# For debug builds (simulator) ~/Library/Developer/Xcode/DerivedData/YourApp-*/Build/Products/Debug-iphonesimulator/YourApp.app.dSYM # For release/archive builds ~/Library/Developer/Xcode/Archives/*.xcarchive/dSYMs/
۲. بستهی dSYM را zip کنید
# Zip the .dSYM bundle cd ~/Library/Developer/Xcode/DerivedData/YourApp-*/Build/Products/Debug-iphonesimulator/ zip -r YourApp.dSYM.zip YourApp.app.dSYM
۳. از طریق داشبورد آپلود کنید
در کنسول ابرووا به ابرووا تریس › Source maps بروید و تب iOS dSYMs را باز کنید. فایل zip را رها کنید، در صورت تمایل نسخهی release را وارد کنید و روی Upload کلیک کنید. آپلود به نقش member یا بالاتر نیاز دارد و حذف dSYMهای آپلودشده به نقش admin یا owner؛ صفحهی نقشها و دسترسیها را ببینید.
endpoint آپلود dSYM فقط نشست ورود به کنسول را میپذیرد (نه کلید API و نه personal access token)، و @abrova-trace/cli فقط source map آپلود میکند؛ بنابراین dSYMها را از کنسول آپلود کنید.
هر بار که برنامه را دوباره build میکنید، UUIDهای dSYM تغییر میکنند. اگر stack traceها نام توابع را نشان میدهند اما فایل و شمارهی خط ندارند، باید dSYM مربوط به همان build را آپلود کنید.
پلتفرمهای پشتیبانیشده#
- iOS: نسخهی 12.0 به بالا
- macOS: نسخهی 10.14 به بالا
- tvOS: نسخهی 12.0 به بالا (فقط Swift Package Manager؛ spec مربوط به CocoaPods فقط iOS و macOS را پوشش میدهد)
از watchOS پشتیبانی نمیشود. build کردن SDK به Swift 5.10 یا بالاتر (Xcode 15.3 به بالا) نیاز دارد.
Context و تگها#
متادیتای ثابت را به همهی خطاها و پیامهایی که SDK ثبت میکند پیوست کنید (گزارشهای کرش نیتیو و ANR، لاگها و spanهای عملکرد این اطلاعات را ندارند). این کار برای فیلتر کردن بر اساس تیم، منطقه، پرچم ویژگی یا گروه آزمایش در کنسول ابرووا مفید است.
extraهای سراسری
extraها جفتهای کلید/مقدار دلخواه هستند (کلید رشتهای، هر مقدار قابل serialize) که بهطور خودکار در همهی رویدادها ادغام میشوند:
// Set individual extras
AbrovaTrace.shared.setExtra("organizationId", value: "org-123")
AbrovaTrace.shared.setExtra("feature", value: "checkout-v2")
// Set multiple at once
AbrovaTrace.shared.setExtras([
"organizationId": "org-123",
"feature": "checkout-v2",
"experiment": "new-flow"
])
// Clear when no longer needed (e.g. on logout)
AbrovaTrace.shared.clearExtras()تگها
تگها جفتهای کلید/مقدار فقط رشتهای برای دستهبندی رویدادها هستند:
AbrovaTrace.shared.setTag("team", value: "payments")
AbrovaTrace.shared.setTag("region", value: "us-east")
AbrovaTrace.shared.setTags(["team": "payments", "version": "2.1"])
AbrovaTrace.shared.clearTags()از تگها برای فیلترهای دستهای با تنوع کم (تیم، منطقه، build flavor) استفاده کنید. از extraها برای context غنیتر هر رویداد (شناسهی کاربر، بدنهی درخواست، مقادیر محاسبهشده).
یکپارچگی با SwiftUI#
SDK بدون مشکل با نقطهی ورود @main در SwiftUI کار میکند. آن را در init() مربوط به struct App راهاندازی کنید تا خطاها از همان لحظهی ساخته شدن سلسلهمراتب viewها ثبت شوند:
import SwiftUI
import AbrovaTrace
@main
struct MyApp: App {
init() {
let config = AbrovaTraceConfigBuilder(apiKey: "ab_live_your_api_key")
.environment("production")
.build()
AbrovaTrace.shared.initialize(config: config)
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}در برنامههای UIKit، SDK را در application(_:didFinishLaunchingWithOptions:) داخل AppDelegate راهاندازی کنید؛ نمونهی کامل پایین صفحه را ببینید.
مرجع API#
فهرست کامل متدهای AbrovaTrace.shared و PerformanceSpan. selectorها به سبک Swift نوشته شدهاند و پارامترهای اختیاری در توضیح با ? مشخص شدهاند.
AbrovaTrace.shared: راهاندازی و چرخهی عمر
| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| initialize(config:) | - | - | راهاندازی SDK با یک AbrovaTraceConfig کامل |
| initialize(apiKey:) | - | - | راهاندازی SDK فقط با کلید API (با مقادیر پیشفرض) |
| isReady | - | - | پس از راهاندازی SDK برابر true است |
| close() | - | - | پاکسازی SDK و ارسال دادههای در انتظار |
ثبت خطا
| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| captureError(_:message:extra:tags:completion:) | - | - | ثبت یک Error در Swift |
| captureException(_:message:extra:tags:completion:) | - | - | ثبت یک NSException |
| captureMessage(_:level:extra:tags:completion:) | - | - | ارسال یک پیام به ابرووا تریس › پیامها (مشکل نمیسازد) |
کاربر و نشست
| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| setUserId(_:) | - | - | تنظیم شناسهی کاربر فعلی |
| getUserId() | - | - | دریافت شناسهی کاربر فعلی |
context سراسری (extraها)
| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| setExtra(_:value:) | - | - | تنظیم یک extra |
| setExtras(_:) | - | - | تنظیم چند extra بهصورت یکجا |
| clearExtras() | - | - | پاک کردن همهی extraها |
تگها
| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| setTag(_:value:) | - | - | تنظیم یک تگ |
| setTags(_:) | - | - | تنظیم چند تگ بهصورت یکجا |
| clearTags() | - | - | پاک کردن همهی تگها |
Breadcrumbها
| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| addBreadcrumb(_:type:data:) | - | - | افزودن یک breadcrumb عمومی |
| addNavigationBreadcrumb(from:to:) | - | - | افزودن یک breadcrumb ناوبری |
| addUserBreadcrumb(_:data:) | - | - | افزودن یک breadcrumb برای اقدام کاربر |
| addHttpBreadcrumb(method:url:statusCode:duration:) | - | - | افزودن یک breadcrumb برای HTTP |
| clearBreadcrumbs() | - | - | پاک کردن همهی breadcrumbها |
مانیتورینگ عملکرد
| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| reportPerformanceSpan(_:completion:) | - | - | گزارش یک PerformanceSpan ساختهشده |
| reportPerformanceSpanBatch(_:completion:) | - | - | گزارش چند span بهصورت یکجا |
| trackHttpRequest(request:response:startTime:error:) | - | - | ردیابی یک درخواست HTTP منفرد |
| enablePerformanceTracking() | - | - | روشن کردن ردیابی خودکار HTTP |
| disablePerformanceTracking() | - | - | خاموش کردن ردیابی خودکار HTTP |
| performanceSessionConfiguration(baseConfiguration:) | - | - | یک URLSessionConfiguration با ردیابی فعال برمیگرداند |
| setPerformanceExcludedHosts(_:) | - | - | مستثنا کردن hostها از ردیابی خودکار |
| setPerformanceMinDuration(_:) | - | - | تنظیم حداقل مدت span برای ثبت |
لاگها
| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| enableLogging(sourceId:sourceName:batchSize:flushInterval:) | - | - | روشن کردن مسیر ارسال لاگ |
| log(_:level:metadata:) | - | - | لاگ با سطح مشخص |
| trace(_:metadata:) | - | - | لاگ با سطح trace |
| logDebugMessage(_:metadata:) | - | - | لاگ با سطح debug |
| info(_:metadata:) | - | - | لاگ با سطح info |
| warn(_:metadata:) | - | - | لاگ با سطح warn |
| logErrorMessage(_:metadata:) | - | - | لاگ با سطح error |
| fatal(_:metadata:) | - | - | لاگ با سطح fatal |
| flushLogs(completion:) | - | - | ارسال فوری لاگهای بافرشده |
| pendingLogCount | - | - | تعداد لاگهایی که هنوز در بافر ماندهاند |
متدهای سازندهی PerformanceSpan
| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| PerformanceSpan.fromHttpRequest(...) | - | - | ساخت span از یک درخواست/پاسخ HTTP |
| PerformanceSpan.forDbQuery(...) | - | - | ساخت span برای یک کوئری پایگاه داده |
| PerformanceSpan.custom(...) | - | - | ساخت یک span کاملاً سفارشی |
| PerformanceSpan.generateTraceId() | - | - | تولید یک trace ID تصادفی |
| PerformanceSpan.generateSpanId() | - | - | تولید یک span ID تصادفی |
نمونهی کامل#
import UIKit
import AbrovaTrace
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let config = AbrovaTraceConfigBuilder(apiKey: "ab_live_YOUR_API_KEY")
.environment("production")
.release(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String)
.debug(false)
.captureUncaughtExceptions(true)
.captureSignalCrashes(true)
.captureAnr(true)
.build()
AbrovaTrace.shared.initialize(config: config)
AbrovaTrace.shared.enablePerformanceTracking()
return true
}
func applicationWillTerminate(_ application: UIApplication) {
AbrovaTrace.shared.close()
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
AbrovaTrace.shared.setUserId("user_123")
AbrovaTrace.shared.addNavigationBreadcrumb(from: "Launch", to: "HomeView")
}
func handlePurchase() {
AbrovaTrace.shared.addUserBreadcrumb("Initiated purchase", data: ["product": "Premium"])
do {
try processPurchase()
AbrovaTrace.shared.captureMessage("Purchase successful", level: .info, extra: [
"amount": 99.99
])
} catch {
AbrovaTrace.shared.captureError(
error,
message: "Purchase failed",
extra: ["user_id": "user_123", "screen": "HomeView"]
)
}
}
func processPurchase() throws { /* ... */ }
}توصیهها#
ابرووا تریس را هرچه زودتر راهاندازی کنید تا همهی خطاها از لحظهی شروع برنامه گرفته شوند
SDK با اعلان will-terminate خودش close() را صدا میزند تا لاگها فرستاده شوند؛ فقط برای مسیرهای خاموش شدن سفارشی خودتان صدایش بزنید
برای breadcrumbهای خودکار HTTP و مانیتورینگ عملکرد، enablePerformanceTracking() را صدا بزنید
شناسهی کاربر، نام صفحه و دادههای مرتبط را در پارامتر extra بگذارید
خطاهای production، staging و development را با تنظیم environment از هم جدا کنید
در زمان توسعه debug: true را تنظیم کنید تا لاگهای SDK را ببینید و درستی یکپارچگی را بررسی کنید
enableLogging() را بلافاصله بعد از راهاندازی صدا بزنید تا همهی رویدادهای برنامه ثبت شوند