mcpField
S
sentry-cocoa-sdk

sentry-cocoa-sdk

github.com/getsentry开发2723.4k 次安装今天更新
代码仓库

关于 sentry-cocoa-sdk

面向 Apple 项目的 Sentry Cocoa SDK 配置技能,会扫描项目并引导安装与设置错误监控及性能观测功能。它根据平台、界面框架和现有依赖给出配置建议。

主要功能

  1. 01扫描 Apple 项目与现有 Sentry 配置
  2. 02识别平台及 SwiftUI 或 UIKit
  3. 03引导 SDK 安装和初始化
  4. 04配置错误监控与性能观测
  5. 05按需设置日志、指标和用户反馈

适用场景

  1. 01为 iOS 或 macOS 应用添加 Sentry
  2. 02检查现有项目并补全 Sentry 配置
  3. 03为应用选择适用的观测功能

安装

复制下面的命令,在终端中运行。

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

安装后在 Claude Code 中输入/sentry-cocoa-sdk确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
error-monitoring.md
logging.md
metrics.md
profiling.md
session-replay.md
tracing.md
user-feedback.md

详细介绍

所有技能 > SDK 设置 > Cocoa SDK

Sentry Cocoa SDK

一款主打简洁实用的向导,可扫描你的 Apple 项目并引导你完成 Sentry 的完整设置。

在以下情况下调用此技能

  • 用户要求在 Apple 应用中“添加 Sentry 到 iOS/macOS/tvOS”或“设置 Sentry”
  • 用户想在 Swift/ObjC 中使用错误监控、追踪、性能分析、会话回放或日志记录,或在 Swift 中使用指标
  • 用户提到 sentry-cocoa、SentrySDK 或 Apple/iOS Sentry SDK
  • 用户想监控崩溃、应用卡顿、看门狗终止或性能

**注意:**以下 SDK 版本和 API 以撰写本文时的 Sentry 文档为准(sentry-cocoa 9.15.0)。 实施前请务必对照 docs.sentry.io/platforms/apple/ 进行确认。


第 1 阶段:检测

在提出任何建议之前,运行以下命令了解项目:

# 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

需要留意的事项:

  • Package.swift 或 Podfile 中是否已有 sentry-cocoa?如果有,跳到第 2 阶段(配置功能)。
  • 使用 SwiftUI(@main App 结构体)还是 UIKit(AppDelegate)?这决定了初始化模式。
  • 使用哪些 Apple 平台?(这会影响可用功能——请参见平台支持矩阵。)
  • 是否已有日志库?(可启用结构化日志捕获。)
  • SwiftUI 追踪导入项/产品?SentrySwiftUI 仍然存在,但在 SDK 9.4.1+ 中已弃用;对于已发布的二进制产品,建议使用主 Sentry 模块。
  • 是否有配套后端?(这会触发第 4 阶段中关于分布式追踪的关联说明。)

第 2 阶段:建议

根据你的发现,提出具体建议。不要提出开放式问题,而应先给出方案:

推荐(核心覆盖):

  • 错误监控——始终启用;用于崩溃报告、应用卡顿、看门狗终止、NSError/Swift 错误
  • 追踪——应用始终启用;自动检测应用启动、网络、UIViewController、文件 I/O、Core Data
  • 性能分析——生产环境中的 iOS/macOS 应用;通过 configureProfiling 进行 UI 性能分析

可选(增强可观测性):

  • 会话回放——面向用户的 iOS 应用;在 iOS 26+ / Liquid Glass 构建中验证遮罩效果
  • 日志记录——需要结构化日志捕获时启用
  • 指标——需要聚合计数器、仪表或分布数据的 Swift 应用
  • 用户反馈——希望收集用户崩溃/错误反馈表单的应用

Cocoa 不支持:

  • 定时任务——仅适用于后端
  • AI 监控——仅适用于 JS/Python

建议逻辑:

功能建议启用的情况……
错误监控始终启用——不可或缺的基线功能
追踪应用始终启用——开箱即提供丰富的自动检测
性能分析对性能有要求的生产环境 iOS/macOS 应用(不适用于 tvOS/watchOS/visionOS)
会话回放面向用户的 iOS 应用;tvOS 可能可用,但不受官方支持
日志记录已使用 os.log / CocoaLumberjack,或需要结构化日志时
指标不应产生问题事件的聚合产品或健康信号;仅适用于 Swift,SDK 9.12+
用户反馈希望通过截图提供应用内错误报告的应用

建议:“我推荐错误监控 + 追踪 + 性能分析。要我也添加会话回放和日志记录吗?”


第 3 阶段:引导

安装

选项 1 — Sentry Wizard(推荐):

需要你亲自运行——该向导会打开浏览器进行登录,并需要 Agent 无法处理的交互式输入。请复制粘贴到终端中:

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

它会处理登录、组织/项目选择、身份验证令牌设置、SDK 安装、AppDelegate 更新,以及 dSYM/调试符号上传构建阶段。

完成后,请返回并跳转至验证。

如果用户跳过该向导,则使用选项 2(SPM/CocoaPods),并按下文进行手动设置。

**选项 2 — Swift Package Manager:**文件 → 添加软件包 → 输入:

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

或在 Package.swift 中:

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

SPM 产品——每个目标只能选择一个:

产品使用场景
Sentry推荐——静态框架,应用启动速度快;SDK 9.4.1+ 包含 SwiftUI API
Sentry-Dynamic动态框架替代方案
SentrySwiftUI用于 SwiftUI API 的旧版/已弃用再导出;仅在维护较旧设置时使用
Sentry-WithoutUIKitOrAppKitwatchOS、应用扩展、命令行工具(Swift < 6.1)
SentrySPM + NoUIFramework 特性不含 UIKit/AppKit 的源码构建,适用于命令行/无头目标(使用 Xcode UI 需要 SDK 9.7+ / Swift 6.1+ / Xcode 26.4+)

警告:Xcode 允许选择多个产品——只能选择一个。

如果从源码使用 SentrySPM,当前源码构建项目可能会导入 SentrySwift 而非 Sentry;请确认目标中的模块名称。已发布的二进制产品使用 import Sentry。

基于 Swift 6.1+ 特性的退出 UIKit/AppKit 依赖方式(需要 [email protected] 清单):

// 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")

这是 Swift 6.1+ 命令行/无头目标首选的退出依赖方式。它会从源码编译 SDK,因此该特性可以移除 UIKit/AppKit/SwiftUI 链接。对于 Swift < 6.1 的情况,请继续使用 Sentry-WithoutUIKitOrAppKit。

**注意:**从 Xcode 26.4+ 开始,可以在 Xcode UI 中查看软件包特性。在较旧的 Xcode 版本中,只要在 Package.swift 中声明特性,它们仍然有效,但不会显示在图形界面中。

选项 3 — CocoaPods(已弃用;建议使用 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 计划于 2026 年 6 月底停止发布 CocoaPods 版本;仅对现有 CocoaPods 项目使用此方式。

**已知问题(Xcode 14+):**出现 Sandbox rsync.samba 错误 → Target Settings → “Enable User Script Sandbox” → NO。

选项 4 — SentryObjC(适用于纯 Objective-C/C++ 项目):

对于无法启用 Clang 模块(例如 -fmodules=NO)的纯 Objective-C 或 Objective-C++ 项目,请使用 SentryObjC 封装 SDK。它提供与主 SDK 相同的功能,但使用纯 Objective-C 头文件,无需导入 Swift 模块。

SPM:

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

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

或者从发布页面下载 SentryObjC-Dynamic.xcframework.zip。

从常规 Sentry 迁移到 SentryObjC:

  • 将 #import <Sentry/Sentry.h> 改为 #import <SentryObjC/SentryObjC.h>
  • 将以 Sentry 开头的类型改名为 SentryObjC(例如,SentrySDK → SentryObjCSDK、SentryOptions → SentryObjCOptions)
  • 其他 API 均保持一致

大多数用户应使用标准的 Sentry 产品(选项 2)。只有在存在特定需求导致无法使用 Clang 模块时,才使用 SentryObjC。


快速入门 — 推荐初始化

完整的 iOS 应用配置,通过合理的默认值启用最常用的功能。在应用启动时,先于任何其他代码添加。

对于 macOS、watchOS、应用扩展或 NoUIFramework 构建,请省略该平台不可用的选项(sessionReplay、截图/视图层级、用户反馈界面、UIKit 跟踪,以及 tvOS/watchOS/visionOS 上的性能分析)。保留适用于检测到的目标且能够编译的核心 dsn、环境、错误监控、跟踪、日志和指标设置。

SwiftUI — 应用入口点:

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

警告:SDK 初始化必须在主线程上进行。


针对每项已商定的功能

逐项处理功能。为每项加载参考文件,按照其中的步骤操作,并在继续下一项之前进行验证:

功能参考文件在以下情况下加载……
错误监控${SKILL_ROOT}/references/error-monitoring.md始终(基线)
跟踪${SKILL_ROOT}/references/tracing.md应用启动、网络、UIViewController 性能
性能分析${SKILL_ROOT}/references/profiling.md对性能敏感的生产应用
会话回放${SKILL_ROOT}/references/session-replay.md面向用户的 iOS 应用;tvOS 仅在注明限制时使用
日志记录${SKILL_ROOT}/references/logging.md需要结构化日志捕获时
指标${SKILL_ROOT}/references/metrics.md聚合计数器、量表、分布
用户反馈${SKILL_ROOT}/references/user-feedback.md需要应用内错误报告时

针对每项功能:Read ${SKILL_ROOT}/references/<feature>.md,严格按照步骤操作,并验证其正常运行。


配置参考

关键 SentryOptions 字段
选项类型默认值用途
dsnString?nil为空时 SDK 会禁用;macOS 可读取 SENTRY_DSN,其他 Apple 平台必须显式设置
environmentString"production"例如:"production"
releaseNameString?根据 bundle 推导默认为 <bundle id>@<version>+<build>
debugBoolfalse输出详细的 SDK 日志 — 在生产环境中禁用
sendDefaultPiiBoolfalse包含 IP 地址和活跃集成提供的用户信息
enableCrashHandlerBooltrue崩溃报告总开关
enableAppHangTrackingBooltrue应用卡顿跟踪总开关
enableReportNonFullyBlockingAppHangsBooltrue在受支持的 UI 平台上报告非完全阻塞的卡顿
appHangTimeoutIntervalDouble2.0判定为卡顿前的秒数
enableWatchdogTerminationTrackingBooltrue跟踪看门狗终止(iOS、tvOS、Mac Catalyst)
attachScreenshotBoolfalse出错时截取屏幕截图
attachViewHierarchyBoolfalse出错时捕获视图层级
tracesSampleRateNSNumber?nil事务采样率(nil = 禁用跟踪);Swift 会自动装箱 Double 字面量(例如,1.0 → NSNumber)
tracesSamplerClosurenil按事务动态采样(优先于采样率)
enableAutoPerformanceTracingBooltrue自动插桩总开关
tracePropagationTargets[Any]所有请求接收分布式跟踪标头的字符串或 NSRegularExpression 值
enableCaptureFailedRequestsBooltrue自动将 HTTP 5xx 错误捕获为事件
enableNetworkBreadcrumbsBooltrue为发出的 HTTP 请求添加面包屑
add(inAppInclude:)Methodbundle 可执行文件添加视为“应用内”代码的模块前缀
maxBreadcrumbsInt100每个事件的面包屑数量上限
sampleRateFloat1.0错误事件采样率
beforeSendClosurenil用于修改或丢弃错误事件的钩子
onLastRunStatusDeterminedClosurenilSDK 确定上次启动的崩溃状态后调用
strictTraceContinuationBoolfalse拒绝来自其他组织的传入跟踪;验证 baggage 标头中的 sentry-org_id(sentry-cocoa ≥9.10.0)
orgIdString?nil用于严格跟踪验证的组织 ID;若未显式设置,则从 DSN 主机自动解析(例如,o123.ingest.sentry.io → "123")
enableLogsBoolfalse启用结构化日志
enableMetricsBooltrue启用 Swift Metrics API(SDK 9.12+)
环境变量
变量映射到用途
SENTRY_DSNdsn仅作为 macOS 回退值;在 iOS/tvOS/watchOS/visionOS 上显式设置
SENTRY_RELEASEreleaseName不要假定 Cocoa 会自动提供回退值;如有需要,请显式设置
SENTRY_ENVIRONMENTenvironment不要假定 Cocoa 会自动提供回退值;如有需要,请显式设置
平台功能支持矩阵
功能iOStvOSmacOSwatchOSvisionOS
崩溃报告是是是否是
应用卡顿是是是否是
看门狗终止是是否否是
应用启动跟踪是是否否是
UIViewController 跟踪是是否否是
SwiftUI 跟踪是是是否是
网络跟踪是是是否是
性能分析是否是否否
会话回放是非官方否否否
MetricKit是(15+)否是(12+)否否
Metrics API是是是请确认是
生产环境设置

降低生产环境中的采样率,以控制数据量和成本:

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

验证

测试 Sentry 是否正在接收事件:

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

几秒后检查 Sentry 控制面板。如果没有显示任何内容:

  1. 设置 options.debug = true——在 Xcode 控制台中输出 SDK 内部信息
  2. 确认 DSN 正确且项目存在
  3. 确保在主线程上初始化

第 4 阶段:交叉关联

完成 Apple 设置后,检查是否有配套后端尚未接入 Sentry:

# 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

如果检测到后端,请配置 tracePropagationTargets,以启用端到端分布式追踪,并推荐相应的技能:

检测到的后端推荐技能追踪标头支持
Go(go.mod)sentry-go-sdk自动
Python(requirements.txt)sentry-python-sdk自动
Ruby(Gemfile)sentry-ruby-sdk自动
Node.js 后端(package.json)sentry-node-sdk(或 sentry-express-sdk)自动

故障排除

问题解决方案
未显示事件设置 debug: true,确认 DSN 格式正确,并确保在主线程上初始化
未捕获崩溃在未连接调试器的情况下运行——调试器会拦截信号
未报告应用卡顿连接调试器时会自动禁用;检查 appHangTimeoutInterval
Session Replay 未录制确认 sessionSampleRate > 0 或 onErrorSampleRate > 0;在 iOS 26+ 上确认遮罩设置,以及是否有任何手动 Liquid Glass 门控
缺少追踪数据确认 tracesSampleRate > 0;检查 enableAutoPerformanceTracing = true
缺少性能分析数据确认在 configureProfiling 中设置了 sessionSampleRate > 0;对于 .trace 生命周期,必须启用追踪
rsync.samba 构建错误(CocoaPods)Target Settings → "Enable User Script Sandbox" → NO
选择了多个 SPM 产品只选择一个:Sentry、Sentry-Dynamic、SentrySwiftUI、Sentry-WithoutUIKitOrAppKit 或 SentrySPM(Swift 6.1+ 上需使用 NoUIFramework 特性)
inAppExclude 编译错误已在 SDK 9.0.0 中移除——改用 options.add(inAppInclude:)
enableAppHangTrackingV2 编译错误已在 SDK 9.0.0 中移除——改用 enableAppHangTracking;在支持的平台上默认采用 V2 行为
未追踪看门狗终止需要设置 enableCrashHandler = true(默认已启用)
缺少网络面包屑需要设置 enableSwizzling = true(默认已启用)
profilesSampleRate 编译错误已在 SDK 9.0.0 中移除——改用 configureProfiling 闭包

评论

支持 Markdown