跳到主要内容

运动(TSSport)

TSSport 模块提供了完整的运动活动数据管理接口,包括运动历史数据同步、详细指标、心率数据和各种运动类型的活动摘要。开发者可以通过该模块获取设备上记录的各类运动活动数据,并进行统计分析。

前提条件

  1. 已正确初始化 TopStepComKit SDK 并获取设备连接
  2. 设备已支持运动数据记录功能
  3. 用户已授予应用健康数据访问权限

数据模型

TSSportModel(运动活动模型)

属性名类型说明
summaryTSSportSummaryModel *运动活动总结数据,包含整体统计和性能指标
sportItemsNSArray<TSSportItemModel *> *运动详细数据项数组,包含每个时间段的具体指标
heartRateItemsNSArray<TSHRValueItem *> *心率数据数组,包含整个运动过程中的心率测量值

TSSportSummaryModel(运动总结模型)

属性名类型说明
startTimeNSTimeInterval运动开始时间戳(秒)
endTimeNSTimeInterval运动结束时间戳(秒)
durationdouble运动持续时间(秒)
userIDNSString *用户标识符
macAddressNSString *设备MAC地址
sportIDlong运动活动标识符
typeTSSportTypeEnum运动类型
stepsUInt32总步数
distanceUInt32总距离(米)
calorieUInt32总卡路里消耗
maxHrValueUInt8最大心率(BPM)
minHrValueUInt8最小心率(BPM)
avgHrValueUInt8平均心率(BPM)
maxPacefloat最大配速(秒/公里)
minPacefloat最小配速(秒/公里)
avgPacefloat平均配速(秒/公里)
maxSpeedfloat最大速度(米/秒)
minSpeedfloat最小速度(米/秒)
avgSpeedfloat平均速度(米/秒)
maxCadenceUInt16最大步频(步/分钟)
minCadenceUInt16最小步频(步/分钟)
avgCadenceUInt16平均步频(步/分钟)
warmHrDurationUInt32热身心率区间时长(秒)
fatBurnHrDurationUInt32脂肪燃烧心率区间时长(秒)
aerobicHrDurationUInt32有氧心率区间时长(秒)
anaerobicHrDurationUInt32无氧心率区间时长(秒)
extremeHrDurationUInt32极限心率区间时长(秒)
warmHrRatioUInt8热身心率区间时间占比(0-100%)
fatBurnHrRatioUInt8脂肪燃烧心率区间时间占比(0-100%)
aerobicHrRatioUInt8有氧心率区间时间占比(0-100%)
anaerobicHrRatioUInt8无氧心率区间时间占比(0-100%)
extremeHrRatioUInt8极限心率区间时间占比(0-100%)
displayConfigsNSData *显示配置位图(最大32字节,nil表示不支持)

TSSportItemModel(运动详情项模型)

属性名类型说明
userIDNSString *用户标识符
macAddressNSString *设备MAC地址
sportIDlong运动活动标识符
typeUInt16运动类型
distanceNSInteger距离(米)
stepsNSInteger步数
caloriesNSInteger卡路里消耗
paceNSInteger配速(秒/公里)
cadenceNSInteger步频(步/分钟)
speedNSInteger速度(米/分钟)
swimStyleint游泳姿势(1=自由泳、2=蛙泳、3=仰泳、4=蝶泳)
swimLapsint游泳趟数
swimStrokesint游泳划水次数
swimStrokeFreqint游泳划水频率(次/分钟)
swolfint游泳效率指数(SWOLF)
jumpCountint跳绳总次数
jumpBkCountint跳绳中断次数
jumpConsCountint跳绳连续次数
elCountint椭圆机步数
elFrequecyint椭圆机频率(步/分钟)
elMaxFrequecyint椭圆机最大频率(步/分钟)
elMinFrequecyint椭圆机最小频率(步/分钟)
rowCountint划船机划桨次数
rowFrequecyint划船机频率(次/分钟)
rowMaxFrequecyint划船机最大频率(次/分钟)
rowMinFrequecyint划船机最小频率(次/分钟)

TSSportDailyModel(运动日统计模型)

属性名类型说明
sportRecordsNSArray<TSSportModel *> *当天的运动活动记录数组
sportCountNSUInteger当天运动次数
totalDurationNSTimeInterval当天总运动时长(秒)
maxHeartRateUInt8当天最大心率(BPM)
minHeartRateUInt8当天最小心率(BPM)

枚举与常量

TSSportTypeEnum(运动类型枚举)

枚举值说明
TSSportTypeOutdoorCycling户外骑行
TSSportTypeOutdoorRunning户外跑步
TSSportTypeIndoorRunning室内跑步
TSSportTypeOutdoorWalking户外健走
TSSportTypeClimbing登山
TSSportTypeBasketball篮球
TSSportTypeSwimming游泳
TSSportTypeBadminton羽毛球
TSSportTypeFootball足球
TSSportTypeElliptical椭圆机
TSSportTypeYoga瑜伽
TSSportTypePingPong乒乓球
TSSportTypeRopeSkipping跳绳
TSSportTypeRowing划船机
TSSportTypeLazyBike懒人车
TSSportTypeFitnessBike健身车
TSSportTypeFreeTraining自由训练
TSSportTypeTennis网球
TSSportTypeBaseball棒球
TSSportTypeRugby橄榄球
TSSportTypeCricket板球
TSSportTypeFreeSports自由运动
TSSportTypeStrengthTraining力量训练
TSSportTypeIndoorWalking室内走路
TSSportTypeIndoorCycling室内骑行
TSSportTypeDumbbell哑铃
TSSportTypeDance舞蹈
TSSportTypeHulaHoop呼啦圈
TSSportTypeGolf高尔夫
TSSportTypeLongJump跳远
TSSportTypeSitUp仰卧起坐
TSSportTypeVolleyball排球
TSSportTypeParkour跑酷
TSSportTypeHiking徒步
TSSportTypeHockey曲棍球
TSSportTypeBoating划船
TSSportTypeHIITHIIT
TSSportTypeSoftball垒球
TSSportTypeTrailRunning越野跑
TSSportTypeSkiing滑雪
TSSportTypeTreadmill漫步机
TSSportTypeRelaxation整理放松
TSSportTypeCrossTraining交叉训练
TSSportTypePilates普拉提
TSSportTypeCrossMatch交叉配合
TSSportTypeFunctionalTraining功能性训练
TSSportTypePhysicalTraining体能训练
TSSportTypeMixedCardio混合有氧
TSSportTypeLatinDance拉丁舞
TSSportTypeStreetDance街舞
TSSportTypeFreeSparring自由搏击
TSSportTypeBallet芭蕾
TSSportTypeAustralianFootball澳式足球
TSSportTypeBowling保龄球
TSSportTypeSquash壁球
TSSportTypeCurling冰壶
TSSportTypeSnowboarding单板滑雪
TSSportTypeFishing钓鱼
TSSportTypeFrisbee飞盘
TSSportTypeAlpineSkiing高山滑雪
TSSportTypeCoreTraining核心训练
TSSportTypeSkating滑冰
TSSportTypeFitnessGaming健身游戏
TSSportTypeAerobics健身操
TSSportTypeGroupCallisthenics团体操
TSSportTypeKickBoxing搏击操
TSSportTypeFencing击剑
TSSportTypeStairClimbing爬楼
TSSportTypeAmericanFootball美式橄榄球
TSSportTypeFoamRolling泡沫轴筋膜放松
TSSportTypePickleball匹克球
TSSportTypeBoxing拳击
TSSportTypeTaekwondo跆拳道
TSSportTypeKarate空手道
TSSportTypeFlexibility柔韧度
TSSportTypeHandball手球
TSSportTypeHandcar手摇车
TSSportTypeMeditation舒缓冥想类运动
TSSportTypeWrestling摔跤
TSSportTypeStepping踏步
TSSportTypeTaiChi太极
TSSportTypeGymnastics体操
TSSportTypeTrackAndField田径
TSSportTypeMartialArts武术
TSSportTypeLeisureSports休闲运动
TSSportTypeSnowSports雪上运动
TSSportTypeLacrosse长曲棍球
TSSportTypeHorizontalBar单杠
TSSportTypeParallelBars双杠
TSSportTypeRollerSkating轮滑
TSSportTypeDarts飞镖
TSSportTypeArchery射箭
TSSportTypeHorseRiding骑马
TSSportTypeShuttlecock毽球
TSSportTypeIceHockey冰球
TSSportTypeAbdominalTraining腰腹训练
TSSportTypeVO2MaxTest最大摄氧量测试
TSSportTypeJudo柔道
TSSportTypeTrampolining蹦床
TSSportTypeSkateboard滑板
TSSportTypeHoverBoard平衡车
TSSportTypeInlineSkating溜旱冰
TSSportTypeTreadmillRunning跑步机
TSSportTypeDiving跳水
TSSportTypeSurfing冲浪
TSSportTypeSnorkeling浮潜
TSSportTypePullUp引体向上
TSSportTypePushUp俯卧撑
TSSportTypePlank平板支撑
TSSportTypeRockClimbing攀岩
TSSportTypeHighJump跳高
TSSportTypeBungeeJumping蹦极
TSSportTypeNationalDance民族舞
TSSportTypeHunting打猎
TSSportTypeShooting射击
TSSportTypeMarathon马拉松
TSSportTypeSpinningBike动感单车
TSSportTypePoolSwimming泳池游泳
TSSportTypeOpenWaterSwimming开放水域游泳
TSSportTypeBallroomDance交际舞
TSSportTypeZumba尊巴
TSSportTypeJazzDance爵士舞
TSSportTypeStepMachine踏步机
TSSportTypeStairMachine爬楼机
TSSportTypeCroquet门球
TSSportTypeWaterPolo水球
TSSportTypeWallBall墙球
TSSportTypeBilliards台球
TSSportTypeSepakTakraw藤球
TSSportTypeStretching拉伸
TSSportTypeFreeGymnastics自由体操
TSSportTypeBarbell杠铃
TSSportTypeWeightlifting举重
TSSportTypeDeadlift硬拉
TSSportTypeBurpee波比跳
TSSportTypeJumpingJack开合跳
TSSportTypeUpperBodyTraining上肢训练
TSSportTypeLowerBodyTraining下肢训练
TSSportTypeBackTraining背部训练
TSSportTypeBeachBuggy沙滩车
TSSportTypeParagliding滑翔伞
TSSportTypeFlyAKite放风筝
TSSportTypeTugOfWar拔河
TSSportTypeTriathlon铁人三项
TSSportTypeSnowmobile雪地摩托
TSSportTypeSnowCar雪车
TSSportTypeSled雪橇
TSSportTypeSkiBoard滑雪板
TSSportTypeCrossCountrySkiing越野滑雪
TSSportTypeIndoorSkating室内滑冰
TSSportTypeKabaddi卡巴迪
TSSportTypeMuayThai泰拳
TSSportTypeKickboxing踢拳
TSSportTypeRacing赛车
TSSportTypeIndoorFitness室内健身
TSSportTypeOutdoorSoccer户外足球
TSSportTypeBellyDance肚皮舞
TSSportTypeSquareDance广场舞

TSSportDisplayMetric(运动显示指标枚举)

枚举值说明
TSSportDisplayMetricDuration持续时间
TSSportDisplayMetricHeartRate心率
TSSportDisplayMetricSteps步数
TSSportDisplayMetricDistance距离
TSSportDisplayMetricCalories卡路里
TSSportDisplayMetricAvgSpeed平均速度
TSSportDisplayMetricAvgPace平均配速
TSSportDisplayMetricAvgCadence平均步频
TSSportDisplayMetricAvgStride平均步幅
TSSportDisplayMetricTotalAscent累计上升
TSSportDisplayMetricTotalDescent累计下降
TSSportDisplayMetricSwimLaps游泳趟数
TSSportDisplayMetricSwimStrokes游泳划水次数
TSSportDisplayMetricSwimStyle泳姿
TSSportDisplayMetricSwimStrokeRate游泳划水频率
TSSportDisplayMetricSwimEfficiency游泳效率(SWOLF)
TSSportDisplayMetricTriggerCount触发次数
TSSportDisplayMetricTriggerRate触发频率
TSSportDisplayMetricInterruptionCount中断次数
TSSportDisplayMetricContinuousCount连续次数

接口方法

同步指定时间范围内的运动历史数据

- (void)syncHistoryDataFormStartTime:(NSTimeInterval)startTime
endTime:(NSTimeInterval)endTime
completion:(nonnull void (^)(NSArray<TSSportModel *> *_Nullable sports, NSError *_Nullable error))completion;

参数说明

参数名类型说明
startTimeNSTimeInterval数据同步开始时间(时间戳,单位秒)
endTimeNSTimeInterval数据同步结束时间(时间戳,单位秒)
completionvoid (^)(NSArray<TSSportModel *> *, NSError *)完成回调,返回同步的运动数据或错误信息

代码示例

id<TSSportInterface> sportInterface = (id<TSSportInterface>)manager;

NSTimeInterval startTime = [[NSDate dateWithTimeIntervalSinceNow:-7*24*3600] timeIntervalSince1970];
NSTimeInterval endTime = [[NSDate date] timeIntervalSince1970];

[sportInterface syncHistoryDataFormStartTime:startTime
endTime:endTime
completion:^(NSArray<TSSportModel *> * _Nullable sports, NSError * _Nullable error) {
if (error) {
TSLog(@"同步失败: %@", error.localizedDescription);
return;
}

TSLog(@"同步成功,获得 %lu 条运动记录", (unsigned long)sports.count);

for (TSSportModel *sport in sports) {
TSLog(@"运动类型: %ld, 距离: %u m, 卡路里: %u cal, 平均心率: %d bpm",
(long)sport.summary.type,
sport.summary.distance,
sport.summary.calorie,
sport.summary.avgHrValue);
}
}];

从指定时间开始同步至今的运动历史数据

- (void)syncHistoryDataFormStartTime:(NSTimeInterval)startTime
completion:(nonnull void (^)(NSArray<TSSportModel *> *_Nullable sports, NSError *_Nullable error))completion;

参数说明

参数名类型说明
startTimeNSTimeInterval数据同步开始时间(时间戳,单位秒)
completionvoid (^)(NSArray<TSSportModel *> *, NSError *)完成回调,返回同步的运动数据或错误信息

代码示例

id<TSSportInterface> sportInterface = (id<TSSportInterface>)manager;

// 从30天前开始同步至今
NSTimeInterval startTime = [[NSDate dateWithTimeIntervalSinceNow:-30*24*3600] timeIntervalSince1970];

[sportInterface syncHistoryDataFormStartTime:startTime
completion:^(NSArray<TSSportModel *> * _Nullable sports, NSError * _Nullable error) {
if (error) {
TSLog(@"同步失败: %@", error.localizedDescription);
return;
}

TSLog(@"同步成功,获得 %lu 条运动记录", (unsigned long)sports.count);

// 统计总运动时长
NSTimeInterval totalDuration = 0;
NSUInteger totalSteps = 0;
UInt32 totalCalories = 0;

for (TSSportModel *sport in sports) {
totalDuration += sport.summary.duration;
totalSteps += sport.summary.steps;
totalCalories += sport.summary.calorie;
}

TSLog(@"统计数据 - 总时长: %.0f分钟, 总步数: %lu, 总卡路里: %u",
totalDuration / 60,
(unsigned long)totalSteps,
totalCalories);
}];

显示指标辅助方法

获取已启用的显示指标数组

- (NSArray<NSNumber *> *)displayMetrics;

返回值

NSArray<NSNumber *> * —— 包含 TSSportDisplayMetric 枚举值的数组,每个数字表示一个启用的指标

代码示例

TSSportSummaryModel *summary = sport.summary;
NSArray<NSNumber *> *metrics = [summary displayMetrics];

TSLog(@"启用的显示指标数量: %lu", (unsigned long)metrics.count);

for (NSNumber *metricNum in metrics) {
TSSportDisplayMetric metric = (TSSportDisplayMetric)[metricNum unsignedIntegerValue];
NSString *name = [TSSportSummaryModel nameForDisplayMetric:metric];
TSLog(@"指标: %@", name);
}

检查特定显示指标是否已启用

- (BOOL)hasDisplayMetric:(TSSportDisplayMetric)metric;

参数说明

参数名类型说明
metricTSSportDisplayMetric要检查的显示指标

返回值

BOOL —— 指标已启用返回 YES,否则返回 NO

代码示例

TSSportSummaryModel *summary = sport.summary;

if ([summary hasDisplayMetric:TSSportDisplayMetricHeartRate]) {
TSLog(@"该运动支持显示心率数据");
}

if ([summary hasDisplayMetric:TSSportDisplayMetricSwimLaps]) {
TSLog(@"该运动支持显示游泳趟数");
}

获取已启用显示指标的本地化名称数组

- (NSArray<NSString *> *)displayMetricNames;

返回值

NSArray<NSString *> * —— 本地化指标名称数组

代码示例

TSSportSummaryModel *summary = sport.summary;
NSArray<NSString *> *metricNames = [summary displayMetricNames];

TSLog(@"该运动将显示以下指标:");
for (NSString *name in metricNames) {
TSLog(@" - %@", name);
}

获取显示指标的本地化名称(类方法)

+ (NSString *)nameForDisplayMetric:(TSSportDisplayMetric)metric;

参数说明

参数名类型说明
metricTSSportDisplayMetric显示指标枚举值

返回值

NSString * —— 本地化名称字符串,未定义的值返回"未知指标"

代码示例

NSString *name1 = [TSSportSummaryModel nameForDisplayMetric:TSSportDisplayMetricDuration];
NSString *name2 = [TSSportSummaryModel nameForDisplayMetric:TSSportDisplayMetricHeartRate];
NSString *name3 = [TSSportSummaryModel nameForDisplayMetric:TSSportDisplayMetricDistance];

TSLog(@"指标名称: %@, %@, %@", name1, name2, name3);

注意事项

  1. 时间戳格式syncHistoryDataFormStartTime:endTime:completion: 方法中的时间参数必须为 Unix 时间戳(秒),可通过 [NSDate timeIntervalSince1970] 获取

  2. 数据完整性:同步大时间范围的数据时,建议分段同步以避免超时,单次最多建议同步30天内的数据

  3. 心率区间计算:心率区间的计算基于公式 (220 - 年龄),各区间如下:

    • 热身:HR < 最大心率 × 60%
    • 脂肪燃烧:最大心率 × 60% ≤ HR < 最大心率 × 70%
    • 有氧:最大心率 ×