iOS APM
Site24x7 iOS 移动端 APM 可让您在实际终端用户设备上追踪原生移动应用的性能。例如,一款新闻阅读应用可能在内部执行以下操作:
- 跳转到表格视图以显示文章列表
- 通过 REST API 调用加载文章列表
- 将文章列表缓存到 SQLite 数据库
- 为每篇文章下载缩略图
- 将缩略图缓存到文件系统
- 构建复杂 UI,例如自定义表格视图单元格样式
上述所有操作均可能耗时较长,并影响用户体验,因此对其在各种设备上进行基准测试和优化非常重要。Site24x7 移动端 APM 通过在应用中以库的形式嵌入 APM Agent,从全球所有用户处采集并汇总指标。
APM Agent 使用事务和组件来衡量代码的执行时间。以上述示例为例,从开始导航到渲染最终 UI 的完整操作序列可视为一个事务,其中各项操作可按类型分组为不同的组件,例如 HTTP、SQLite、文件系统、UI 等。简单操作可仅使用事务来衡量,而复杂操作则可使用包含组件的事务来衡量。
了解以下内容:
如何添加移动端 APM?
- 登录 Site24x7,进入 APM 标签下的 iOS 部分。
- 点击"添加应用"按钮。
- 输入应用名称和 Apdex 阈值,然后点击"保存"。
- 您可以在应用列表页面中,点击应用名称旁的汉堡菜单图标 (
) 复制应用密钥。

通过 CocoaPods 安装移动端 APM
步骤 1:
将移动端 APM iOS SDK 添加到您的 Podfile 中。
target 'Your_Project_Name' do
use_frameworks!
pod 'Site24x7APM'
end
步骤 2:
在终端中运行以下命令
pod install
步骤 3:
在 Build Settings 中将 Debug Information Format 设置为 DWARF with dSYM File。
步骤 4:
初始化 SDK 并构建项目。
import UIKit
import APM
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
S24APM.start(withAppKey:"App_Key", interval: 15);
return true;
}
}
启动事务
通常,您应在耗时较长的操作开始之前启动事务,并在操作完成时停止事务。事务是线程安全的,可以从不同线程启动和停止。事务对象只能被启动和停止一次。具有相同名称的事务将在整个应用中取平均值。因此,当相同操作使用相同的事务名称多次执行时,将记录平均执行时间。
如何使用组件对事务中的操作进行分组?
您可以将事务中的操作分组为不同类型的组件。您可以使用预定义类型(如 S24HttpComponent.TYPE_HTTP、Component.TYPE_SQLITE、Component.TYPE_UI 等),也可以指定自定义类型。组件是线程安全的,可以从不同线程启动和停止。组件对象只能被启动和停止一次。组件对象在其父事务停止后不能再被停止。事务中的多个组件可以重叠并并行运行。事务中具有相同名称的组件将取平均值。
在上述示例中,HTTP 操作(下载文章和缩略图)所花费的总时间由 S24HttpComponent 来衡量,仅下载文章所花费的时间由 "Download Articles" 来衡量。由于 "Download Thumbnail" 在循环中多次执行,每次下载缩略图所花费的时间将取平均值并记录。
如何刷新数据?
有时需要手动将最近记录的数据刷新到 Site24x7 的服务器。如果您在应用终止之前刚记录了事务,则可能需要执行此操作。如果您设置了较长的上传间隔(默认为 60 秒),则应在适当时机手动刷新数据,以防应用在下一个上传间隔之前终止。
[S24APM flush]
查看数据
- 登录您的 Site24x7 帐户 > APM > iOS,然后点击您的应用。
- 仪表板列出所有移动应用及其状态:正常、宕机、严重或故障。
- 已暂停或存在配置错误的应用也会列在此处。
- 对于运行中的应用,仪表板中列出以下指标:
- 所选时间段与前一时间段相比的响应时间和吞吐量
- 所选时间段内的崩溃次数
- 所选时间段内的 Apdex 分数和用户数

指标与推断
1.全球汇总报表
全球汇总报表显示所选时间段内您的应用在所有地区的性能表现。颜色编码基于 Apdex 分数(范围为 0 到 1),0 表示用户体验极差,1 表示用户体验满意。您可以将鼠标悬停在地图上的某个区域,查看该位置的 Apdex 分数、平均响应时间、吞吐量和错误数。

2.应用的响应时间与吞吐量
所选时间段内应用的总响应时间和吞吐量可在管理标签中查看。

3.按地区、运营商、设备和操作系统版本划分的响应时间
您的应用响应时间可能受应用代码之外的多种因素影响。
比较应用在不同地区、设备和操作系统版本之间的响应时间,有助于您缩小问题范围。

按地区和运营商划分的响应时间可在"地理位置"标签下查看。

不同设备和操作系统版本的响应时间可在"设备类型"标签下查看。

4.事务响应时间
各事务的响应时间、吞吐量和调用次数可在"事务"标签下查看。

5.崩溃分析
您可以通过点击"崩溃分析"标签查看所选时间段内的崩溃次数。将鼠标悬停在顶部的堆叠图表上,可查看各设备的崩溃次数、问题数量以及受此次崩溃影响的用户数。中间区域显示崩溃数量的百分比变化——总崩溃次数的增减情况,以及未崩溃用户的数量。

崩溃摘要列出了各异常信息。您可以点击异常查看具体的出错行。

配置告警
自定义 API
自定义 API 用于设置用户 ID 动态值、追踪自定义事件、捕获屏幕等。本文档将介绍 Site24x7 中可用的各类自定义 API 及其使用语法。
可用 API:
1. 初始化 SDK
您可以使用以下 API 以自定义上传间隔初始化 SDK。默认情况下,数据上传间隔设置为 60 秒。
Objective-C 语法:
Objective-C
/**
* Initializes the APM agent.
* @param {NSString*} appKey
* The application key.
* @param {NSUInteger} intervel
* The interval in seconds at which to upload data to the server. The default is 60 seconds.
*/
[S24APM startWithAppKey:@"App_Key" interval:30]
Swift 语法:
Swift
/**
* Initializes the APM agent.
* @param {String} appKey
* The application key.
* @param {int} intervel
* The interval in seconds at which to upload data to the server. The default is 60 seconds.
*/
S24APM.start(withAppKey:"App_Key", interval: 15);
2. 自定义用户 ID
默认情况下,SDK 会生成唯一的用户 ID。如果您想自定义用户 ID,可以通过实现以下语法来实现。当您需要追踪特定用户的指标或调试问题时,此功能非常有用。
Objective-C 语法:
Objective-C/**
*@param {NSString*} userId
*/
[S24APM setUserId:@"user@example.com" ]
Swift 语法:
Swift
/**
*@param {String} userId
*/
S24APM.setUserId("user@zylker.com")
3. 事务
您可以使用以下 API 追踪具有应用特定计时的自定义事件。
Objective-C 语法:
Objective-C
/**
*Transaction (can contain multiple components)
*@param {NSString*} transactionName
*Component
*@param {NSString*} transactionName
*@param {NSString*} componentName
*/
S24Transaction *transaction = [S24APM startTransactionWithName:@"List Articles"];
S24Component *httpComponent = [transaction startComponentWithType:S24HttpComponent];
S24Component *articlesComponent = [transaction startComponentWithType:@"Download Articles"];
// Download articles
[transaction stopComponent:articlesComponent];
for (Article *article in articles) {
S24Component *thumbnailComponent = [transaction startComponentWithType:@"Download Thumbnail"];
// Download thumbnail
[transaction stopComponent:thumbnailComponent];
}
[transaction stopComponent:httpComponent];
[S24APM stopTransaction:transaction];
Swift 语法:
Swift
/**
*Transaction (can contain multiple components)
*@param {String} transactionName
*Component
*@param {String} transactionName
*@param {String} componentName
*/
S24Transaction *transaction = [S24APM startTransactionWithName:@"List Articles"];
S24Component *httpComponent = [transaction startComponentWithType:S24HttpComponent];
S24Component *articlesComponent = [transaction startComponentWithType:@"Download Articles"];
// Download articles
[transaction stopComponent:articlesComponent];
for (Article *article in articles) {
S24Component *thumbnailComponent = [transaction startComponentWithType:@"Download Thumbnail"];
// Download thumbnail
[transaction stopComponent:thumbnailComponent];
}
[transaction stopComponent:httpComponent];
[S24APM stopTransaction:transaction];
4. HTTP 调用
默认情况下,使用以下网络库的网络请求将被自动捕获。
- NSUrlSession
- NSUrlConnection
如果您想添加更多 HTTP 调用,请使用以下 API。
Objective-C 语法:
Objective-C
/**
*@param {NSString*} name
*@param {NSUInteger} duration measured in millis
*@param {NSString*} startTime
*@param {NSUInteger} respCode
*@paramt {NSString*} httpMethod
*/
[S24APM addHttpCall:@"example.com" withTime:60 startTime:@"1642750130310" respCode:200 httpMethod:@"GET"]
Swift 语法:
Swift
/**
*@param {String} name
*@param {int} duration measured in millis
*@param {String} startTime
*@param {int} respCode
*@paramt {String} httpMethod
*/
S24APM.addHttpCall("example.com", withTime:60, startTime: "1642750130310", respCode: 200, httpMethod: "GET");
5. 屏幕
默认情况下,所有屏幕均会被捕获;但如果您想添加遗漏的屏幕,请使用以下 API。
Objective-C 语法:
Objective-C
/**
*@param {NSString*} screen
*@param {NSUInteger} duration measured in millis
*@param {NSString*} startTime
*/
[S24APM addScreen:@"DetailScreen" withTime:60 startTime:@"1642750130310"]
Swift 语法:
Swift
/**
*@param {String} screen
*@param {int} duration measured in millis
*@param {String} startTime
*/
S24APM.addScreen("DetailScreen", withTime: 60, startTime: "1642750130310");
6. 环境
您可以使用以下 API 设置自定义环境详情,以便在开发、调试、生产或发布等不同环境配置中筛选数据。
Objective-C 语法:
Objective-C
/**
*@param {NSString*} environment
Custom environment types like debug, release, or beta release.
*/
[S24APM setEnvironment:@"release"]
Swift 语法:
Swift
/**
*@param {String} environment
Custom environment types like debug, release, beta-release, etc.
*/
S24APM.setEnvironment("release");
7. 刷新
您可以使用以下 API 立即将已记录的数据上传至服务器,而无需等待下一个上传间隔。默认情况下,刷新间隔设置为 60 秒。
Objective-C 语法:
Objective-C
[S24APM flush]
Swift 语法:
Swift
S24APM.flush()
如果没有可用的网络,数据将在队列中保留,直到下一个上传间隔。如果您配置了较长的上传间隔,则可能需要在活动或服务销毁时手动刷新数据。
8. 排除 HTTP 调用
您可以通过将 URL 列表作为参数传递给以下 API,来排除对自定义 URL 的追踪。
Objective-C 语法:
Objective-C
/**
@param {NSArray<NSString *> *} listOfUrls
*/
[S24APM enableHttpTracking:@[@"example.com"]]
Swift 语法:
Swift
/**
@param {var} listOfUrls
*/
S24APM.enableHttpTracking(["example.com"]);
9. 排除屏幕
您可以通过将屏幕列表作为参数传递给以下 API,来排除对自定义屏幕的追踪。
Objective-C 语法:
Objective-C
/**
@param {NSArray<NSString *> *} listOfScreens
*/
[S24APM ignoreScreens:@["DetailScreen"]]
Swift 语法:
Swift
/**
@param {var} listOfScreens
*/
S24APM.ignoreScreens(["DetailScreen"]);
版本说明
Version 2.2.3
10 June 2024
问题修复:
- 修复了 ignoreScreens 自定义 API 的问题。
Version 2.2.2
03 June 2024
增强:
- 根据 Apple 安全规范要求,已加入隐私清单。
Version 2.2.1
05 February 2024
增强:
- 支持 Flutter 框架。
Version 2.2.0
21 December 2023
新功能:
以下为移动端 Vitals 功能:
- 支持捕获应用启动时间(包括冷启动和热启动)。
- 支持自动计算视图控制器的慢帧与冻结帧。
增强:
- 会话时长已限制为 15 分钟。
- 应用版本从 CFBundlShortVersionString 中获取。
- 支持 CocoaPods 平台。
Version 2.1.2
05 June 2023
增强:
- 部分逻辑已通过桥接头文件迁移至 Swift。
- 在向服务器发送数据前执行空值安全检查。
- 整个 SDK 采用 单例 模式共享对象。
问题修复:
- 已解决无法将错误数据写入文件的问题。
Version 2.1.1
17 May 2023
问题修复:
- 从 React Native 应用发送到 iOS 原生 Agent 的崩溃数据,现在会在应用崩溃前保存到文件。
- 应用启动时,将启动一个任务,把之前存储的错误数据发送到服务器。
- Agent 与服务器通信成功后,将清除应用存储中的错误文件。
Version 2.1.0
20 May 2022
新功能:
- 新增使用应用密钥和上传间隔监控应用的 API。
增强:
- 增强了 Crashlytics 支持。
Version 2.0.4
04 March 2022
增强:
- 支持在基于 Swift 的 iOS 应用中使用 HTTP 调用。
Version 2.0.3
19 January 2022
问题修复:
- 修复了若干小问题。
Version 2.0.2
12 January 2022
增强:
- 每个上传间隔内,最多捕获最新的 20 条屏幕记录和 HTTP 调用记录。
- 引入了 XCFrameworks,同时支持模拟器和真实设备。
- 提供用于配置自定义环境的 API。
Version 2.0.1
11 January 2022
问题修复:
- 已解决"在后台线程调用 UI API"的问题。
Version 2.0.0
04 June 2021
增强:
- 支持追踪 HTTP 调用,包括请求方法、响应时间、吞吐量、状态码、平台和屏幕。
- 支持追踪屏幕,基于响应时间、吞吐量和调用次数进行统计。
- 支持自动追踪视图和导航。
- 支持手动追踪视图。
- 已启用用户会话追踪,会话超时时间为 60 分钟。
- 支持手动添加用户 ID。
- 支持追踪以下软件包的所有 HTTP 调用:
- NSURLSession 方法
- dataTaskWithURL
- dataTaskWithURL completionHandler
- dataTaskWithRequest
- dataTaskWithRequest completionHandler
- downloadTaskWithURL
- downloadTaskWithURL completionHandler
- downloadTaskWithRequest
- downloadTaskWithRequest completionHandler
- uploadTaskWithRequest fromData
- uploadTaskWithRequest fromData completionHandler
- uploadTaskWithRequest fromFile
- uploadTaskWithRequest fromFile completionHandler
- NSURLSession 方法
-
- NSURLConnection 方法
- sendAsynchronousRequest queue completionHandler
- dataTaskWithURL completionHandler
- NSURLConnection 方法
- 支持手动添加其他 HTTP 调用。


