ابرووا
شروع رایگان
☰ فهرست مستندات · SDK آی‌اواس

iOS SDK

SDK نیتیو Swift برای iOS، macOS و tvOS با تشخیص کرش، تشخیص ANR، ردیابی URLSession و مانیتورینگ عملکرد.

iOS 0.2.4iOS 12+macOS 10.14+Swift 5.10به‌روزرسانی: ۵ آبان ۱۴۰۵
SDK نیتیو Swift

با Swift ساخته شده و از iOS 12 به بالا، macOS 10.14 به بالا و tvOS 12 به بالا پشتیبانی می‌کند (tvOS فقط از طریق Swift Package Manager)

تشخیص خودکار کرش

exceptionهای مدیریت‌نشده، و همچنین کرش‌های سیگنال نیتیو (SIGSEGV، SIGABRT و …) و Mach exceptionها را با PLCrashReporter می‌گیرد

تشخیص ANR

رویدادهای «برنامه پاسخ نمی‌دهد» (مسدود شدن main thread) را تشخیص می‌دهد

Breadcrumb و ناوبری

مسیر کاربر را پیش از وقوع خطا ثبت می‌کند

ردیابی HTTP

ساخت خودکار spanهای عملکرد و breadcrumbهای HTTP

پیام‌های دلخواه

ارسال پیام با سطح debug، info، warning و error

مانیتورینگ عملکرد

ردیابی تأخیر API با URLSession و Alamofire

اطلاعات کامل دستگاه

جمع‌آوری خودکار اطلاعات دستگاه، سیستم‌عامل و برنامه

نصب#

Swift Package Manager (پیشنهادی)

در Xcode از منوی File → Add Packages آدرس Abrova Center را وارد کنید:

text
https://center.abrova.ir/abrova/abrova-trace-ios-sdk.git

نسخه‌ی 0.2.4 یا بالاتر را انتخاب کنید.

یا آن را به Package.swift اضافه کنید:

swift
dependencies: [
    .package(url: "https://center.abrova.ir/abrova/abrova-trace-ios-sdk.git", from: "0.2.4")
]

CocoaPods

این خط را به Podfile اضافه کنید:

ruby
pod 'AbrovaTrace', :git => 'https://center.abrova.ir/abrova/abrova-trace-ios-sdk.git', :tag => '0.2.4'

سپس اجرا کنید:

bash
pod install
Abrova Center و GitHub.

نسخه‌ها از Abrova Center نصب می‌شوند که داخل ایران کار می‌کند. کد منبع روی GitHub است (Abrova-co/abrova-trace-ios-sdk) با همان tagهای نسخه؛ پس هرجا GitHub در دسترس باشد https://github.com/Abrova-co/abrova-trace-ios-sdk.git هم کار می‌کند.

شروع سریع#

راه‌اندازی در UIKit

ابرووا تریس را در AppDelegate راه‌اندازی کنید:

swift
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

swift
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

swift
do {
    try riskyOperation()
} catch {
    AbrovaTrace.shared.captureError(error)
}

برای مقادیر Error در Swift از captureError(_:) و برای NSException از captureException(_:) استفاده کنید.

ثبت همراه با context

swift
AbrovaTrace.shared.captureError(
    error,
    message: "Failed to load user profile",
    extra: ["user_id": userId, "screen": "ProfileView"],
    tags: ["feature": "user_profile"]
)

ثبت پیام‌ها

swift
// 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 ذخیره می‌شود. پیام را برای چیزهایی به کار ببرید که برنامه عمداً گزارش می‌دهد («پرداخت شروع شد»، «همگام‌سازی تمام شد»)؛ برای عیب‌یابی پرحجم از لاگ‌ها استفاده کنید.

swift
// 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 اضافه می‌شود:

swift
// 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

swift
// 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)
  1. هنگام راه‌اندازی، ابرووا تریس handlerهای async-signal-safe مربوط به PLCrashReporter را نصب می‌کند
  2. وقتی برنامه کرش می‌کند، یک گزارش کرش روی دیسک، داخل sandbox برنامه، نوشته می‌شود
  3. در اجرای بعدی، initialize گزارش در انتظار را می‌خواند و آن را در پس‌زمینه به ابرووا تریس می‌فرستد؛ بنابراین اجرای برنامه هیچ‌وقت منتظر شبکه نمی‌ماند. گزارش فقط پس از تحویل موفق حذف می‌شود؛ اگر سرور یا شبکه خطا بدهد، نگه داشته می‌شود و در اجرای بعدی فرستاده می‌شود. به نسخه‌ی 0.2.3 یا جدیدتر نیاز دارد.
مهم.

کرش‌های نیتیو در اجرای بعدی گزارش می‌شوند، پس فقط وقتی می‌رسند که کاربر دوباره برنامه را باز کند. SDK با دریافت اعلان will-terminate برنامه، خودش AbrovaTrace.shared.close() را صدا می‌زند؛ صدا زدن آن توسط شما اختیاری است و لاگ‌های بافرشده را می‌فرستد.

مانیتورینگ عملکرد (APM)#

تأخیر API و عملکرد درخواست‌های HTTP را ردیابی کنید.

ردیابی خودکار HTTP با URLSession

swift
// 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

swift
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
}

ردیابی عملیات دلخواه

swift
// 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

swift
// 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) و تلاش مجدد خودکار. یک بار فعالش کنید و سپس از هر جای برنامه از متدهای سطح‌ها استفاده کنید:

swift
// Enable logging after initialization
AbrovaTrace.shared.enableLogging(sourceId: "my-ios-app")

AbrovaTrace.shared.info("User login successful", metadata: ["user_id": "user_123"])

برای جزئیات کامل این مسیر (دسته‌بندی، سطح‌های لاگ، مدیریت چرخه‌ی عمر، ارسال دستی و تنظیمات) صفحه‌ی لاگ‌ها در iOS SDK را ببینید.

گزینه‌های تنظیمات#

گزینهنوعاجباریتوضیح
apiKeyStringبلهکلید API پروژه (باید با ab_live_ شروع شود)
environmentStringخیرنام محیط (پیش‌فرض: "production")
releaseString?خیرشناسه‌ی نسخه‌ی برنامه (پیش‌فرض: CFBundleShortVersionString)
debugBoolخیرفعال کردن لاگ‌های debug (پیش‌فرض: false)
enabledBoolخیرفعال/غیرفعال کردن SDK (پیش‌فرض: true)
sampleRateDoubleخیرنرخ نمونه‌برداری ثبت خطا، ۰٫۰ تا ۱٫۰ (پیش‌فرض: 1.0)
maxBreadcrumbsIntخیرحداکثر تعداد breadcrumbهای نگه‌داشته‌شده (پیش‌فرض: 20)
httpTimeoutTimeIntervalخیرمهلت درخواست HTTP به ثانیه (پیش‌فرض: 30)
enableOfflineStorageBoolخیرخطاهایی را که به دلیل آفلاین بودن دستگاه فرستاده نشده‌اند روی دیسک نگه می‌دارد (تا ۱۰۰ مورد، با حذف قدیمی‌ترین‌ها) و در اجرای بعدی یا به محض ارسال موفق خطای دیگری می‌فرستد. فقط خطاها: پیام‌ها، لاگ‌ها و داده‌های عملکرد ذخیره نمی‌شوند. با false چیزی روی دیسک نمی‌ماند (پیش‌فرض: true)
captureUncaughtExceptionsBoolخیرگرفتن exceptionهای مدیریت‌نشده (پیش‌فرض: true)
captureSignalCrashesBoolخیرتشخیص کرش‌های سیگنال (پیش‌فرض: true)
captureAnrBoolخیرتشخیص هنگ کردن main thread (پیش‌فرض: true)
anrTimeoutMsInt64خیرمهلت تشخیص ANR به میلی‌ثانیه (پیش‌فرض: 5000)
apiUrlStringخیرآدرس پایه‌ی API، برای نصب self-hosted (پیش‌فرض: "https://trace.abrova.ir")

آپلود نمادهای debug (dSYM)#

برای دیدن نام فایل‌ها و شماره‌ی خط‌ها در stack traceهای iOS، فایل‌های dSYM برنامه را آپلود کنید. هر build فایل‌های dSYM مخصوص خودش را می‌سازد؛ برای هر نسخه‌ی release یک dSYM جدید آپلود کنید.

۱. فایل‌های dSYM را پیدا کنید

پس از build برنامه در Xcode، فایل‌های dSYM در خروجی‌های build قرار دارند:

bash
# 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 کنید

bash
# 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) که به‌طور خودکار در همه‌ی رویدادها ادغام می‌شوند:

swift
// 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()

تگ‌ها

تگ‌ها جفت‌های کلید/مقدار فقط رشته‌ای برای دسته‌بندی رویدادها هستند:

swift
AbrovaTrace.shared.setTag("team", value: "payments")
AbrovaTrace.shared.setTag("region", value: "us-east")

AbrovaTrace.shared.setTags(["team": "payments", "version": "2.1"])

AbrovaTrace.shared.clearTags()
تفاوت تگ و extra.

از تگ‌ها برای فیلترهای دسته‌ای با تنوع کم (تیم، منطقه، build flavor) استفاده کنید. از extraها برای context غنی‌تر هر رویداد (شناسه‌ی کاربر، بدنه‌ی درخواست، مقادیر محاسبه‌شده).

یکپارچگی با SwiftUI#

SDK بدون مشکل با نقطه‌ی ورود @main در SwiftUI کار می‌کند. آن را در init() مربوط به struct App راه‌اندازی کنید تا خطاها از همان لحظه‌ی ساخته شدن سلسله‌مراتب viewها ثبت شوند:

swift
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؟

در برنامه‌های 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 تصادفی

نمونه‌ی کامل#

swift
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 { /* ... */ }
}

توصیه‌ها#

راه‌اندازی در AppDelegate یا init برنامه

ابرووا تریس را هرچه زودتر راه‌اندازی کنید تا همه‌ی خطاها از لحظه‌ی شروع برنامه گرفته شوند

close() هنگام بسته شدن برنامه

SDK با اعلان will-terminate خودش close() را صدا می‌زند تا لاگ‌ها فرستاده شوند؛ فقط برای مسیرهای خاموش شدن سفارشی خودتان صدایش بزنید

فعال کردن ردیابی HTTP

برای breadcrumbهای خودکار HTTP و مانیتورینگ عملکرد، enablePerformanceTracking() را صدا بزنید

افزودن context به خطاها

شناسه‌ی کاربر، نام صفحه و داده‌های مرتبط را در پارامتر extra بگذارید

استفاده از محیط‌های جدا

خطاهای production، staging و development را با تنظیم environment از هم جدا کنید

فعال کردن حالت debug در توسعه

در زمان توسعه debug: true را تنظیم کنید تا لاگ‌های SDK را ببینید و درستی یکپارچگی را بررسی کنید

فعال کردن زودهنگام لاگ‌ها

enableLogging() را بلافاصله بعد از راه‌اندازی صدا بزنید تا همه‌ی رویدادهای برنامه ثبت شوند

این صفحه مفید بود؟
گزارش مشکل