美文网首页
iOS -- Sentry 集成 崩溃日志收集

iOS -- Sentry 集成 崩溃日志收集

作者: 一滴矿泉水 | 来源:发表于2021-08-03 20:16 被阅读0次

一、场景

每当抛出的错误或异常在您的应用程序中未被捕获导致应用程序崩溃时,Sentry 的 SDK 会自动报告错误。Sentry 的 iOS、tvOS 和 watchOS SDK 挂钩到除 MacOS 之外的所有信号和异常处理程序。
SDK 会构建一个崩溃报告,该报告会保留在磁盘中,并尝试在崩溃后立即发送报告。由于崩溃时环境可能不稳定,因此保证一旦应用程序再次启动就会发送报告。

二、安装

Sentry 使用应用程序运行时中的 SDK 捕获数据。
iOS 的最低版本是 9.0。
使用 CocoaPods 安装 SDK。要将 Sentry 集成到您的 Xcode 项目中,请在您的Podfile:

platform :ios, '9.0'
use_frameworks! # This is important
target 'YourApp' do
  pod 'Sentry', :git => 'https://github.com/getsentry/sentry-cocoa.git', :tag => '7.1.4'
end

然后运行pod install

三、配置

配置应该在应用程序的生命周期中尽早进行。
您还应该尽快初始化 SDK,例如在您的 AppDelegateapplication:didFinishLaunchingWithOptions方法中:

import Sentry // Make sure you import Sentry
// ....
func application(_ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) ->     Bool {
   SentrySDK.start { options in
        options.dsn = "https://examplePublicKey@o0.ingest.sentry.io/0"
        options.debug = true // Enabled debug when first installing is always helpful
        // production (可配置当前的开发环境)
        options.environment = "production"
   }
   return true
}
常见选项

dsn
DSN告诉SDK何处发送事件。如果未提供此值,SDK 将尝试从SENTRY_DSN环境变量中读取它。如果该变量也不存在,SDK 将不会发送任何事件。

在没有进程环境(例如浏览器)的运行时中,回退不适用。

了解有关DSN 利用率的更多信息。

options.dsn = "https://examplePublicKey@o0.ingest.sentry.io/0"

debug
打开或关闭调试模式。如果启用调试,如果发送事件出现问题,SDK 将尝试打印出有用的调试信息。默认值始终为false。通常不建议在生产中打开它,尽管打开debug模式不会引起任何安全问题。

options.debug = true // Enabled debug when first installing is always helpful

environment
Sentry 在收到带有环境标签的事件时会自动创建环境。环境区分大小写。环境名称不能包含换行符、空格或正斜杠,不能是字符串“None”或超过 64 个字符。您无法删除环境,但可以隐藏它们。

options.environment = "production"

四、上传调试符号 (dSYM)

Sentry 需要 dSYM 上传来表示您的崩溃日志。符号化过程会解读 Apple 的崩溃日志,以揭示崩溃的函数、文件名和行号。无论使用上传的dSYM文件哨兵CLI中,FASTLANE动作,。

上传dSYM文件有两种方式 dSYM上传官网介绍

本文只要介绍第二种上传方式 ,借助sentry-cli工具,通过XCode内配置脚本上传 。
1、sentry-cli 安装:

#1、方法一
brew install getsentry/tools/sentry-cli
#2、方法二
curl -sL [https://sentry.io/get-cli/](https://sentry.io/get-cli/) | bash

安装完成之后,可以查看是否安装成功了,如下命令:

sentry-cli --version

好了,这个时候就当你已经安装成功~
2、通常的做法就是在生成dsym文件之后,通过sentry-cli执行shell脚本来上传该文件,命令如下:

if which sentry-cli >/dev/null; then
#项目存放地儿的名称
export SENTRY_ORG=XXXX
#项目名称
export SENTRY_PROJECT=XXXX
#授权token
export SENTRY_AUTH_TOKEN=XXXX
#服务器地址
export SENTRY_URL=XXXX
#调试模式
export SENTRY_LOG_LEVEL=debug

ERROR=$(sentry-cli upload-dsym 2>&1 >/dev/null)
echo "success ~~"
if [ ! $? -eq 0 ]; then
echo "warning: sentry-cli - $ERROR"
fi
else
echo "warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases"
fi

可以存为.bash脚本,每次手动进行上传,但是这样难免会显得繁琐,所以,为了更加方便的去操作当前的上传工作并且解放自己的双手,所以我们可以将当前的操作集成在XCodebuild phases中已达到自动化的目的,在对应的target中选择build phases添加新的phase,如下:

1611317-5ff004ca7b6b7f3a.png

紧接着,在内容中添加如下配置内容:

# # 脚本默认配置的版本格式为CFBundleShortVersionString(CFBundleVersion),  如果你修改默认的版本格式, 请设置此变量, 如果不想修改, 请忽略此设置
#CUSTOMIZED_APP_VERSION=""
#
# # Debug模式编译是否上传,1=上传 0=不上传,默认不上传
UPLOAD_DEBUG_SYMBOLS=0
#
# # 模拟器编译是否上传,1=上传 0=不上传,默认不上传
UPLOAD_SIMULATOR_SYMBOLS=0
#
#只有Archive操作时上传, 1=支持Archive上传 0=所有Release模式编译都上传
UPLOAD_ARCHIVE_ONLY=0

# 打印错误信息
function exitWithMessage(){
echo "--------------------------------"
echo "${1}"
echo "--------------------------------"
exit ${2}
}

function sentryUpload(){

#Type a script or drag a script file from your workspace to insert its path.
if which sentry-cli >/dev/null; then
#项目存放地儿的名称
export SENTRY_ORG=XXXX
#项目名称
export SENTRY_PROJECT=XXXX
#授权token
export SENTRY_AUTH_TOKEN=XXXX
#服务器地址
export SENTRY_URL=XXXX
#调试模式
export SENTRY_LOG_LEVEL=debug

ERROR=$(sentry-cli upload-dsym 2>&1 >/dev/null)
echo "success ~~"
if [ ! $? -eq 0 ]; then
echo "warning: sentry-cli - $ERROR"
fi
else
echo "warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases"
fi

}

# 在Xcode工程中执行
function runInXcode(){

echo "Uploading dSYM to Sentry in Xcode ..."
echo "Info.Plist : ${INFOPLIST_FILE}"

BUNDLE_VERSION=$(/usr/libexec/PlistBuddy -c 'Print CFBundleVersion' "${INFOPLIST_FILE}")
BUNDLE_SHORT_VERSION=$(/usr/libexec/PlistBuddy -c 'Print CFBundleShortVersionString' "${INFOPLIST_FILE}")


echo "--------------------------------"
echo "Prepare application information."
echo "--------------------------------"

echo "Product Name: ${PRODUCT_NAME}"
echo "Bundle Identifier: ${BUNDLE_IDENTIFIER}"
echo "Version: ${BUNDLE_SHORT_VERSION}"
echo "Build: ${BUNDLE_VERSION}"


echo "--------------------------------"
echo "Check the arguments ..."

##检查模拟器编译是否允许上传符号
if [ "$EFFECTIVE_PLATFORM_NAME" == "-iphonesimulator" ]; then
if [ $UPLOAD_SIMULATOR_SYMBOLS -eq 0 ]; then
exitWithMessage "Warning: Build for simulator and skipping to upload. \nYou can modify 'UPLOAD_SIMULATOR_SYMBOLS' to 1 in the script." 0
fi
fi

##检查是否是Release模式编译
if [ "${CONFIGURATION=}" == "Debug" ]; then
if [ $UPLOAD_DEBUG_SYMBOLS -eq 0 ]; then
exitWithMessage "Warning: Build for debug mode and skipping to upload. \nYou can modify 'UPLOAD_DEBUG_SYMBOLS' to 1 in the script." 0
fi
fi

##检查是否Archive操作
if [ $UPLOAD_ARCHIVE_ONLY -eq 1 ]; then
if [[ "$TARGET_BUILD_DIR" == *"/Archive"* ]]; then
echo "Archive the package"
else
exitWithMessage "Warning: Build for NOT Archive mode and skipping to upload. \nYou can modify 'UPLOAD_ARCHIVE_ONLY' to 0 in the script." 0
fi
fi

#上传dSYM files
sentryUpload

}


# 根据Xcode的环境变量判断是否处于Xcode环境
INFO_PLIST_FILE="${INFOPLIST_FILE}"

BuildInXcode="F"
if [ -f "${INFO_PLIST_FILE}" ]; then
BuildInXcode="T"
fi

if [ $BuildInXcode = "T" ]; then
runInXcode
else
echo "echo Not in XCode environment "
fi

配置完成之后,这样就能够在每次打包release的时候自动将dsym文件上传到自己的服务器了。

Sentry 可以自己搭建,所以对于一些保密的项目的崩溃收集还是比较不错的一种选择

文章部分内容借鉴链接:(https://www.jianshu.com/p/d3dcebeb2bf4)

文章持续更新中、希望对各位有所帮助、有问题可留言 大家共同学习.

相关文章

网友评论

      本文标题:iOS -- Sentry 集成 崩溃日志收集

      本文链接:https://www.haomeiwen.com/subject/dktevltx.html