跳到主要内容

用户信息 (TSUserInfo)

TSUserInfo 模块提供用户基本信息的获取、设置和变化监听,支持身高、体重、性别、年龄等数据,并提供传输结构校验和 BMI 计算功能。

前提条件​

  • iOS 设备已与 SDK 完成连接
  • 用户已授权访问用户信息权限
  • 设备固件版本支持用户信息功能

数据模型​

TSUserInfoModel​

用户信息数据模型,用于承载 SDK 共用资料。validate 校验传输结构,当前设备对应的 Provider 在发送前校验设置范围。

属性名类型说明
userIdNSString *应用侧用户标识,当前设备资料设置载荷不传输
nameNSString *应用侧显示名称,当前设备资料设置载荷不传输
genderTSUserGender读取时可能为 Unknown;设置时只接受 Female 或 Male
ageUInt8用户年龄(整岁);Fit/NPK/Fw 为 0-127,其他 Provider 按各自协议校验
heightCGFloat用户身高(厘米);必须有限且非负,Fit/NPK/Fw 为 0-256
weightCGFloat用户体重(千克);必须有限且非负,Fit/NPK/Fw 为 0-512

枚举与常量​

TSUserGender​

用户性别枚举,定义用户信息中可能的性别值。

枚举值数值说明
TSUserGenderUnknown-1未知性别,性别未指定
TSUserGenderFemale0女性
TSUserGenderMale1男性

回调类型​

回调类型参数说明
TSUserInfoResultBlockvoid(^)(TSUserInfoModel * _Nullable userInfo, NSError * _Nullable error) — 用户信息获取回调。userInfo 为用户信息模型,获取失败时为 nil;error 为错误信息,成功时为 nil
TSCompletionBlock标准完成回调,用于设置操作结果返回

接口方法​

检查是否支持读取用户信息​

- (BOOL)isSupportGetUserInfo;

返回当前设备是否支持从设备读取用户信息;写入能力不受此返回值约束。

从设备获取用户信息​

从设备中获取用户的基本信息,包括身高、体重、性别、年龄等。

- (void)getUserInfoWithCompletion:(nullable TSUserInfoResultBlock)completion;
参数名类型说明
completionTSUserInfoResultBlock回调 block,返回用户信息或错误。userInfo 为用户信息模型,获取失败时为 nil;error 为错误对象,成功时为 nil

代码示例

// 获取用户信息
[self.userInfoInterface getUserInfoWithCompletion:^(TSUserInfoModel *userInfo, NSError *error) {
if (error) {
TSLog(@"获取用户信息失败: %@", error.localizedDescription);
return;
}

TSLog(@"用户信息:");
TSLog(@" 姓名: %@", userInfo.name);
TSLog(@" 性别: %ld", (long)userInfo.gender);
TSLog(@" 年龄: %d岁", userInfo.age);
TSLog(@" 身高: %.1f厘米", userInfo.height);
TSLog(@" 体重: %.1f千克", userInfo.weight);
TSLog(@" BMI: %.1f", [userInfo calculateBMI]);
}];

设置用户信息到设备​

向设备设置用户的基本信息。公共模型先校验数据是否可安全传输,当前 Provider 再校验对应设备协议范围;任何一层失败都会通过 completion 返回错误。

- (void)setUserInfo:(TSUserInfoModel *)userInfo
completion:(TSCompletionBlock)completion;
参数名类型说明
userInfoTSUserInfoModel *要设置的用户信息模型
completionTSCompletionBlock回调 block,返回设置结果。success 表示是否设置成功;error 为错误对象,成功时为 nil

代码示例

// 创建用户信息
TSUserInfoModel *userInfo = [[TSUserInfoModel alloc] init];
userInfo.name = @"张三";
userInfo.gender = TSUserGenderMale;
userInfo.age = 30;
userInfo.height = 175.0;
userInfo.weight = 70.0;

// 验证用户信息
NSError *validateError = [userInfo validate];
if (validateError) {
TSLog(@"用户信息验证失败: %@", validateError.localizedDescription);
return;
}

// 设置用户信息到设备
[self.userInfoInterface setUserInfo:userInfo completion:^(BOOL success, NSError *error) {
if (error) {
TSLog(@"设置用户信息失败: %@", error.localizedDescription);
return;
}

if (success) {
TSLog(@"用户信息设置成功");
}
}];

注册用户信息变化通知​

注册用户信息变化通知,当设备端的用户信息发生变化时,会触发回调。

- (void)registerUserInfoDidChangedBlock:(nullable TSUserInfoResultBlock)completion;
参数名类型说明
completionTSUserInfoResultBlock用户信息变化时触发的回调 block。userInfo 为新的用户信息模型;error 为获取新信息失败时的错误对象,成功时为 nil。传入 nil 可以取消注册通知

代码示例

// 注册用户信息变化通知
[self.userInfoInterface registerUserInfoDidChangedBlock:^(TSUserInfoModel *userInfo, NSError *error) {
if (error) {
TSLog(@"获取用户信息变化失败: %@", error.localizedDescription);
return;
}

TSLog(@"用户信息已变化:");
TSLog(@" 姓名: %@", userInfo.name);
TSLog(@" 性别: %ld", (long)userInfo.gender);
TSLog(@" 年龄: %d岁", userInfo.age);
TSLog(@" 身高: %.1f厘米", userInfo.height);
TSLog(@" 体重: %.1f千克", userInfo.weight);
}];

// 取消注册通知
[self.userInfoInterface registerUserInfoDidChangedBlock:nil];

TSUserInfoModel 方法​

验证用户信息​

验证用户信息是否具备可安全传输的结构。该方法不执行统一人体范围或 BMI 医学策略校验。

- (nullable NSError *)validate;

返回值

类型说明
NSError *验证失败时返回 NSError 对象,包含具体原因;验证通过时返回 nil

公共验证规则

  • 性别必须为女性或男性,并可映射到底层协议
  • 身高和体重必须为有限的非负数
  • 年龄、身高、体重的具体上限由当前设备 Provider 在设置时校验
  • BMI 仅由 calculateBMI 计算,不作为设置成功与否的判断条件

验证标准设备范围​

Fit、NPK、Fw 使用同一个标准设备范围校验入口。该方法会先执行 validate,再校验年龄 0-127 岁、身高 0-256 cm、体重 0-512 kg。

- (nullable NSError *)validateStandardDeviceRange;

CRP、SJWatch 的协议范围不同,不使用此方法。

当前 Provider 设置范围

Provider年龄身高(cm)体重(kg)
Fit / NPK / Fw0-1270-2560-512
CRP1-1200-2500-500
SJWatchUInt8 可表示范围NSInteger 可表示范围NSInteger 可表示范围

代码示例

TSUserInfoModel *userInfo = [[TSUserInfoModel alloc] init];
userInfo.age = 25;
userInfo.height = 170.0;
userInfo.weight = 65.0;
userInfo.gender = TSUserGenderMale;
userInfo.name = @"李四";

NSError *error = [userInfo validate];
if (error) {
TSLog(@"验证失败: %@", error.localizedDescription);
} else {
TSLog(@"用户信息验证通过");
}

计算 BMI 值​

根据当前用户的身高和体重计算 BMI 值。

- (float)calculateBMI;

返回值

类型说明
floatBMI 值,计算失败时返回 -1

计算公式

BMI = 体重(kg) / 身高(m)²

代码示例

TSUserInfoModel *userInfo = [[TSUserInfoModel alloc] init];
userInfo.height = 175.0;
userInfo.weight = 70.0;

float bmi = [userInfo calculateBMI];
if (bmi > 0) {
TSLog(@"BMI 值: %.1f", bmi);

// BMI 分类
if (bmi < 16) {
TSLog(@"BMI 分类: 重度消瘦");
} else if (bmi < 17) {
TSLog(@"BMI 分类: 中度消瘦");
} else if (bmi < 18.5) {
TSLog(@"BMI 分类: 轻度消瘦");
} else if (bmi < 25) {
TSLog(@"BMI 分类: 正常范围");
} else if (bmi < 30) {
TSLog(@"BMI 分类: 超重");
} else if (bmi < 35) {
TSLog(@"BMI 分类: 肥胖 I 度");
} else if (bmi < 40) {
TSLog(@"BMI 分类: 肥胖 II 度");
} else {
TSLog(@"BMI 分类: 肥胖 III 度");
}
} else {
TSLog(@"BMI 计算失败");
}

注意事项​

  1. 数据有效范围:公共模型只校验传输安全性,具体范围取决于当前设备 Provider。不要在 App 层写死 220 cm 等统一上限。

  2. 异步操作:所有用户信息相关的操作都是异步的,必须通过回调 block 来获取结果,不能阻塞主线程。

  3. BMI 计算:BMI 值仅供业务展示参考,不参与 SDK 设置校验;具体健康评估应结合医学专业意见。

  4. 性别枚举:读取结果可能使用 -1 表示未知/未指定;设置只接受 0(女性)或 1(男性)。

  5. 信息同步:validate 只保证数据结构可安全传输;调用 setUserInfo:completion: 后仍需检查 Provider 返回的协议范围或通信错误。

  6. 通知取消:调用 registerUserInfoDidChangedBlock: 方法时传入 nil 可以取消注册用户信息变化通知。

  7. 线程安全:所有回调 block 都会在主线程中执行,UI 更新操作可以直接进行。