用户信息 (TSUserInfo)
TSUserInfo 模块提供用户基本信息的获取、设置和变化监听,支持身高、体重、性别、年龄等数据,并提供传输结构校验和 BMI 计算功能。
前提条件
- iOS 设备已与 SDK 完成连接
- 用户已授权访问用户信息权限
- 设备固件版本支持用户信息功能
数据模型
TSUserInfoModel
用户信息数据模型,用于承载 SDK 共用资料。validate 校验传输结构,当前设备对应的 Provider 在发送前校验设置范围。
| 属性名 | 类型 | 说明 |
|---|---|---|
userId | NSString * | 应用侧用户标识,当前设备资料设置载荷不传输 |
name | NSString * | 应用侧显示名称,当前设备资料设置载荷不传输 |
gender | TSUserGender | 读取时可能为 Unknown;设置时只接受 Female 或 Male |
age | UInt8 | 用户年龄(整岁);Fit/NPK/Fw 为 0-127,其他 Provider 按各自协议校验 |
height | CGFloat | 用户身高(厘米);必须有限且非负,Fit/NPK/Fw 为 0-256 |
weight | CGFloat | 用户体重(千克);必须有限且非负,Fit/NPK/Fw 为 0-512 |
枚举与常量
TSUserGender
用户性别枚举,定义用户信息中可能的性别值。
| 枚举值 | 数值 | 说明 |
|---|---|---|
TSUserGenderUnknown | -1 | 未知性别,性别未指定 |
TSUserGenderFemale | 0 | 女性 |
TSUserGenderMale | 1 | 男性 |
回调类型
| 回调类型 | 参数说明 |
|---|---|
TSUserInfoResultBlock | void(^)(TSUserInfoModel * _Nullable userInfo, NSError * _Nullable error) — 用户信息获取回调。userInfo 为用户信息模型,获取失败时为 nil;error 为错误信息,成功时为 nil |
TSCompletionBlock | 标准完成回调,用于设置操作结果返回 |
接口方法
检查是否支持读取用户信息
- (BOOL)isSupportGetUserInfo;
返回当前设备是否支持从设备读取用户信息;写入能力不受此返回值约束。
从设备获取用户信息
从设备中获取用户的基本信息,包括身高、体重、性别、年龄等。
- (void)getUserInfoWithCompletion:(nullable TSUserInfoResultBlock)completion;
| 参数名 | 类型 | 说明 |
|---|---|---|
completion | TSUserInfoResultBlock | 回调 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;
| 参数名 | 类型 | 说明 |
|---|---|---|
userInfo | TSUserInfoModel * | 要设置的用户信息模型 |
completion | TSCompletionBlock | 回调 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;
| 参数名 | 类型 | 说明 |
|---|---|---|
completion | TSUserInfoResultBlock | 用户信息变化时触发的回调 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 / Fw | 0-127 | 0-256 | 0-512 |
| CRP | 1-120 | 0-250 | 0-500 |
| SJWatch | UInt8 可表示范围 | 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;
返回值
| 类型 | 说明 |
|---|---|
float | BMI 值,计算失败时返回 -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 计算失败");
}
注意事项
-
数据有效范围:公共模型只校验传输安全性,具体范围取决于当前设备 Provider。不要在 App 层写死 220 cm 等统一上限。
-
异步操作:所有用户信息相关的操作都是异步的,必须通过回调 block 来获取结果,不能阻塞主线程。
-
BMI 计算:BMI 值仅供业务展示参考,不参与 SDK 设置校验;具体健康评估应结合医学专业意见。
-
性别枚举:读取结果可能使用 -1 表示未知/未指定;设置只接受 0(女性)或 1(男性)。
-
信息同步:
validate只保证数据结构可安全传输;调用setUserInfo:completion:后仍需检查 Provider 返回的协议范围或通信错误。 -
通知取消:调用
registerUserInfoDidChangedBlock:方法时传入 nil 可以取消注册用户信息变化通知。 -
线程安全:所有回调 block 都会在主线程中执行,UI 更新操作可以直接进行。