压力(TSStress)
该模块提供压力水平测量、自动监测和历史数据同步的功能。通过手动测量或设备自动监测获取用户压力数据,支持配置自动监测参数,以及同步原始数据和每日聚合数据。
前提条件
- 设备需支持压力测量功能
- 用户需授予相关健康数据权限
- 对于自动监测功能,设备需支持自动压力监测
- 时间参数使用 Unix 时间戳(秒数,自 1970 年 1 月 1 日以来)
数据模型
TSStressValueItem
单条压力测量数据模型。
| 属性名 | 类型 | 说明 |
|---|---|---|
stressValue | UInt8 | 压力水平值,通常范围 0–100 |
isUserInitiated | BOOL | 指示测量是否为用户主动发起 |
startTime | NSTimeInterval | 测量/时段开始时间(秒级时间戳) |
endTime | NSTimeInterval | 测量/时段结束时间(秒级时间戳) |
duration | NSTimeInterval | 测量持续时长(秒) |
valueType | TSHealthValueType | 值类型标记(如最大值、最小值等) |
TSStressDailyModel
按日聚合的压力数据模型。
| 属性名 | 类型 | 说明 |
|---|---|---|
maxStressItem | TSStressValueItem * | 当天最大压力条目 |
minStressItem | TSStressValueItem * | 当天最小压力条目 |
manualItems | NSArray<TSStressValueItem *> * | 主动测量压力条目数组(按时间升序) |
autoItems | NSArray<TSStressValueItem *> * | 自动监测压力条目数组(按时间升序) |
dayStartTime | NSTimeInterval | 统计日期的开始时间(00:00:00) |
枚举与常量
无特殊枚举类型定义。设备支持情况通过接口方法的 BOOL 返回值检查。
回调类型
| 回调签名 | 说明 |
|---|---|
void (^)(BOOL success, NSError * _Nullable error) | 测量开始/停止完成回调;success 表示操作是否成功 |
void (^)(TSStressValueItem * _Nullable data, NSError * _Nullable error) | 实时数据接收回调;data 为实时测量数据或 nil |
void (^)(NSArray<TSStressValueItem *> * _Nullable, NSError * _Nullable error) | 原始数据同步完成回调 |
void (^)(NSArray<TSStressDailyModel *> * _Nullable, NSError * _Nullable error) | 每日聚合数据同步完成回调 |
接口方法
检查手动测量支持
- (BOOL)isSupportActivityMeasureByUser;
检查设备是否支持用户手动发起的压力测量。
返回值
| 返回值 | 说明 |
|---|---|
YES | 设备支持手动压力测量 |
NO | 设备不支持手动压力测量 |
代码示例
id<TSStressInterface> stressInterface = ...; // 获取压力接口实例
if ([stressInterface isSupportActivityMeasureByUser]) {
TSLog(@"设备支持手动压力测量");
} else {
TSLog(@"设备不支持手动压力测量");
}
开始压力测量
- (void)startMeasureWithParam:(TSActivityMeasureParam *_Nonnull)measureParam
startHandler:(void(^_Nullable)(BOOL success, NSError * _Nullable error))startHandler
dataHandler:(void(^_Nullable)(TSStressValueItem * _Nullable data, NSError * _Nullable error))dataHandler
endHandler:(void(^_Nullable)(BOOL success, NSError * _Nullable error))endHandler;
使用指定参数开始压力测量,并通过回调接收测量过程事件。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
measureParam | TSActivityMeasureParam * | 测量活动参数(如目标持续时长) |
startHandler | void (^)(BOOL, NSError *) | 测量启动回调;success 表示是否成功启动,error 为失败原因 |
dataHandler | void (^)(TSStressValueItem *, NSError *) | 实时数据回调;data 为实时压力数据,error 为失败原因 |
endHandler | void (^)(BOOL, NSError *) | 测量结束回调;success 表示是否正常结束(YES)或被中断(NO),error 为异常原因 |
代码示例
id<TSStressInterface> stressInterface = ...; // 获取压力接口实例
// 创建测量参数(假设 TSActivityMeasureParam 包含持续时长等字段)
TSActivityMeasureParam *param = [[TSActivityMeasureParam alloc] init];
param.duration = 60; // 持续 60 秒
[stressInterface startMeasureWithParam:param
startHandler:^(BOOL success, NSError * _Nullable error) {
if (success) {
TSLog(@"压力测量已启动");
} else {
TSLog(@"启动失败: %@", error.localizedDescription);
}
} dataHandler:^(TSStressValueItem * _Nullable data, NSError * _Nullable error) {
if (data) {
TSLog(@"实时压力值: %d", data.stressValue);
} else if (error) {
TSLog(@"数据接收失败: %@", error.localizedDescription);
}
} endHandler:^(BOOL success, NSError * _Nullable error) {
if (success) {
TSLog(@"压力测量正常结束");
} else {
TSLog(@"测量被中断: %@", error.localizedDescription);
}
}];
停止压力测量
- (void)stopMeasureCompletion:(nonnull TSCompletionBlock)completion;
停止正在进行的压力测量。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
completion | TSCompletionBlock | 完成回调(void (^)(NSError *) 类型) |
代码示例
id<TSStressInterface> stressInterface = ...; // 获取压力接口实例
[stressInterface stopMeasureCompletion:^(NSError * _Nullable error) {
if (!error) {
TSLog(@"压力测量已停止");
} else {
TSLog(@"停止失败: %@", error.localizedDescription);
}
}];
检查自动监测支持
- (BOOL)isSupportAutomaticMonitoring;
检查设备是否支持自动压力监测。
返回值
| 返回值 | 说明 |
|---|---|
YES | 设备支持自动压力监测 |
NO | 设备不支持自动压力监测 |
代码示例
id<TSStressInterface> stressInterface = ...; // 获取压力接口实例
if ([stressInterface isSupportAutomaticMonitoring]) {
TSLog(@"设备支持自动压力监测");
} else {
TSLog(@"设备不支持自动压力监测");
}
检查监测时间段支持
- (BOOL)isSupportMonitorScheduleTime;
检查设备是否支持配置压力监测时间段(开始和结束时间)。
返回值
| 返回值 | 说明 |
|---|---|
YES | 设备支持配置监测时间段,TSMonitorSchedule 的 startTime 和 endTime 字段有效 |
NO | 设备不支持配置监测时间段 |
代码示例
id<TSStressInterface> stressInterface = ...; // 获取压力接口实例
if ([stressInterface isSupportMonitorScheduleTime]) {
TSLog(@"可配置监测时间段");
} else {
TSLog(@"不支持配置监测时间段");
}
检查监测间隔支持
- (BOOL)isSupportMonitorScheduleInterval;
检查设备是否支持配置压力监测间隔时间。
返回值
| 返回值 | 说明 |
|---|---|
YES | 设备支持配置监测间隔,TSMonitorSchedule 的 interval 字段有效 |
NO | 设备不支持配置监测间隔 |
代码示例
id<TSStressInterface> stressInterface = ...; // 获取压力接口实例
if ([stressInterface isSupportMonitorScheduleInterval]) {
TSLog(@"可配置监测间隔");
} else {
TSLog(@"不支持配置监测间隔");
}
配置自动监测
- (void)pushAutoMonitorConfigs:(TSAutoMonitorConfigs *_Nonnull)configuration
completion:(nonnull TSCompletionBlock)completion;
配置设备自动压力监测参数。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
configuration | TSAutoMonitorConfigs * | 自动监测配置参数 |
completion | TSCompletionBlock | 完成回调(void (^)(NSError *) 类型) |
代码示例
id<TSStressInterface> stressInterface = ...; // 获取压力接口实例
TSAutoMonitorConfigs *config = [[TSAutoMonitorConfigs alloc] init];
// 根据设备支持情况配置各字段
// 例如设置监测时间段、间隔等
[stressInterface pushAutoMonitorConfigs:config completion:^(NSError * _Nullable error) {
if (!error) {
TSLog(@"自动监测配置已设置");
} else {
TSLog(@"配置失败: %@", error.localizedDescription);
}
}];
获取自动监测配置
- (void)fetchAutoMonitorConfigsWithCompletion:(nonnull void (^)(TSAutoMonitorConfigs *_Nullable configuration, NSError *_Nullable error))completion;
获取当前自动压力监测配置。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
completion | void (^)(TSAutoMonitorConfigs *, NSError *) | 完成回调,返回当前配置或错误信息 |
代码示例
id<TSStressInterface> stressInterface = ...; // 获取压力接口实例
[stressInterface fetchAutoMonitorConfigsWithCompletion:^(TSAutoMonitorConfigs * _Nullable configuration, NSError * _Nullable error) {
if (configuration) {
TSLog(@"当前自动监测配置: %@", configuration);
} else if (error) {
TSLog(@"获取配置失败: %@", error.localizedDescription);
}
}];
同步指定时间范围内的原始数据
- (void)syncRawDataFromStartTime:(NSTimeInterval)startTime
endTime:(NSTimeInterval)endTime
completion:(nonnull void (^)(NSArray<TSStressValueItem *> *_Nullable stressItems, NSError *_Nullable error))completion;
同步指定时间范围内的原始压力测量数据。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
startTime | NSTimeInterval | 开始时间(秒级 Unix 时间戳);必须早于 endTime |
endTime | NSTimeInterval | 结束时间(秒级 Unix 时间戳);必须晚于 startTime |
completion | void (^)(NSArray *, NSError *) | 完成回调,返回 TSStressValueItem 数组或错误 |
代码示例
id<TSStressInterface> stressInterface = ...; // 获取压力接口实例
// 同步过去 7 天的原始压力数据
NSTimeInterval now = [[NSDate date] timeIntervalSince1970];
NSTimeInterval sevenDaysAgo = now - (7 * 24 * 3600);
[stressInterface syncRawDataFromStartTime:sevenDaysAgo
endTime:now
completion:^(NSArray<TSStressValueItem *> * _Nullable stressItems, NSError * _Nullable error) {
if (stressItems) {
TSLog(@"获取到 %lu 条原始压力数据", (unsigned long)stressItems.count);
for (TSStressValueItem *item in stressItems) {
TSLog(@"压力值: %d, 用户主动: %@", item.stressValue, item.isUserInitiated ? @"是" : @"否");
}
} else if (error) {
TSLog(@"同步失败: %@", error.localizedDescription);
}
}];
同步从指定时间至今的原始数据
- (void)syncRawDataFromStartTime:(NSTimeInterval)startTime
completion:(nonnull void (^)(NSArray<TSStressValueItem *> *_Nullable stressItems, NSError *_Nullable error))completion;
同步从指定时间至当前时刻的原始压力测量数据。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
startTime | NSTimeInterval | 开始时间(秒级 Unix 时间戳) |
completion | void (^)(NSArray *, NSError *) | 完成回调,返回 TSStressValueItem 数组或错误 |
代码示例
id<TSStressInterface> stressInterface = ...; // 获取压力接口实例
// 同步从昨天开始至今的原始压力数据
NSTimeInterval now = [[NSDate date] timeIntervalSince1970];
NSTimeInterval yesterday = now - (24 * 3600);
[stressInterface syncRawDataFromStartTime:yesterday
completion:^(NSArray<TSStressValueItem *> * _Nullable stressItems, NSError * _Nullable error) {
if (stressItems) {
TSLog(@"共同步 %lu 条数据", (unsigned long)stressItems.count);
} else if (error) {
TSLog(@"同步失败: %@", error.localizedDescription);
}
}];
同步指定时间范围内的每日聚合数据
- (void)syncDailyDataFromStartTime:(NSTimeInterval)startTime
endTime:(NSTimeInterval)endTime
completion:(nonnull void (^)(NSArray<TSStressDailyModel *> *_Nullable dailyModels, NSError *_Nullable error))completion;
同步指定时间范围内的每日聚合压力数据。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
startTime | NSTimeInterval | 开始时间(秒级 Unix 时间戳),自动规范化为该日 00:00:00 |
endTime | NSTimeInterval | 结束时间(秒级 Unix 时间戳),自动规范化为该日 23:59:59;不能为未来时间 |
completion | void (^)(NSArray *, NSError *) | 完成回调,返回 TSStressDailyModel 数组或错误 |
代码示例
id<TSStressInterface> stressInterface = ...; // 获取压力接口实例
// 同步过去 30 天的每日聚合压力数据
NSTimeInterval now = [[NSDate date] timeIntervalSince1970];
NSTimeInterval thirtyDaysAgo = now - (30 * 24 * 3600);
[stressInterface syncDailyDataFromStartTime:thirtyDaysAgo
endTime:now
completion:^(NSArray<TSStressDailyModel *> * _Nullable dailyModels, NSError * _Nullable error) {
if (dailyModels) {
TSLog(@"获取到 %lu 天的数据", (unsigned long)dailyModels.count);
for (TSStressDailyModel *dailyModel in dailyModels) {
TSLog(@"日期: %f, 最大压力: %d, 最小压力: %d, 主动测量: %lu 条, 自动监测: %lu 条",
dailyModel.dayStartTime,
[dailyModel maxStress],
[dailyModel minStress],
(unsigned long)dailyModel.manualItems.count,
(unsigned long)dailyModel.autoItems.count);
}
} else if (error) {
TSLog(@"同步失败: %@", error.localizedDescription);
}
}];
同步从指定时间至今的每日聚合数据
- (void)syncDailyDataFromStartTime:(NSTimeInterval)startTime
completion:(nonnull void (^)(NSArray<TSStressDailyModel *> *_Nullable dailyModels, NSError *_Nullable error))completion;
同步从指定时间至当前时刻的每日聚合压力数据。
参数
| 参数名 | 类型 | 说明 |
|---|---|---|
startTime | NSTimeInterval | 开始时间(秒级 Unix 时间戳),自动规范化为该日 00:00:00 |
completion | void (^)(NSArray *, NSError *) | 完成回调,返回 TSStressDailyModel 数组或错误 |
代码示例
id<TSStressInterface> stressInterface = ...; // 获取压力接口实例
// 同步从本月开始至今的每日聚合压力数据
NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:now];
components.day = 1; // 设置为月初
NSDate *monthStart = [calendar dateFromComponents:components];
NSTimeInterval startTime = [monthStart timeIntervalSince1970];
[stressInterface syncDailyDataFromStartTime:startTime
completion:^(NSArray<TSStressDailyModel *> * _Nullable dailyModels, NSError * _Nullable error) {
if (dailyModels) {
TSLog(@"本月已获取 %lu 天的聚合数据", (unsigned long)dailyModels.count);
NSUInteger totalMeasurements = 0;
for (TSStressDailyModel *dailyModel in dailyModels) {
totalMeasurements += dailyModel.manualItems.count + dailyModel.autoItems.count;
}
TSLog(@"本月共计 %lu 条测量记录", (unsigned long)totalMeasurements);
} else if (error) {
TSLog(@"同步失败: %@", error.localizedDescription);
}
}];
注意事项
-
时间参数格式:所有时间参数均使用秒级 Unix 时间戳(自 1970 年 1 月 1 日 UTC 00:00:00 起的秒数),通过
NSDate的timeIntervalSince1970属性获取。 -
手动测量前检查:在调用
startMeasureWithParam:...前,应先调用isSupportActivityMeasureByUser确认设备支持手动测量。 -
自动监测配置前检查:在配置自动监测前,应分别调用
isSupportAutomaticMonitoring、isSupportMonitorScheduleTime和isSupportMonitorScheduleInterval检查设备支持的功能,以便正确填充TSAutoMonitorConfigs对象。 -
每日数据时间规范化:
syncDailyDataFromStartTime:endTime:completion:方法会自动将startTime规范化为指定日期的 00:00:00,将endTime规范化为指定日期的 23:59:59;调用者无需手动调整。 -
回调线程:数据同步完成回调在主线程中执行,可直接更新 UI。
-
错误处理:所有接口方法都提供
NSError参数用于错误反馈,应检查 error 对象并根据errorCode和localizedDescription进行相应处理。 -
实时数据处理:在
startMeasureWithParam:...的dataHandler中接收实时压力数据时,应避免阻塞操作以免影响数据流传输。 -
数据排序:同步返回的压力数据和每日模型均按时间升序排列;同步的每日模型中,
manualItems和autoItems也按时间升序排列。