iOS SDK接入指引
本文介绍Bugly专业版iOS SDK的接入步骤。注册产品,接入SDK后,验证数据上报成功,即可在Bugly 专业版的官网使用相关分析功能。
接入前准备
- 在接入sdk之前,请务必认真阅读《开发者合规指南》 。
- SDK在初始化过程中,可能会采集部分用户信息。请在用户同意《Bugly专业版SDK个人信息保护规则》之后,再进行SDK的初始化。SDK在初始化前,不会收集任何信息。
Demo示例
- Demo已经接入了Bugly专业版的性能监控和稳定性监控的所有能力。
- 你可以通过Demo模拟各种异常和性能数据。
- 你可以配置成自己注册产品的AppID及AppKey,将数据上报到Bugly平台,进行SDK功能测试。
- 测试完成后,请使用自己注册产品的AppID及AppKey初始化Bugly SDK。
- Demo上报的数据有流量限制,超过限制部分会被丢弃。
步骤一:注册产品,获取AppID及AppKey
请参考 快速入门,在Bugly专业版上创建新产品,创建成功后,在设置-->产品信息中,复制AppID及AppKey。
如果只是为了验证SDK,可以使用 BuglyProDemo 的AppID以及AppKey。
步骤二:集成SDK
自动集成(推荐)
在工程的Podfile里面添加以下代码:
pod 'BuglyPro','2.7.51'
保存并执行pod install,然后用后缀为.xcworkspace的文件打开工程。
注意:
命令行下执行pod search Bugly
,如显示的Bugly版本不是最新的,则先执行pod repo update
操作更新本地repo的内容
关于CocoaPods的更多信息请查看 CocoaPods.org。
手动集成(不推荐)
如果您不采用上述自动导入方式,也可以手动集成Bugly Pro SDK。
1. 下载Bugly专业版iOS SDK的xcframework文件。
Bugly专业版iOS SDK 下载地址:Central Repository: com/tencent/bugly
2.拖拽BuglyPro.xcframework文件到Xcode工程内(请勾选Copy items if needed选项)
步骤三:初始化SDK
参考以下代码初始化Bugly 专业版SDK,在App启动后初始化监控框架,一般推荐在application:didFinishLaunchingWithOptions:delegate
中进行初始化。
1. 在AppDelegate实现文件中引入对应的头文件
#import <BuglyPro/Bugly.h>
#import <BuglyPro/BuglyConfig.h>
#import <BuglyPro/BuglyDefine.h>
2.在didFinishLaunchingWithOptions中启动框架
// 启用模块,根据需要自定义设置
NSArray<NSString *> *moduleNames = RM_MODULE_ALL;
BuglyConfig* config = [[BuglyConfig alloc] initWithAppId:@"a2031e998b" appKey:@"5f58a9cf-0acc-4c0d-a020-fc8f0bacb3cc"];
// 可选配置。设置自定义日志上报的级别,默认不上报自定义日志
config.reportLogLevel = BuglyLogLevelInfo;
// 可选配置。设置用户id
config.userIdentifier = @"rmonitor";
[Bugly start:moduleNames config:config];
- 设备ID非常重要,Bugly使用设备ID来计算设备异常率,强烈建议应用设置正确的设备ID,以确保设备的唯一性。
- 性能监控项可在控制管理台的设置/SDK配置中进行采样调整,通过调整设备采样率来开启或者关闭性能监控项。
- 建议在用户授权《Bugly专业版SDK个人信息保护规则》 后再初始化Bugly。
步骤三:验证数据上报
详细使用参考 BuglyProDemo 。
前提条件
崩溃是100%上报,不支持采样。除崩溃外,其他监控能力都支持采样,默认是全部关闭。
需要在控制管理台的 设置/SDK配置 中,创建配置任务。有关配置功能的详细说明,见《SDK配置使用指引》 。
在接入期间,建议参考SDK配置-测试号码设置测试号码白名单,即将所有采样率调整为1.0,方便验证数据上报。接入完成后,再根据需要,调整采样率。
或者创建多个配置任务,根据版本类型(对应初始化的
BuglyConfig中的buildConfig
),配置开发任务,灰度任务,以及正式任务。开发任务打开所有的监控项,灰度阶段按需采样,正式发布根据需要降低采样。检查待接入的产品是否已经购买并绑定「生效中的资源包」。如果产品没有绑定生效中的资源包,该产品将无法上报数据,见「快速入门」 。
验证数据上报前,请检查「前提条件」,重点关注配置是否正确,产品是否已经购买并绑定生效中的资源包。
崩溃监控
初始化完成后,可以模拟OC异常、C++异常、信号异常来验证SDK的上报情况,详细可以参考BuglyProDemo。
崩溃发生后,部分异常问题需要在第二次启动才能完成上报。上报可能存在延时,测试时建议触发异常后,重新启动APP,再刷新展示界面。
// 模拟OC异常
id data = [NSArray arrayWithObject:@"Hello World"];
[(NSDictionary *)data objectForKey:@""];
// 模拟信号异常
abort();
// 模拟C++异常
throw "Something went wrong";
崩溃上报后,在 崩溃/问题列表 中可以看到上报的问题,点击进入问题详情,查看上报详情。
ANR监控
跟崩溃类似,可以通过如下的测试接口来模拟ANR,也可以自行在UI线程执行异常耗时任务。
// 模拟ANR
while(YES)
{
;
}
ANR上报后,在 ANR/问题列表 可以看到上报的问题,点击进入问题详情,查看上报详情。
FOOM监控
FOOM率:FOOM(Foreground Out Of Memory)一般指APP因为内存使用过高,被系统意外杀死的情况。由于FOOM判断原理的原因,因此也会包含其他原因导致的APP被系统意外杀死的情况。
- (void)foomButtonClicked {
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(timerFired) userInfo:nil repeats:YES];
}
- (void)timerFired {
CGSize size = CGSizeMake(1024 , 1024);
const size_t bitsPerComponent = 8;
const size_t bytesPerRow = size.width * 4;
CGContextRef ctx = CGBitmapContextCreate(calloc(sizeof(unsigned char), bytesPerRow * size.height), size.width, size.height,
bitsPerComponent, bytesPerRow,
CGColorSpaceCreateDeviceRGB(),
kCGImageAlphaPremultipliedLast);
CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(ctx, CGRectMake(0, 0, size.width, size.height));
}
OOM上报后,在 OOM/问题列表 可以看到上报的问题,点击进入问题详情,查看上报详情。
错误监控
错误一般是指用户自定义的异常,如已经Catch的OC/C++异常,或者C#异常、JS异常、lua异常等。一般通过BuglyCrashMonitorPlugin.h
中的reportException:
、reportError:
或reportExceptionWithCategory:name:reason:callStack:extraInfo:terminateApp:
来上报(详细参考其他接口/上报自定义异常部分)。
可以参考以下示例代码,上报自定义错误:
- (void)userDefinedCrash {
NSError *error = [NSError errorWithDomain:@"Error Test" code:-2 userInfo:nil];
[BuglyCrashMonitorPlugin reportError:error];
}
可以参考以下示例代码,上报OC/C++异常:
- (void)userDefinedCrash {
@try {
NSString *value = @"This is a string";
[NSException raise:@"TurboEncabulatorException"
format:@"Spurving bearing failure: Barescent skor motion non-sinusoidal for %p", value];
} @catch (NSException *exception) {
[BuglyCrashMonitorPlugin reportException:exception];
}
}
参考以下示例代码,上报自定义异常:
NSArray * arr = [NSThread callStackSymbols];
[BuglyCrashMonitorPlugin reportExceptionWithCategory:3 name:@"reportTest" reason:@"test" callStack:arr extraInfo:[NSDictionary dictionary] terminateApp:false];
错误上报后,在 错误/问题列表 看到上报的问题,点击进入问题详情,查看上报详情。
reportExceptionWithCategory:name:reason:callStack:extraInfo:terminateApp:
的参数中,callStack设置的出错堆栈,extraInfo展示在附件中。
启动监控
在开启启动监控的情况下,启动模块会自动安装监控,并且在Bugly初始化后,进行启动数据上报。用户可以通过[BuglyLaunchMonitorPlugin endColdLaunch]
接口自定义启动结束点,也支持自定义标签以及通过打点接口,监控启动过程中的耗时任务。
请查看 API说明/启动监控 部分了解更多启动接口的使用。
[BuglyLaunchMonitorPlugin startSpan:@"parentSpan" parentSpanName:nil];
[BuglyLaunchMonitorPlugin startSpan:@"spanTest" parentSpanName:@"parentSpan"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[BuglyLaunchMonitorPlugin endSpan:@"spanTest"];
[BuglyLaunchMonitorPlugin endSpanFromLaunch:@"spanFromLaunch"];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[BuglyLaunchMonitorPlugin endSpan:@"parentSpan"];
});
[BuglyLaunchMonitorPlugin addTag:@"tagTest1"];
[BuglyLaunchMonitorPlugin addTag:@"tagTest2"];
卡顿监控
卡顿指标:FPS及挂起率
在开启卡顿指标("looper.fluency"
)的情况下,SDK会在初始化完成后,监控应用的流畅度情况。在应用一次运行期间,会先收集数据,保存本地,下次启动时再聚合上报。为了避免影响应用的启动,Bugly SDK 会在初始化5分钟后,再将缓存的数据聚合上报后台。
FPS:帧率,即 单位时间内刷新次数 / 单位时间。因为 iPhone 13 的高刷屏的出现,FPS 采用一种归一化的计算方案,即将大于 60 FPS的数据归一化为 60。。
挂起率:挂起率定义为单位时间内回调间隔超过 200ms 的时间和除以单位总时间 * 3600,即单位是 s/h。。
可以通过BuglyProDemo中,测试滑动卡顿来观察列表滑动情况下的FPS以及挂起率。
卡顿监控
在开启卡顿监控("looper.hitches"
)的情况下,在UI线程执行耗时逻辑,耗时超过500ms的情况下,会触发卡顿上报。卡顿监控通过监控UI线程的消息执行来判断当前UI线程是否发生卡顿。
在验证阶段,建议将卡顿监控的"event_sample_ratio"
(消息采样率)以及"sample_ratio"
(设备采样率)都设置为1。这样只要满足卡顿的耗时阈值,即可触发卡顿上报。
我们在tableview的回调方法中添加一个耗时操作即可,参考以下示例代码模拟一个卡顿上报:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"defaultcell"];
cell.textLabel.text = [self.dataList objectAtIndex:indexPath.row];
cell.textLabel.font = [UIFont systemFontOfSize:80];
BOOL hitch = arc4random() % 5;
if (hitch) {
[NSThread sleepForTimeInterval:0.02];
}
return cell;
}
卡顿上报后,在 卡顿/问题列表 可以看到上报的问题,点击进入问题详情,查看上报详情。
内存监控
峰值内存: 指APP的整个生命周期中,最大的phys_footprint的值。峰值内存越高,意味着极端情况下APP使用内存越多
VC内存泄露
VC内存泄露指的是监控iOS APP 开发框架中的 UIViewController 的泄露情况。
可以通过以下示例代码来验证:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"RMVCLeakExample"
bundle:[NSBundle mainBundle]];
UIViewController * subVC = [storyboard instantiateViewControllerWithIdentifier:@"rm.vcleak.subvc"];
[self.navigationController pushViewController:subVC animated:YES];
self.holdVC = subVC;
泄露发生并且上报后,在VC内存泄露/问题列表可以看到上报的问题,点击进入问题详情,查看上报详情。
大块内存分配监控
大内存分配监控的目的是针对APP中使用大块内存的情况进行监控,让业务感知APP中使用内存较为严重的业务逻辑。大内存监控在APP触发大于一定阈值的内存分配时,收集触发内存分配的堆栈、当前的业务场景、内存使用情况等数据并上报。
大内存分配不一定是一个明确问题,但是可以让业务得知对应的业务逻辑中有较大的内存消耗,需要关注和优化。避免内存快速消耗,导致发生FOOM的情况。
API说明
初始化接口
Bugly在初始化时,Buglyconfig除了设置appid和appkey以外,还可以设置一系列用户参数。
/// 设置自定义版本号
@property (nonatomic, copy) NSString *appVersion;
/// 设置自定义设备唯一标识
@property (nonatomic, copy) NSString *deviceIdentifier;
/// 自定义用户id
@property (nonatomic, copy) NSString *userIdentifier;
/// build config,用于拉取不同的配置
@property (nonatomic, assign) BuglyBuildConfig buildConfig;
/// Bugly Delegate
@property (nonatomic, assign) id<BuglyDelegate> delegate;
回调接口
1. 设置Crash附件信息回调
Bugly处理Crash异常时可以回调业务,业务可以在回调中加入自定义的逻辑,或提供额外信息跟随异常一起上报。
/// 允许业务带附件到个例上报中
/// @param eventType 个例事件类型
/// @param customData 业务自定义字段
/// @param eventInfo 个例信息,暂为空
- (NSDictionary<NSString *, NSString *> *)attachmentForEvent:(NSString *)eventType
customData:(BuglyCustomData *)customData
eventInfo:(NSDictionary *)eventInfo;
#### 2. 回调Crash信息供设置信息
Bugly上报Crash异常时可以回调业务,业务可以在回调中加入自定义的逻辑。
``` objective-c
/**
* 发生异常时回调
* @param exception 异常信息
* @return 返回需上报记录,随异常上报一起上报
*/
- (NSString * __nullable)attachmentForException:(NSException * __nullable)exception;
3. 设置日志回调接口
实现一个函数回调方法:
/// 自定义log函数
static void logger_func(RMLoggerLevel level, const char *log) {
//handle sdk log.
}
并注册该方法:
// 注册Bugly日志输出
[Bugly registerLogCallback:logger_func];
其他接口
其他接口的调用均需在Bugly初始化之后,初始化之前调用无效,Bugly提供其他接口功能如下。
1. 更新设备ID
/**
* 更新设备id
* @param deviceId 设备id
*/
+ (void)updateDeviceIdentifier:(NSString *)deviceId;
2. 更新用户ID
/**
* 更新userId
* @param userId 用户id
*/
+ (void)updateUserIdentifier:(NSString *)userId;
3. 获取SDK版本号
/**
* 获取 SDK 版本信息
* @return SDK版本号
*/
+ (NSString *)sdkVersion;
4. 上报自定义异常
如业务需要上报除OC/C++之外的错误,如C#/js等异常等,可以通过自定义异常接口上报至Bugly,上报的数据在「错误」栏目中展示。
/**
* @brief 上报自定义错误
*
* @param category 类型(Cocoa=3,CSharp=4,JS=5,Lua=6)
* @param aName 名称
* @param aReason 错误原因
* @param aStackArray 堆栈
* @param info 附加数据
* @param terminate 上报后是否退出应用进程
*/
+ (void)reportExceptionWithCategory:(NSUInteger)category
name:(NSString *)aName
reason:(NSString *)aReason
callStack:(NSArray *)aStackArray
extraInfo:(NSDictionary *)info
terminateApp:(BOOL)terminate;
5. 上报自定义错误
如业务希望把NSError信息上报到Bugly,可以使用上报错误的接口,上报的数据在「错误」栏目中展示。
/**
* 上报错误
*
* @param error 错误信息
*/
+ (void)reportError:(NSError *)error;
6. 上报OC异常
如业务通过try catch方式捕获到异常,希望上报到Bugly,可以使用上报异常接口,上报的数据在「错误」栏目中展示。
/**
* 上报自定义Objective-C异常
*
* @param exception 异常信息
*/
+ (void)reportException:(NSException *)exception;
7. 设置个例标签
/**
* 更新个例标签,需要在 bugly sdk 完成初始化(Bugly setup completeHandler 回调)后调用,否则可能导致数据丢失
* SDK版本: 2.7.53.3+
* @params tagArr 字符串数组,字符串限长 1024 字节,数组限长 30
*/
+ (void)updateCaseTags:(NSArray<NSString *> *)tagArr;
8. 设置业务下钻
/**
* 更新业务下钻,需要在 bugly sdk 完成初始化(Bugly setup completeHandler 回调)后调用,否则可能导致数据丢失
* SDK版本: 2.7.53.3+
* @params tagArr 字符串数组,字符串限长 1024 字节,数组限长 30
*/
+ (void)updateTestTags:(NSArray<NSString *> *)tagArr;
自定义数据
1. 添加自定义数据(Crash监控)
Bugly支持业务添加自定义数据,可以保存在Crash发生时、或发生前的一些自定义环境信息。自定义数据会随异常一起上报,并在异常个例详情界面的「自定义字段」中展示。自定义数据最多支持50对key-value。
/**
* 设置关键数据,随崩溃信息上报
*
* @param value KEY
* @param key VALUE
*/
+ (void)setUserValue:(NSString *)value forKey:(NSString *)key;
获取已设置自定义数据,可通过如下接口进行操作。
/**
* 获取自定义数据
*
* @return 关键数据
*/
+ (NSDictionary * _Nullable)allUserValues;
2. 设置/更新自定义文件上传路径(Crash监控)
Bugly支持业务上传自定义大文件,并关联至异常个例。自定义文件的上传采用独立于异常上报的通道,对异常处理流程无干扰,且支持配置多个文件。业务可以在发生异常之前的任意时间段,通过如下接口设置/更新文件路径的数组。进程发生异常重启后,会上报这些自定义文件,在异常个例的「附件」中,展示为custom_log.zip。
/**
* 设置自定义附件的绝对路径的集合。
* 文件压缩后的大小不大于10M,二次启动时上报。
*/
+ (void)setAdditionalAttachmentPaths:(NSArray<NSString *>*)pathArray;
- 该接口最多设置10个文件路径。
- 需上传文件压缩后的大小限制为10MB,若超过该大小,则不会被上传。
- 该接口可被多次调用,更新的文件路径会覆盖之前的值。
- 自定义文件的上传时机在进程二次启动时,与异常上报间存在一定延迟。
- 频繁发生崩溃异常会触发文件清理逻辑,可能会导致文件漏传。
- 可以通过配置设置自定义文件上传的采样率,配置方式可以参见 《SDK配置使用指引》 。
3. 进入/退出自定义场景(性能监控)
在性能监控中,业务可以自定义场景,并根据场景来执行特定的监控或回调操作。使用如下接口来进入、重置自定义场景。
/// 更新场景信息
/// @param key 场景id,卡顿、内存、资源监控等功能会根据该值进行聚类
+ (void)setScene:(NSString *)key;
/// 结束自定义场景信息,继续使用 RMonitor 自动获取的场景信息
+ (void)resetScene;
4. 添加/移除自定义数据采集器(性能监控)
Bugly性能监控模块的自定义设置方式不同于Crash监控模块,性能监控模块的自定义数据支持两类,「自定义维度」与「自定义字段」。
「自定义维度」 指由 SDK指定了三组Key(详细见BuglyCustomData.h
),每组10个。应用可以根据需要,选择合适的Key上报数据。在控制管理台,用户可以给这些Key设置别名,方便查看和分析。对于自定义维度,服务器存储时是一个字段,一个字段分开存储的。后续可以提供丰富的查询和分析能力。当前支持全局设置,或者数据上报前的回调设置。
「自定义字段」 指Key和Value都由应用自由设置,SDK不理解字段的类型,统一作为字符串存储。用户可以在控制管理台,在问题列表和问题详情,通过自定义字段查询包含指定内容的上报。
全局设置 :指应用可以随时调用全局设置接口,设置自定义维度,相同key的数据,重复设置表示更新。性能上报在需要上报时,会获取全局缓存的自定义维度数据。
可以通过如下接口来获取默认的全局自定义维度收集回调,并设置全局自定义维度。
/**
* 添加自定义上报的tag, SDK初始化前调用无效
* @param data 需要更新的自定义字段
*/
+ (void)updateCustomData:(BuglyCustomData *)data;
/**
* 获取当前自定标签的副本信息,若未设置,返回空
* @return 已设置的用户自定义字段
*/
+ (nullable BuglyCustomData *)currentCustomData;
/**
* 添加自定义数据为特定的事件上报
* @param data 需要更新的自定义字段
* @param eventType 对应的事件类型
*/
+ (void)updateCustomData:(BuglyCustomData *)data forEvent:(BuglyEventTypeName)eventType;
/**
* 获取特定事件的当前自定义数据
* @param eventType 需要获取的事件类型
* @return 对应已设置的自定义字段
*/
+ (nullable BuglyCustomData *)currentCustomDataForEvent:(BuglyEventTypeName)eventType;
/**
* 使用新的自定义字段更新此自定义数据
* @param dict 符合BuglyCustomData存储格式的字典信息
* @return 返回在次数据基础上更新后的新数据
*/
- (BuglyCustomData *)customDataByUpdateDict:(NSDictionary *)dict;
/**
* 获取设置的数字类型的自定义数据
* @param key 如果KEY不在NumberParamKey定义中,直接返回0.0
* @return 如果有设置,则返回当前值,如果没有设置,返回0.0
*/
- (nullable NSNumber *)getNumberParam:(BuglyCustomNumberDataKey)key;
/**
* 设置数字类型的自定义数据
* @param key 如果KEY不在NumberParamKey定义中,则添加失败
* @param param NUMBER VALUE
*/
- (BOOL)putNumberParam:(nullable NSNumber *)param forKey:(BuglyCustomNumberDataKey)key;
/**
* 获取设置的字符串类型的自定义数据
* @param key 如果KEY不在StringParamKey定义中,直接返回""
* @return 如果有设置,则返回当前值,如果没有设置,返回""
*/
- (nullable NSString *)getStringParam:(BuglyCustomStringDataKey)key;
/**
* 设置字符串类型的自定义数据
* @param key 如果KEY不在StringParamKey定义中,则添加失败
* @param param 长度不能超过 BUGLY_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH
* value = null, 则会设置空串
* value = 长度超标字符串,则会截取前BUGLY_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH个字符设置
*/
- (BOOL)putStringParam:(nullable NSString *)param forKey:(BuglyCustomStringDataKey)key;
/**
* 获取字符串数组类型的自定义数据
* @param key 如果KEY不在StringArrayParamKey定义中,则直接返回空列表
* @return 如果有设置,则返回相关设置数据,如果没有设置,则直接返回空列表, 返回的List不可以修改。
*/
- (nullable NSArray<NSString *> *)getStringArrayParam:(BuglyCustomArrayDataKey)key;
/**
* 添加顺序是:A1 -> A2 -> A2 -> A3 -> A4, 这个接口产生的结果类似:[A1, A2, A3, A4]
* 为字符串数组类型的自定义数据,增加VALUE
* @param key 如果KEY不在StringArrayParamKey定义中,则添加失败
* @param param 非空值,非空串,如果value不存在,则添加,如果存在,则直接返回,长度不能超过 BUGLY_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH
*/
- (BOOL)addStringToStringArrayParam:(NSString *)param forKey:(BuglyCustomArrayDataKey)key;
/**
* 从字符串数组类型的自定义数据中,移除VALUE
* @param key 如果KEY不在StringArrayParamKey定义中,则移除失败
* @param param 如果value存在,则移除,如果不存在,则直接返回
*/
- (BOOL)removeStringFromStringArrayParam:(NSString *)param forKey:(BuglyCustomArrayDataKey)key;
/**
* 添加顺序是:A1 -> A2 -> A2 -> A3 -> A4, 这个接口产生的结果类似:[A1, A2, A2, A3, A4]
* 为字符串数组类型的自定义数据,增加VALUE
* @param key 如果KEY不在StringArrayParamKey定义中,则添加失败
* @param param 长度不能超过 BUGLY_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH, 无论是否存在,都会添加,即可以存在重复的value
* @return value是空值,空串,或者超长,或者已经达字符串数组最大值,返回失败,否则还回成功
*/
- (BOOL)addStringToSequence:(NSString *)param forKey:(BuglyCustomArrayDataKey)key;
启动监控
启动监控定义
冷启动耗时计算规则分为 iOS 15 以前和 iOS 15以后两种。
iOS 15 以前
冷启动耗时 = 第一帧UI上屏时间 - App 进程创建时间。
iOS 15 以后
苹果在 iOS 15 上增加了 Prewarming 的新特性,可以预启动进程,导致从“App 进程初始化结束时间”到“ main
函数执行时间”这段时间变得非常不确定。因此冷启动耗时减去中间这段不确定的时间,调整为
冷启动耗时 = 第一帧UI上屏时间 - `main`函数执行时间 + App 进程初始化结束时间 - App 进程创建时间。
API介绍
自定义场景区间耗时统计
调用
BuglyLaunchMonitorPlugin
的+ (void)startSpan:(NSString *)spanName parentSpanName:(nullable NSString *)parentSpanName
,记录自定义场景开始时间戳[BuglyLaunchMonitorPlugin startSpan:@"testSpan" parentSpanName:nil];
调用
BuglyLaunchMonitorPlugin
的+ (void)endSpan:(NSString *)spanName
,记录自定义场景区间结束,请务必跟开启打点的spanName相同,否则记为无效数据[BuglyLaunchMonitorPlugin endSpan:@"testSpan"];
调用
BuglyLaunchMonitorPlugin
的+ (**void**)endSpanFromLaunch:(NSString *)spanName
,记录从进程创建开始统计的 span 耗时[BuglyLaunchMonitorPlugin endSpanFromLaunch:@"testSpan"];
设置启动 tag
调用
BuglyLaunchMonitorPlugin
的- (void)addTag:(NSString *)tagName
,添加一个tag调用
BuglyLaunchMonitorPlugin
的- (void)removeTag:(NSString *)tagName
,删除一个tag[BuglyLaunchMonitorPlugin addTag:@"tagTest1"];
[BuglyLaunchMonitorPlugin removeTag:@"tagTest1"];
自定义启动结束时间
因为业务特性,业务定义启动结束时间点并不仅是到CA::Transaction::commit
结束。所以增加 - (void)endColdLaunch
接口用于业务主动调用声明冷启动已经结束,调用该接口会触发启动数据上报,后续更新tag或者span信息将不会生效。
如果接口未被调用,退后台、闪退、或者超过一定时间后(默认3分钟)也会触发启动数据上报。
[BuglyLaunchMonitorPlugin endColdLaunch];