跳到主要内容

睡眠 (TSSleep)

TopStepComKit iOS SDK 睡眠模块提供从设备同步睡眠数据的完整接口,包括夜间睡眠和日间小睡(如支持)。数据包含详细的睡眠阶段、质量指标和全面的睡眠分析。

前提条件​

  • 设备已配对并连接
  • 设备支持睡眠数据采集功能
  • 用户已授予睡眠数据访问权限

数据模型​

TSSleepDailyModel(每日睡眠数据)​

属性名类型说明
statisticsRuleTSSleepStatisticsRule此睡眠记录使用的统计规则
dailySummaryTSSleepSummary *当日睡眠总体汇总
rawSleepItemsNSArray<TSSleepDetailItem *> *原始睡眠数据条目数组
nightSleepsNSArray<TSSleepSegment *> *夜间睡眠段数组
daytimeSleepsNSArray<TSSleepSegment *> *日间睡眠段数组

TSSleepDetailItem(睡眠详情条目)​

属性名类型说明
stageTSSleepStage睡眠阶段类型(清醒/浅睡/深睡/REM)
belongingDateNSTimeInterval所属日期时间戳(0时0分0秒)

TSSleepSegment(睡眠段)​

属性名类型说明
periodTypeTSSleepPeriodType睡眠时段类型(夜间/日间)
summaryTSSleepSummary *睡眠汇总统计
detailItemsNSArray<TSSleepDetailItem *> *按时间顺序的睡眠阶段详情条目数组

TSSleepSummary(睡眠汇总)​

属性名类型说明
startTimeNSTimeInterval睡眠开始时间(Unix时间戳)
endTimeNSTimeInterval睡眠结束时间(Unix时间戳)
durationNSTimeInterval总持续时间(秒)
totalSleepDurationNSTimeInterval总睡眠时长(秒)
qualityScoreUInt8睡眠质量评分(0-100)
awakeDurationNSTimeInterval睡眠期间总清醒时长(秒)
lightSleepDurationNSTimeInterval总浅睡时长(秒)
deepSleepDurationNSTimeInterval总深睡时长(秒)
remDurationNSTimeInterval总REM时长(秒)
awakePercentageUInt8清醒时间百分比
lightSleepPercentageUInt8浅睡时间百分比
deepSleepPercentageUInt8深睡时间百分比
remPercentageUInt8REM时间百分比
awakeCountUInt16觉醒次数
lightSleepCountUInt16浅睡次数
deepSleepCountUInt16深睡次数
remCountUInt16REM次数

枚举与常量​

TSSleepStatisticsRule(睡眠统计规则)​

值说明
TSSleepStatisticsRuleWithoutNap不带小睡功能,传感器20:00-12:00激活,所有睡眠视为夜间睡眠
TSSleepStatisticsRuleWithNap带小睡功能,传感器24小时激活,区分夜间和日间睡眠
TSSleepStatisticsRuleLongestNight使用最长连续夜间睡眠段(20:00-08:00),有效小睡计入统计
TSSleepStatisticsRuleLongestOnly不区分夜间和日间,仅使用最长连续睡眠段

TSSleepStage(睡眠阶段)​

值说明
TSSleepStageAwake清醒阶段
TSSleepStageLight浅睡阶段(N1和N2期)
TSSleepStageDeep深睡阶段(N3期,慢波睡眠)
TSSleepStageREM快速眼动阶段(做梦阶段)

TSSleepPeriodType(睡眠时段类型)​

值说明
TSSleepPeriodTypeNight夜间睡眠(20:00-09:00)
TSSleepPeriodTypeDaytime日间睡眠(09:00-20:00)

接口方法​

获取睡眠统计规则​

- (TSSleepStatisticsRule)sleepStatisticsRule;

获取当前设备使用的睡眠统计规则(算法)。

参数类型说明
返回值TSSleepStatisticsRule设备使用的睡眠统计规则

代码示例:

id<TSSleepInterface> sleepInterface = [device getInterface:@protocol(TSSleepInterface)];
TSSleepStatisticsRule rule = [sleepInterface sleepStatisticsRule];
TSLog(@"设备睡眠统计规则: %ld", (long)rule);

检查REM睡眠支持​

- (BOOL)isSupportREMSleep;

检查设备是否支持REM(快速眼动)睡眠阶段识别。

参数类型说明
返回值BOOL是否支持REM睡眠

代码示例:

id<TSSleepInterface> sleepInterface = [device getInterface:@protocol(TSSleepInterface)];
BOOL supportREM = [sleepInterface isSupportREMSleep];
TSLog(@"设备支持REM睡眠: %@", supportREM ? @"是" : @"否");

检查睡眠分析支持​

- (BOOL)isSupportSleepAnalysis;

返回设备是否支持睡眠分析能力;调用分析相关功能前应先检查该值。

同步原始睡眠分段(从指定时间开始)​

- (void)syncRawDataFromStartTime:(NSTimeInterval)startTime
completion:(nonnull void (^)(NSArray<TSSleepDetailItem *> *_Nullable sleepItems, NSError *_Nullable error))completion;

从指定开始时间同步原始睡眠分段数据。

参数类型说明
startTimeNSTimeInterval起始时间的Unix时间戳(秒)
completionvoid (^)(NSArray<TSSleepDetailItem *> *, NSError *)回调返回睡眠条目数组或错误

代码示例:

id<TSSleepInterface> sleepInterface = [device getInterface:@protocol(TSSleepInterface)];
NSTimeInterval startTime = [[NSDate dateWithTimeIntervalSinceNow:-7*24*3600] timeIntervalSince1970];

[sleepInterface syncRawDataFromStartTime:startTime completion:^(NSArray<TSSleepDetailItem *> * _Nullable sleepItems, NSError * _Nullable error) {
if (error) {
TSLog(@"同步失败: %@", error.localizedDescription);
return;
}
TSLog(@"同步成功,获得 %lu 条睡眠数据", (unsigned long)sleepItems.count);
for (TSSleepDetailItem *item in sleepItems) {
TSLog(@"阶段: %ld, 时长: %.0f秒", (long)item.stage, item.duration);
}
}];

同步原始睡眠分段(时间范围)​

- (void)syncRawDataFromStartTime:(NSTimeInterval)startTime
endTime:(NSTimeInterval)endTime
completion:(nonnull void (^)(NSArray<TSSleepDetailItem *> *_Nullable sleepItems, NSError *_Nullable error))completion;

在指定时间区间内同步原始睡眠分段数据。

参数类型说明
startTimeNSTimeInterval区间开始时间的Unix时间戳(秒,含)
endTimeNSTimeInterval区间结束时间的Unix时间戳(秒,不含)
completionvoid (^)(NSArray<TSSleepDetailItem *> *, NSError *)回调返回睡眠条目数组或错误

代码示例:

id<TSSleepInterface> sleepInterface = [device getInterface:@protocol(TSSleepInterface)];
NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:-7*24*3600];
NSDate *endDate = [NSDate date];

[sleepInterface syncRawDataFromStartTime:[startDate timeIntervalSince1970]
endTime:[endDate timeIntervalSince1970]
completion:^(NSArray<TSSleepDetailItem *> * _Nullable sleepItems, NSError * _Nullable error) {
if (error) {
TSLog(@"同步失败: %@", error.localizedDescription);
return;
}
TSLog(@"获得 %lu 条睡眠数据", (unsigned long)sleepItems.count);
}];

同步按天聚合睡眠数据(从指定时间开始)​

- (void)syncDailyDataFromStartTime:(NSTimeInterval)startTime
completion:(nonnull void (^)(NSArray<TSSleepDailyModel *> *_Nullable sleepModel, NSError *_Nullable error))completion;

从指定开始时间同步按天聚合的睡眠数据。

参数类型说明
startTimeNSTimeInterval起始"自然日"的Unix时间戳(秒)
completionvoid (^)(NSArray<TSSleepDailyModel *> *, NSError *)回调返回每日睡眠模型数组或错误

代码示例:

id<TSSleepInterface> sleepInterface = [device getInterface:@protocol(TSSleepInterface)];
NSTimeInterval startTime = [[NSDate dateWithTimeIntervalSinceNow:-30*24*3600] timeIntervalSince1970];

[sleepInterface syncDailyDataFromStartTime:startTime completion:^(NSArray<TSSleepDailyModel *> * _Nullable sleepModels, NSError * _Nullable error) {
if (error) {
TSLog(@"同步失败: %@", error.localizedDescription);
return;
}
for (TSSleepDailyModel *model in sleepModels) {
TSLog(@"日期: %@, 总睡眠: %.0f秒, 质量评分: %d",
[NSDate dateWithTimeIntervalSince1970:model.dailySummary.startTime],
model.dailySummary.totalSleepDuration,
model.dailySummary.qualityScore);
}
}];

同步按天聚合睡眠数据(时间范围)​

- (void)syncDailyDataFromStartTime:(NSTimeInterval)startTime
endTime:(NSTimeInterval)endTime
completion:(nonnull void (^)(NSArray<TSSleepDailyModel *> *_Nullable sleepModel, NSError *_Nullable error))completion;

在指定时间区间内同步按天聚合的睡眠数据。

参数类型说明
startTimeNSTimeInterval区间起始"自然日"的Unix时间戳(秒,含)
endTimeNSTimeInterval区间结束"自然日"的Unix时间戳(秒,不含)
completionvoid (^)(NSArray<TSSleepDailyModel *> *, NSError *)回调返回每日睡眠模型数组或错误

代码示例:

id<TSSleepInterface> sleepInterface = [device getInterface:@protocol(TSSleepInterface)];
NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:-30*24*3600];
NSDate *endDate = [NSDate date];

[sleepInterface syncDailyDataFromStartTime:[startDate timeIntervalSince1970]
endTime:[endDate timeIntervalSince1970]
completion:^(NSArray<TSSleepDailyModel *> * _Nullable sleepModels, NSError * _Nullable error) {
if (error) {
TSLog(@"同步失败: %@", error.localizedDescription);
return;
}
TSLog(@"获得 %lu 天的睡眠数据", (unsigned long)sleepModels.count);
for (TSSleepDailyModel *model in sleepModels) {
NSArray<TSSleepSegment *> *validNaps = [model validNaps];
TSLog(@"夜间睡眠段: %lu, 有效小睡: %lu",
(unsigned long)model.nightSleeps.count,
(unsigned long)validNaps.count);
}
}];

注意事项​

  1. 睡眠数据以20:00为跨天分隔线,即20:00-20:00为一个睡眠日,不同于自然日(00:00-00:00)
  2. 不同设备支持的睡眠统计规则不同,使用前应调用sleepStatisticsRule确认设备规则
  3. REM睡眠阶段并非所有设备都支持,使用前应调用isSupportREMSleep检查
  4. 原始睡眠数据包含清醒段,用于精细分析;按天聚合数据已处理清醒段,用于日常统计
  5. 有效小睡定义为时长在20分钟至3小时之间的日间睡眠段
  6. 时间参数均为Unix时间戳(秒),范围为[startTime, endTime),不包含endTime
  7. 同步操作为异步操作,回调在主线程执行