EXI iOS SDK
目录
概述
开发者:EXI
Xcode 13.4 或更高版本
支持 Swift 5.3 或更高版本进行部署
支持的最低 iOS 版本:iOS 10.0
简介
SDK 代表软件开发工具包,简称 devkit。
它是一套用于为特定平台创建应用的软件工具和程序,开发者使用的 SDK 将包括一系列东西,包括库、文档、代码示例、进程和指南,开发者可以用它们集成到自己的应用中。SDK 是为特定平台或编程语言设计的。
SDK 的目的
SDK 的目的是避免代码重用,以便开发团队能够专注于创造性工作。SDK 提供了构建使用 API 的应用程序所需的所有必要代码。
入门指南
要开始使用我们的 SDK,您需要在我们的网站上拥有一个有效账户。一旦您拥有账户,您就可以访问 SDK 文档并从我们的网站下载 SDK。
EXI SDK
EXI SDK 是一种运动处方 SDK,为患有或患有慢性病风险的人提供经过临床验证并数字化交付的个性化锻炼。它将处理大约 23 种慢性病。
SDK 功能
SDK 提供以下功能
- 健康状况评估:SDK 根据用户的医疗史和健康状况,包括年龄、性别、体重、身高和医疗状况,评估用户的健康状况。
- 身体活动建议和处方扩展:根据用户的健康状况评估,SDK 推荐一组安全且适合用户的活动。活动根据其类型、强度水平和持续时间进行分类。
- 定制:SDK 可以定制以满足您的应用程序的特定需求,包括品牌、用户界面和语言支持。
集成要求
要将 SDK 集成到您的应用程序中,您需要满足以下条件
- 访问 SDK:您可以通过联系 SDK 提供商来获取 SDK 的访问权限。
- 开发环境:SDK 支持多种编程语言,包括 Kotlin 和 Swift。您应该拥有支持您选择的语言的开发环境。
- API 密钥:您需要一个 API 密钥来通过 SDK 验证您的应用程序。API 密钥由 SDK 提供商提供。要检查获取 API 密钥和 JWS 令牌的步骤,请访问设置指南页面。
SDK 概述
EXI为Android和iOS开发提供客户端SDK。EXI提供了一套便捷的对象、方法和事件,将您的客户端应用程序与对话连接起来。有关最新安装方法、版本历史和文档,请查阅:Android或iOS下载页面。
集成步骤
以下步骤说明了如何将SDK集成到您的应用程序中
步骤1:获取SDK访问权限
联系SDK提供商以获取SDK访问权限。提供商将为您提供使用SDK所需的所有信息和文档。
步骤2:选择编程语言
选择SDK支持的编程语言,并设置您的开发环境。
步骤3:获取API密钥
从SDK提供商处获取API密钥。API密钥用于您的应用程序与SDK的认证。
步骤4:将SDK添加到您的项目中
通过将SDK库包含在您的项目依赖中,将SDK添加到您的项目中。
步骤5:初始化SDK
通过将Context、API密钥以及可选的enableMockResponse传递给SDK构造函数来初始化SDK。当启用enableMockResponse时,SDK仅返回一个示例硬编码的响应,这对于开发时的离线模式非常有帮助。
步骤6:设置JWS令牌
设置JWS令牌,该令牌用于授权SDK的用户,并识别每个SDK用户。
步骤7:评估用户的健康状况
使用SDK的健康状况评估功能,根据用户的医疗历史和健康数据评估其健康状况。
步骤8:获取身体活动建议和处方。
使用SDK的身体活动建议功能,获取一个列表,其中包括对用户安全且适当进行的活动,并带有有关活动执行持续时间的规定。
步骤9:记录活动
使用SDK的记录活动功能跟踪用户的身体活动。
步骤10:获取处方进度
使用SDK的处方进度跟踪用户的身体活动。
结论
SDK提供了一种基于用户健康状况的电子开具活动处方的解决方案。它评估用户的健康状况,推荐身体活动,与可穿戴设备集成,并可以根据您应用程序的具体需求进行定制。遵循集成步骤将SDK集成到您的应用程序中,并为用户提供个性化的身体活动建议。
设置指南
获取授权令牌和密钥
注意:目前所有API访问令牌和JWS令牌均由API直接生成。将来,将在CMS中引入一个新的用户界面,设置SDK的方式将与现在类似。
获取新的 API 访问令牌
- 访问CMS: https://cms.development.exi.health/ -- 对于其他环境,请将.development替换为您想要的环境,例如.mobile -- 如果您需要访问CMS,可以通过发送邀请给有权限的人。
- 前往组织
- 创建一个新的组织
- 前往编辑组织页面(仅在编辑阶段可用)
- 在下拉菜单中选择API“子页面”
- 从那里获取API密钥
获取新的 JWS 令牌
您必须在有效载荷(声明)中加密您的organisationId、userId、email和exp。然后,您必须使用您的密钥对以下内容进行签名。
{
/**You can find the ID in the CMS: Edit your or and copy ID from URL*/
"organisationId": "0574acae-4252-4b49-8b2b-53963b39e598",
/**This is the user ID from yhe customer's system*/
"userId": "123456789",
"email": "[email protected]"
/**This is a date in the future, safe to use*/
"exp": 1713571200000
}
- 生成JWS凭据: https://8gwifi.org/jwsgen.jsp
- 使用'RS256'算法
- 安全地保存所有凭据
- 在JWT.IO中粘贴您的凭据以验证签名
- 您可以使用该网站和凭据轻松更改有效载荷并获得新的令牌
- 您的儿童、public_key必须添加到us-development数据库中,然后您可以执行授权请求
EXI iOS SDK 快速入门指南
安装 SDK
要使用EXI iOS SDK,您有以下选择
- 使用 CocoaPods 安装
- 使用 SPM(最近代码未经测试,实验性)安装
使用 CocoaPods 安装
步骤 1 - 在 Podfile 中添加
pod 'EXISDK'
步骤 2 - 在包含 Podfile 的目录中运行以下命令进行安装
$ pod install
:git => 'https://{git_username}@github.com/exiteam/exi-ios-sdk.git',
:branch => 'pods'
注意:目前,Pods 没有推送到公共 Cocoapods 仓库。这些需要使用具有私有仓库访问权限的用户进行认证后才能访问。
使用 SPM 安装
将 EXISDK 导入项目
步骤 1:点击 Xcode 项目的文件
步骤 2:点击 Swift Packages,然后点击加号添加一个包
步骤 3:输入以下仓库 URL 'https://github.com/exiteam/exi-ios-sdk.git' 并点击下一步
步骤 4:保留默认设置以获取最新版本,然后点击下一步来完成导入
Version: 0.0.1
项目设置
可见初始化过程
主 SDK 设置方法
public func setup(configuration: EXIConfiguration)
SDK 设置示例(iOS)
import EXISDK
let configuration = EXIConfiguration(apiKey: "YOUR_DEVELOPER_API_KEY", jwsToken: "YOUR_JWT_TOKEN")
EXISDK.setup(configuration: configuration)
init(
apiKey: String,
jwsToken: String? = nil,
logggingEnabled: Bool = true,
mockEnabled: Bool = false
)
SDK 方法调用示例(iOS)
let configuration = EXIConfiguration(apiKey: "YOUR_DEVELOPER_API_KEY", jwsToken: "YOUR_JWT_TOKEN")
EXISDK.setup(configuration: configuration)
EXISDK.getPrescription { result in
switch result {
case .success:
print("All Good")
case .failure(let error):
print(error)
}
}
可见方法名(暂定)
获取地区
func getRegions(completion:@escaping (Result<[EXIRegion], EXIError>) -> Void)
获取自定义字段
func getCustomFields(completion:@escaping (Result<[EXICustomField], EXIError>) -> Void)
获取健康状态
func getHealthConditions(completion:@escaping (Result<[EXIHealthCondition], EXIError>) -> Void)
获取处方
func getPrescription(completion:@escaping (Result<EXIPrescription, EXIError>) -> Void)
获取单周处方
func getPrescription(week: Int, completion:@escaping EXIResult<EXIPrescription>)
获取用户资料
func getUser(completion:@escaping (Result<EXIProfile?, EXIError>) -> Void)
删除用户
func deleteUser(completion:@escaping (Result<Bool, EXIError>) -> Void)
重启处方
func restartPrescription(completion:@escaping (Result<EXIPrescription, EXIError>) -> Void)
更新用户资料
func updateUser(completion:@escaping (Result<EXIProfile?, EXIError>) -> Void)
删除用户资料
func deleteUser(completion:@escaping (Result<Bool, EXIError>) -> Void)
获取健康状态详情
func getHealthCondition(conditionId: String, completion:@escaping EXIResult<EXIHealthCondition>)
检查处方可用性
func isPrescriptionAvailable(completion:@escaping EXIResult<Bool>)
获取所有活动分组
func getActivityGroups(intensity: EXIIntensity, completion:@escaping EXIResult<[EXIActivityGroup]>)
获取所有活动列表
func getAllActivities(intensity: EXIIntensity, completion:@escaping EXIResult<[EXIActivity]>)
记录活动
func logActivity(activityLog: EXILogActivityRequest, completion:@escaping EXIResult<EXIActivityLog>)
获取活动日志
func getActivityLogs(loggedAt: String, completion:@escaping EXIResult<[EXIActivityLog]>)
获取用户活动类型
func getUserActivityTypes(completion:@escaping EXIResult<[EXIUserActivityType]>)
更新健康指标
func updateHealthMetrics(healthMetrics: [EXIHealthMetric], completion:@escaping EXIResult<[EXIHealthMetric]>)
主要全局错误枚举
public enum EXIError: Error, Equatable {
case invalidHeaders
case nilConfiguration
case emptyApiKey
case emptyJwtToken
case invalidKey
case invalidKeyPrefix
case invalidKeyLength
case expiredToken
case invalidJwtToken
case invalidJwtHeader
case invalidJwtTokenPayload
case missingToken
case invalidData
case noInternet
case unsupportedURL
case jsonDecodingFailure
case organisationNotFound
case invalidConditionUUID
case userNotFound(description: String)
case responseUnsuccessful(description: String)
case decodingTaskFailure(description: String)
case requestFailed(description: String)
case jsonConversionFailure(description: String)
case postParametersEncodingFailure(description: String)
case requestError(description: String)
}
请求类
public struct EXICustomFieldRequest: Codable, Equatable {
public var name: String
public var value: String
public init(name: String, value: String) {
self.name = name
self.value = value
}
}
public struct EXIProfileRequest: Codable, Equatable {
public var firstName, lastName, dateOfBirth: String?
public var betaBlockers: Bool?
public var healthConditions: [String]?
public var locale: String?
public var customFields: [EXICustomField]?
public var timezone: String?
public var region: EXIRegion?
public var gender: EXIGender?
public var unitSystem: EXIUnit?
public var healthMetric: [EXIHealthMetric]?
}
public struct EXILogActivityRequest: Codable, Equatable {
public var loggedAt, activityType: String?
public var duration, heartRate, rpe, distance, steps: Int?
public init(loggedAt: String, activityType: String, duration: Int, heartRate: Int? = nil, rpe: Int? = nil, distance: Int? = nil, steps: Int? = nil) {
self.loggedAt = loggedAt
self.activityType = activityType
self.duration = duration
self.heartRate = heartRate
self.rpe = rpe
self.distance = distance
self.steps = steps
}
}
响应类
EXIPrescription
EXIProfile
EXIMedialQS
EXIHealthMetricName
EXIHealthCondition
EXIGender
EXICustomField
EXIActivityLevel
EXIActivityType
EXIActivity
EXIActivityGroup
EXIActivityLog