sentry-cocoa-sdkpar sentry

Full Sentry SDK setup for Apple platforms (iOS, macOS, tvOS, watchOS, visionOS). Use when asked to "add Sentry to iOS", "add Sentry to Swift", "install…

npx skills add https://github.com/getsentry/sentry-for-claude --skill sentry-cocoa-sdk

All Skills > SDK Setup > Cocoa SDK

Sentry Cocoa SDK

Opinionated wizard that scans your Apple project and guides you through complete Sentry setup.

Invoke This Skill When

  • User asks to "add Sentry to iOS/macOS/tvOS" or "set up Sentry" in an Apple app
  • User wants error monitoring, tracing, profiling, session replay, or logging in Swift/ObjC, or metrics in Swift
  • User mentions sentry-cocoa, SentrySDK, or the Apple/iOS Sentry SDK
  • User wants to monitor crashes, app hangs, watchdog terminations, or performance

Note: SDK versions and APIs below reflect Sentry docs at time of writing (sentry-cocoa 9.15.0). Always verify against docs.sentry.io/platforms/apple/ before implementing.


Phase 1: Detect

Run these commands to understand the project before making any recommendations:

# Check existing Sentry dependency
grep -rEi "sentry|sentry-cocoa|SentrySPM|SentrySwiftUI" \
  --include="Package.swift" --include="Podfile" --include="Cartfile" \
  --include="Package.resolved" --include="project.pbxproj" . 2>/dev/null | head -20

# Detect UI framework (SwiftUI vs UIKit)
grep -rE "@main|struct .*: App" --include="*.swift" . 2>/dev/null | head -5
grep -rE "AppDelegate|UIApplicationMain|@UIApplicationDelegateAdaptor" --include="*.swift" . 2>/dev/null | head -5

# Detect platform and deployment targets
grep -rE "platforms:|\\.iOS|\\.macOS|\\.tvOS|\\.watchOS|\\.visionOS|IPHONEOS_DEPLOYMENT_TARGET|MACOSX_DEPLOYMENT_TARGET|TVOS_DEPLOYMENT_TARGET|WATCHOS_DEPLOYMENT_TARGET|XROS_DEPLOYMENT_TARGET" \
  --include="Package.swift" --include="project.pbxproj" . 2>/dev/null | head -20
grep -E "platform :ios|platform :osx|platform :tvos|platform :watchos" Podfile 2>/dev/null

# Detect logging
grep -rE "import OSLog|import os\\.log|Logger\\(|CocoaLumberjack|DDLog" --include="*.swift" . 2>/dev/null | head -5

# Detect companion backend
ls ../backend ../server ../api 2>/dev/null
ls ../go.mod ../requirements.txt ../Gemfile ../package.json 2>/dev/null

What to note:

  • Is sentry-cocoa already in Package.swift or Podfile? If yes, skip to Phase 2 (configure features).
  • SwiftUI (@main App struct) or UIKit (AppDelegate)? Determines init pattern.
  • Which Apple platforms? (Affects which features are available — see Platform Support Matrix.)
  • Existing logging library? (Enables structured log capture.)
  • SwiftUI tracing import/product? SentrySwiftUI still exists but is deprecated in SDK 9.4.1+; prefer the main Sentry module for released binary products.
  • Companion backend? (Triggers Phase 4 cross-link for distributed tracing.)

Phase 2: Recommend

Based on what you found, present a concrete recommendation. Don't ask open-ended questions — lead with a proposal:

Recommended (core coverage):

  • Error Monitoring — always; crash reporting, app hangs, watchdog terminations, NSError/Swift errors
  • Tracing — always for apps; auto-instruments app launch, network, UIViewController, file I/O, Core Data
  • Profiling — production iOS/macOS apps; UI profiling via configureProfiling

Optional (enhanced observability):

  • Session Replay — user-facing iOS apps; verify masking on iOS 26+ / Liquid Glass builds
  • Logging — when structured log capture is needed
  • Metrics — Swift apps needing aggregate counters, gauges, or distributions
  • User Feedback — apps that want crash/error feedback forms from users

Not available for Cocoa:

  • Crons — backend only
  • AI Monitoring — JS/Python only

Recommendation logic:

FeatureRecommend when...
Error MonitoringAlways — non-negotiable baseline
TracingAlways for apps — rich auto-instrumentation out of the box
ProfilingiOS/macOS production apps where performance matters (not tvOS/watchOS/visionOS)
Session ReplayUser-facing iOS apps; tvOS may work but is not officially supported
LoggingExisting os.log / CocoaLumberjack usage, or structured logs needed
MetricsAggregate product or health signals that should not create issues; Swift only, SDK 9.12+
User FeedbackApps wanting in-app bug reports with screenshots

Propose: "I recommend Error Monitoring + Tracing + Profiling. Want me to also add Session Replay and Logging?"


Phase 3: Guide

Install

Option 1 — Sentry Wizard (recommended):

You need to run this yourself — the wizard opens a browser for login and requires interactive input that the agent can't handle. Copy-paste into your terminal:

brew install getsentry/tools/sentry-wizard && sentry-wizard -i ios

It handles login, org/project selection, auth token setup, SDK installation, AppDelegate updates, and dSYM/debug symbol upload build phases.

Once it finishes, come back and skip to Verification.

If the user skips the wizard, proceed with Option 2 (SPM/CocoaPods) and manual setup below.

Option 2 — Swift Package Manager: File → Add Packages → enter:

https://github.com/getsentry/sentry-cocoa.git

Or in Package.swift:

.package(url: "https://github.com/getsentry/sentry-cocoa", from: "9.15.0"),

SPM Products — choose exactly one per target:

ProductUse Case
SentryRecommended — static framework, fast app start; includes SwiftUI APIs in SDK 9.4.1+
Sentry-DynamicDynamic framework alternative
SentrySwiftUILegacy/deprecated re-export for SwiftUI APIs; use only when maintaining older setup
Sentry-WithoutUIKitOrAppKitwatchOS, app extensions, CLI tools (Swift < 6.1)
SentrySPM + NoUIFramework traitSource build without UIKit/AppKit for CLI/headless targets (SDK 9.7+ / Swift 6.1+ / Xcode 26.4+ for Xcode UI)

Warning: Xcode allows selecting multiple products — choose only one.

If using SentrySPM from source, current source-build projects may import SentrySwift instead of Sentry; verify the module name in the target. Released binary products use import Sentry.

Swift 6.1+ trait-based opt-out of UIKit/AppKit (requires [email protected] manifest):

// Package.swift (Swift 6.1+)
.package(
    url: "https://github.com/getsentry/sentry-cocoa",
    from: "9.15.0",
    traits: ["NoUIFramework"]
),

// In your target's dependencies:
.product(name: "SentrySPM", package: "sentry-cocoa")

This is the preferred opt-out path for command-line/headless targets on Swift 6.1+. It compiles the SDK from source so the trait can remove UIKit/AppKit/SwiftUI linkage. For Swift < 6.1 continue using Sentry-WithoutUIKitOrAppKit.

Note: Package traits are visible in the Xcode UI starting with Xcode 26.4+. On older Xcode versions, traits still work when declared in Package.swift but won't appear in the GUI.

Option 3 — CocoaPods (deprecated; prefer SPM):

platform :ios, '15.0'
use_frameworks!

target 'YourApp' do
  pod 'Sentry', :git => 'https://github.com/getsentry/sentry-cocoa.git', :tag => '9.15.0'
end

Sentry plans to stop publishing CocoaPods releases at the end of June 2026; use this only for existing CocoaPods projects.

Known issue (Xcode 14+): Sandbox rsync.samba error → Target Settings → "Enable User Script Sandbox" → NO.


Quick Start — Recommended Init

Full iOS app config enabling the most common features with sensible defaults. Add before any other code at app startup.

For macOS, watchOS, app extensions, or NoUIFramework builds, omit options that are unavailable for that platform (sessionReplay, screenshots/view hierarchy, user-feedback UI, UIKit tracing, and profiling on tvOS/watchOS/visionOS). Keep the core dsn, environment, error monitoring, tracing, logs, and metrics settings that compile for the detected target.

SwiftUI — App entry point:

import SwiftUI
import Sentry

@main
struct MyApp: App {
    init() {
        SentrySDK.start { options in
            options.dsn = ProcessInfo.processInfo.environment["SENTRY_DSN"]
                ?? "https://[email protected]/0"
            options.environment = ProcessInfo.processInfo.environment["SENTRY_ENVIRONMENT"]
                ?? "production"
            // releaseName defaults to "<bundle id>@<version>+<build>"; set only if you need a custom release.

            // Error monitoring (on by default — explicit for clarity)
            options.enableCrashHandler = true
            options.enableAppHangTracking = true
            options.enableReportNonFullyBlockingAppHangs = true
            options.enableWatchdogTerminationTracking = true
            options.attachScreenshot = true
            options.attachViewHierarchy = true
            options.sendDefaultPii = true

            // Tracing
            options.tracesSampleRate = 1.0          // lower to 0.2 in high-traffic production

            // Profiling (SDK 9.0.0+ API)
            options.configureProfiling = {
                $0.sessionSampleRate = 1.0
                $0.lifecycle = .trace
            }

            // Session Replay. Keep production sampling conservative and verify masking on iOS 26+.
            options.sessionReplay.sessionSampleRate = 0.1
            options.sessionReplay.onErrorSampleRate = 1.0

            // Logging (SDK 9.0.0+ top-level; use options.experimental.enableLogs in 8.x)
            options.enableLogs = true

            // Metrics are enabled by default in SDK 9.12+. Set false only to opt out.
            options.enableMetrics = true
        }
    }

    var body: some Scene {
        WindowGroup { ContentView() }
    }
}

UIKit — AppDelegate:

import UIKit
import Sentry

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        SentrySDK.start { options in
            options.dsn = ProcessInfo.processInfo.environment["SENTRY_DSN"]
                ?? "https://[email protected]/0"
            options.environment = ProcessInfo.processInfo.environment["SENTRY_ENVIRONMENT"]
                ?? "production"
            // releaseName defaults to "<bundle id>@<version>+<build>"; set only if you need a custom release.

            options.enableCrashHandler = true
            options.enableAppHangTracking = true
            options.enableReportNonFullyBlockingAppHangs = true
            options.enableWatchdogTerminationTracking = true
            options.attachScreenshot = true
            options.attachViewHierarchy = true
            options.sendDefaultPii = true

            options.tracesSampleRate = 1.0

            options.configureProfiling = {
                $0.sessionSampleRate = 1.0
                $0.lifecycle = .trace
            }

            options.sessionReplay.sessionSampleRate = 0.1
            options.sessionReplay.onErrorSampleRate = 1.0

            // Logging (SDK 9.0.0+ top-level; use options.experimental.enableLogs in 8.x)
            options.enableLogs = true

            // Metrics are enabled by default in SDK 9.12+. Set false only to opt out.
            options.enableMetrics = true
        }
        return true
    }
}

Warning: SDK initialization must occur on the main thread.


For Each Agreed Feature

Walk through features one at a time. Load the reference file for each, follow its steps, and verify before moving to the next:

FeatureReference fileLoad when...
Error Monitoring${SKILL_ROOT}/references/error-monitoring.mdAlways (baseline)
Tracing${SKILL_ROOT}/references/tracing.mdApp launch, network, UIViewController perf
Profiling${SKILL_ROOT}/references/profiling.mdProduction perf-sensitive apps
Session Replay${SKILL_ROOT}/references/session-replay.mdUser-facing iOS apps; tvOS only with caveat
Logging${SKILL_ROOT}/references/logging.mdStructured log capture needed
Metrics${SKILL_ROOT}/references/metrics.mdAggregate counters, gauges, distributions
User Feedback${SKILL_ROOT}/references/user-feedback.mdIn-app bug reporting wanted

For each feature: Read ${SKILL_ROOT}/references/<feature>.md, follow steps exactly, verify it works.


Configuration Reference

Key SentryOptions Fields

OptionTypeDefaultPurpose
dsnString?nilSDK disabled if empty; macOS can read SENTRY_DSN, other Apple platforms must set explicitly
environmentString"production"e.g., "production"
releaseNameString?bundle-derivedDefaults to <bundle id>@<version>+<build>
debugBoolfalseVerbose SDK output — disable in production
sendDefaultPiiBoolfalseInclude IP, user info from active integrations
enableCrashHandlerBooltrueMaster switch for crash reporting
enableAppHangTrackingBooltrueMaster switch for app hang tracking
enableReportNonFullyBlockingAppHangsBooltrueReport non-fully-blocking hangs on supported UI platforms
appHangTimeoutIntervalDouble2.0Seconds before classifying as hang
enableWatchdogTerminationTrackingBooltrueTrack watchdog kills (iOS, tvOS, Mac Catalyst)
attachScreenshotBoolfalseCapture screenshot on error
attachViewHierarchyBoolfalseCapture view hierarchy on error
tracesSampleRateNSNumber?nilTransaction sample rate (nil = tracing disabled); Swift auto-boxes Double literals (e.g. 1.0NSNumber)
tracesSamplerClosurenilDynamic per-transaction sampling (overrides rate)
enableAutoPerformanceTracingBooltrueMaster switch for auto-instrumentation
tracePropagationTargets[Any]all requestsStrings or NSRegularExpression values that receive distributed trace headers
enableCaptureFailedRequestsBooltrueAuto-capture HTTP 5xx errors as events
enableNetworkBreadcrumbsBooltrueBreadcrumbs for outgoing HTTP requests
add(inAppInclude:)Methodbundle executableAdd module prefixes treated as "in-app" code
maxBreadcrumbsInt100Max breadcrumbs per event
sampleRateFloat1.0Error event sample rate
beforeSendClosurenilHook to mutate/drop error events
onLastRunStatusDeterminedClosurenilCalled after SDK determines previous launch crash status
strictTraceContinuationBoolfalseReject incoming traces from other orgs; validates sentry-org_id in baggage headers (sentry-cocoa ≥9.10.0)
orgIdString?nilOrganization ID for strict trace validation; auto-parsed from DSN host (e.g. o123.ingest.sentry.io"123") if not set explicitly
enableLogsBoolfalseEnable structured logs
enableMetricsBooltrueEnable Swift Metrics API (SDK 9.12+)

Environment Variables

VariableMaps toPurpose
SENTRY_DSNdsnmacOS fallback only; set explicitly on iOS/tvOS/watchOS/visionOS
SENTRY_RELEASEreleaseNameDo not assume automatic Cocoa fallback; set explicitly if needed
SENTRY_ENVIRONMENTenvironmentDo not assume automatic Cocoa fallback; set explicitly if needed

Platform Feature Support Matrix

FeatureiOStvOSmacOSwatchOSvisionOS
Crash ReportingYesYesYesNoYes
App HangsYesYesYesNoYes
Watchdog TerminationYesYesNoNoYes
App Start TracingYesYesNoNoYes
UIViewController TracingYesYesNoNoYes
SwiftUI TracingYesYesYesNoYes
Network TrackingYesYesYesNoYes
ProfilingYesNoYesNoNo
Session ReplayYesUnofficialNoNoNo
MetricKitYes (15+)NoYes (12+)NoNo
Metrics APIYesYesYesVerifyYes

Verification

Test that Sentry is receiving events:

// Trigger a test error event:
SentrySDK.capture(message: "Sentry Cocoa SDK test")

// Or test crash reporting (without debugger — crashes are intercepted by debugger):
// SentrySDK.crash()  // uncomment, run without debugger, relaunch to see crash report

Check the Sentry dashboard within a few seconds. If nothing appears:

  1. Set options.debug = true — prints SDK internals to Xcode console
  2. Verify the DSN is correct and the project exists
  3. Ensure initialization is on the main thread

Production Settings

Lower sample rates for production to control volume and cost:

options.tracesSampleRate = 0.2          // 20% of transactions

options.configureProfiling = {
    $0.sessionSampleRate = 0.1          // 10% of sessions
    $0.lifecycle = .trace
}

options.sessionReplay.sessionSampleRate = 0.1   // 10% continuous
options.sessionReplay.onErrorSampleRate = 1.0   // 100% on error (keep high)

options.enableLogs = true
options.enableMetrics = true             // default true in SDK 9.12+
options.debug = false                   // never in production

Phase 4: Cross-Link

After completing Apple setup, check for a companion backend missing Sentry coverage:

# Detect companion backend
ls ../backend ../server ../api 2>/dev/null
cat ../go.mod 2>/dev/null | head -5
cat ../requirements.txt ../Pipfile 2>/dev/null | head -5
cat ../Gemfile 2>/dev/null | head -5
cat ../package.json 2>/dev/null | grep -E '"name"|"dependencies"' | head -5

If a backend is found, configure tracePropagationTargets to enable distributed tracing end-to-end, and suggest the matching skill:

Backend detectedSuggest skillTrace header support
Go (go.mod)sentry-go-sdkAutomatic
Python (requirements.txt)sentry-python-sdkAutomatic
Ruby (Gemfile)sentry-ruby-sdkAutomatic
Node.js backend (package.json)sentry-node-sdk (or sentry-express-sdk)Automatic

Troubleshooting

IssueSolution
Events not appearingSet debug: true, verify DSN format, ensure init is on main thread
Crashes not capturedRun without debugger attached — debugger intercepts signals
App hangs not reportedAuto-disabled when debugger attached; check appHangTimeoutInterval
Session Replay not recordingVerify sessionSampleRate > 0 or onErrorSampleRate > 0; on iOS 26+ verify masking and any manual Liquid Glass gating
Tracing data missingConfirm tracesSampleRate > 0; check enableAutoPerformanceTracing = true
Profiling data missingVerify sessionSampleRate > 0 in configureProfiling; for .trace lifecycle, tracing must be enabled
rsync.samba build error (CocoaPods)Target Settings → "Enable User Script Sandbox" → NO
Multiple SPM products selectedChoose only one of Sentry, Sentry-Dynamic, SentrySwiftUI, Sentry-WithoutUIKitOrAppKit, or SentrySPM (with NoUIFramework trait on Swift 6.1+)
inAppExclude compile errorRemoved in SDK 9.0.0 — use options.add(inAppInclude:)
enableAppHangTrackingV2 compile errorRemoved in SDK 9.0.0 — use enableAppHangTracking; V2 behavior is default where supported
Watchdog termination not trackedRequires enableCrashHandler = true (it is by default)
Network breadcrumbs missingRequires enableSwizzling = true (it is by default)
profilesSampleRate compile errorRemoved in SDK 9.0.0 — use configureProfiling closure instead

Plus de skills de sentry