SDK 合规性文档
生效日期:2026年7月29日
说明
本文档面向将 Verhub SDK(以下简称「SDK」)集成到自有应用中的开发者(以下简称「接入方」),逐项公示 SDK 的功能、所收集的个人信息字段、系统权限使用情况以及数据的传输与处理规则,供接入方履行告知义务、在其自身的隐私政策中据实披露。本文档同时向最终用户公开。
本文档与《隐私政策》配套:本文档说明 SDK「收集什么、如何收集、如何关闭」,《隐私政策》说明这些数据到达服务端后「如何处理、留存多久、如何行使权利」。
本文档所称个人信息的判定范围,参照国家标准《GB/T 35273 信息安全技术 个人信息安全规范》附录;系统权限的判定范围,参照《网络安全实践指南——移动互联网应用程序个人信息相关系统权限申请使用规范》。
本文档将帮助您了解以下内容:
一、SDK 基本信息
二、SDK 的功能与触发方式
三、个人信息收集清单
四、系统权限使用情况
五、SDK 不收集的信息
六、数据的传输与处理规则
七、各语言版本的差异
八、第三方依赖
九、接入方的合规义务
十、合规配置指引
十一、本文档的更新
一、SDK 基本信息
| 项目 | 内容 |
|---|---|
| SDK 名称 | Verhub SDK |
| 提供形式 | 开源软件,随 Verhub 项目一并发布,由接入方自行集成 |
| 服务类型 | 版本更新检查、公告分发、用户反馈收集、日志与行为记录上报 |
| 语言版本 | TypeScript / JavaScript、Python、Rust、浏览器(纯 JS) |
| 数据接收方 | 接入方在初始化时指定的 Verhub 服务实例。就本实例而言,接收方为 Verhub |
| 配套隐私政策 | 本站《隐私政策》 |
SDK 不向 Verhub 的开发者回传任何数据。 请求地址由接入方在初始化时指定,数据只发往该地址所指向的服务实例;Verhub 的开发者不参与该实例的运营,不接收、不存储、不访问其中的任何数据。
二、SDK 的功能与触发方式
| 功能 | 触发方式 | 是否必需 |
|---|---|---|
| 查询项目公开信息、版本列表与版本详情 | 应用调用相应查询方法 | 否,由接入方决定是否使用 |
| 检查更新 | 应用调用检查更新方法 | 否 |
| 获取公告 | 应用调用公告查询方法 | 否 |
| 提交反馈 | 最终用户在应用内主动提交 | 否 |
| 上报日志 | 应用调用日志上报方法 | 否 |
| 上报行为记录 | 应用调用行为记录上报方法 | 否 |
SDK 不在后台自行运行,不定时轮询,也不在应用未调用时发起任何请求。 每一次数据发送均由应用主动调用相应方法触发。未被应用调用的能力不会产生任何数据。
SDK 不在设备上生成、写入或者保存任何标识符,不使用 Cookie、本地存储或者本地文件留存数据。 请求失败时不写入本地队列,也不在下次启动时补发。
三、个人信息收集清单
(一)每次请求均会附带的信息
| 字段 | 内容 | 是否属于个人信息 | 收集方式 | 使用目的 | 是否可关闭 |
|---|---|---|---|---|---|
| 项目标识 | 接入方在服务端登记的项目标识符 | 否 | 由接入方在初始化时配置 | 确定数据归属的项目 | 否,缺少则无法路由 |
| 平台类型 | windows、linux、macos、ios、android、web、others 七者之一 | 否 | SDK 自动判定或者由接入方显式声明,通过请求头 x-verhub-platform 发送 | 按平台筛选应展示的公告;分平台统计 | 可关闭,见第十条 |
| 系统版本明细 | 操作系统版本字符串,如「11」「ubuntu 24.04」 | 否 | 同上,通过请求头 x-verhub-platform-version 发送 | 系统版本分布统计;异常时缩小排查范围 | 可关闭,见第十条 |
| SDK 标识 | SDK 名称与版本号(verhub-sdk-js、verhub-sdk-python、verhub-sdk-rust),可附带接入方设置的应用标识,通过 User-Agent 发送 | 否 | SDK 自动生成 | 区分调用来源 | 浏览器环境下不发送 |
| 网络地址 | 设备访问服务端时使用的 IP 地址 | 是 | 由网络协议本身携带,服务端可观测 | 归属地聚合统计、频次限制、故障排查 | 否,属于网络通信的固有组成部分 |
关于系统版本明细的读取范围。 SDK 只读取操作系统的版本信息本身:Windows 通过系统接口读取内核版本号并还原为市场版本号(11、10、8.1、8、7),macOS 读取产品版本号,Linux 读取 /etc/os-release(或者 /usr/lib/os-release)中的发行版标识与版本号并拼成「发行版 版本号」,浏览器环境不读取。除上述文件外,SDK 不读取设备上的任何文件、目录或者系统数据库。
(二)各功能收集的字段
1、查询项目公开信息、版本列表、版本详情与公告
除本条第(一)项所列的通用信息外,不发送其他信息。公告查询可附带接入方指定的平台筛选参数与分页参数。上述字段均不属于个人信息。
2、检查更新
| 字段 | 是否必填 | 上限 | 是否属于个人信息 | 说明 |
|---|---|---|---|---|
| 当前版本号 | 与下一项至少提供其一 | 64 字符 | 否 | 由应用提供 |
| 用于比较的版本序号 | 可选 | 64 字符 | 否 | 由应用提供 |
| 是否包含预览版 | 可选 | — | 否 | 由应用提供 |
3、提交反馈
仅在最终用户在应用内主动提交时触发。
| 字段 | 是否必填 | 上限 | 是否属于个人信息 | 说明 |
|---|---|---|---|---|
| 反馈正文 | 必填 | 4096 字符 | 取决于用户填写的内容 | 由用户输入 |
| 评分 | 可选 | 1 至 5 的整数 | 否 | 由用户选择 |
| 联系方式 | 可选 | 128 字符 | 是 | 由用户填写,可为邮箱、电话或者即时通讯账号;不做格式校验,不填写则不发送 |
| 用户标识 | 可选 | 64 字符 | 可能是 | 由接入方定义并提交,其含义由接入方决定,服务端不作解析 |
| 是否转发至 GitHub | 可选 | — | 否 | 默认为否,见下文 |
| 是否隐藏该反馈 | 可选 | — | 否 | 默认为否。设为是时,管理端列表默认不展示该条反馈,其评分仍计入统计 |
| 平台类型、系统版本明细 | 可选 | — | 否 | 可在此覆盖通用声明 |
| 自定义字段 | 可选 | — | 取决于接入方填入的内容 | 由接入方组织的结构化内容 |
关于转发至 GitHub。 仅当本实例为该项目启用了反馈转发功能,且用户在提交时明确选择转发,反馈正文、联系方式、用户标识、平台与系统版本才会按模板写入运营者指定的 GitHub 仓库中的一条 Issue。若该仓库为公开仓库,上述内容将成为公开可见的信息。 用户未选择转发的,不会发生此项传输。选择转发时联系方式为必填项,SDK 在本地即会拦下未填联系方式的提交。
4、上报日志
| 字段 | 是否必填 | 上限 | 是否属于个人信息 | 说明 |
|---|---|---|---|---|
| 日志级别 | 必填 | 0 至 3 的整数 | 否 | 由应用提供 |
| 日志正文 | 必填 | 4096 字符 | 取决于接入方填入的内容 | 由应用组织 |
| 设备信息字段 | 可选 | — | 取决于接入方填入的内容 | 由应用组织的结构化内容 |
| 自定义字段 | 可选 | — | 取决于接入方填入的内容 | 由应用组织的结构化内容 |
设备信息字段与日志正文的内容完全由接入方自行组织,SDK 不会自动读取任何设备信息填入其中。 其中是否包含可识别到最终用户的信息,取决于接入方的实现。这部分内容的最小化与匿名化由接入方负责:服务端按原样接收并存储,不作解析,不识别其中的个人信息,也不代为进行匿名化或者去标识化处理。
5、上报行为记录
| 字段 | 是否必填 | 上限 | 是否属于个人信息 | 说明 |
|---|---|---|---|---|
| 行为标识 | 必填 | 64 字符 | 否 | 由接入方在服务端登记 |
| 自定义字段 | 可选 | — | 取决于接入方填入的内容 | 由应用组织的结构化内容 |
服务端在保存行为记录时,会一并保存本次 HTTP 请求的方法、完整的请求头、请求体、IP 地址与 User-Agent。若应用在调用时附加了自定义请求头,该请求头亦会被记录。 接入方在启用该功能前应确认自定义请求头中不含不应留存的内容。
(三)服务端在接收提交时另行记录的信息
反馈、日志与行为记录三类提交,服务端在落库时另行记录:IP 地址、User-Agent、由 IP 推断的地理位置(国家、省级行政区、城市)、平台与系统版本、提交时间,以及用于抑制重复提交的指纹。
其余查询类接口不生成与单次请求对应的记录,仅按「项目 × 接口 × 小时 × 平台 × 地区」累加计数。
四、系统权限使用情况
Verhub SDK 不申请任何操作系统权限。
对照《网络安全实践指南——移动互联网应用程序个人信息相关系统权限申请使用规范》,SDK 不申请下列任何一项权限:位置、通讯录、相机、麦克风、存储、电话、短信、日历、身体传感器、运动与健身、附近的设备、悬浮窗、后台自启动、关联启动。
SDK 在本机的读取行为仅限一项:在 Linux 系统上读取 /etc/os-release(或者 /usr/lib/os-release)以获取发行版版本号。该文件是系统的公开版本标识文件,不含个人信息,此项读取亦不需要申请任何权限。
五、SDK 不收集的信息
SDK 不读取、不发送下列任何一项:
- 设备序列号、IMEI、IMSI、ICCID、MAC 地址、Android ID、IDFA、IDFV、OAID、OpenUDID 等设备唯一标识或者广告标识符;
- 通讯录、通话记录、短信、相册、摄像头、麦克风;
- 精确地理位置(卫星定位)与传感器数据;
- 剪贴板内容、键盘输入、屏幕内容;
- 应用安装列表与其他应用的运行状态;
- 文件系统的目录结构与文件内容(第四条所述的系统版本标识文件除外);
- 账号密码等身份凭据;
- 网络运营商、SIM 卡信息、基站与 Wi-Fi 信息。
SDK 不会为最终用户生成任何持久标识符,因此不具备跨应用、跨设备识别同一使用者的能力。
六、数据的传输与处理规则
1、传输。 请求地址由接入方在初始化时指定。接入方应配置 HTTPS 地址,以保证传输过程加密。
2、不落盘。 SDK 不在设备上缓存、排队或者持久化任何待发送数据;请求失败即失败,不写入本地存储,也不在下次启动时补发。
3、重试。 仅对幂等方法(GET 等)在连接失败或者服务端返回 502、503、504 时自动重试,默认 2 次并按指数退避。提交类请求(检查更新、反馈、日志、行为记录)一律不自动重试,不会因重试产生重复提交。
4、超时。 单次请求默认 15 秒超时,可由接入方调整。
5、重复抑制。 服务端对反馈、日志与行为记录计算一个指纹,在短时间窗口(默认 60 秒)内将内容相同的重复提交折叠为一条。该指纹以 SHA-256 计算后截取 128 位,为单向散列,不能据以还原原始内容,也不用于识别设备。
6、频次限制。 公开上报接口按来源 IP 限流,默认为每分钟 300 次;选择转发至 GitHub 的反馈另设更严格的限制,默认为每个 IP 每小时 3 次。实际取值由运营者配置。
7、后续处理。 上述数据在服务端的存储地域、留存期限、共享范围以及最终用户可以行使的权利,见《隐私政策》。
七、各语言版本的差异
四个语言版本的采集范围与判定规则一致,差异仅来自运行环境的固有限制。
| 能力 | TypeScript / JavaScript | Python | Rust | 浏览器(纯 JS) |
|---|---|---|---|---|
| 平台自动判定 | 按运行时宿主系统判定;浏览器与 Worker 记作 web | 按解释器所在系统判定 | 按编译目标判定 | 一律记作 web |
| 系统版本自动读取 | 服务端运行时读取,浏览器环境不读取 | 读取 | 读取 | 不读取 |
| User-Agent 声明 | 服务端运行时发送 | 发送 | 发送 | 不发送,浏览器禁止脚本改写 |
| 关闭平台声明 | 支持 | 支持 | 支持 | 支持 |
| 单独关闭系统版本声明 | 支持 | 支持 | 不支持,关闭平台声明时一并关闭 | 支持 |
浏览器环境下未声明平台与系统版本时,服务端会依据浏览器自身发送的 User-Agent 推断平台与系统版本,用于聚合统计。该请求头由浏览器固有发送,SDK 无法阻止。
八、第三方依赖
| 语言版本 | 第三方依赖 | 用途 | 是否收集个人信息 |
|---|---|---|---|
| TypeScript / JavaScript | 无 | 使用运行时内建的 fetch | — |
| 浏览器(纯 JS) | 无 | 使用浏览器内建的 fetch | — |
| Python | requests | HTTP 请求 | 否 |
| Rust | reqwest、os_info、serde、serde_json、tokio、log、percent-encoding、thiserror | HTTP 请求、系统版本读取、序列化 | 否 |
上述依赖均为通用基础库,不包含任何数据采集、广告或者统计类 SDK。 其中 os_info 用于读取操作系统版本,在个别系统上会调用系统自带的版本查询命令,读取范围仍限于操作系统版本本身。
九、接入方的合规义务
为保障接入方的应用合法合规,避免出现侵害最终用户个人信息权益的情形,接入方在使用 SDK 时应当履行下列义务:
1、在自身隐私政策中据实披露。 接入方应在其应用的隐私政策中列明所集成的第三方 SDK 及其收集的个人信息类型。参考条款如下,具体内容请按接入方实际启用的能力与配置调整:
| 披露项 | 内容 |
|---|---|
| SDK 名称 | Verhub SDK |
| 服务类型 | 版本更新检查、公告分发、用户反馈收集、日志与行为记录上报(按实际启用的能力填写) |
| 收集个人信息类型 | 网络信息(IP 地址);可选——联系方式(由用户在提交反馈时自愿填写)、用户标识(由本应用定义并提交) |
| 数据接收方 | Verhub |
| 隐私政策链接 | 本站《隐私政策》页面地址 |
2、取得同意后再初始化。 接入方应确保在最终用户阅读并同意其隐私政策之前,不创建 SDK 客户端、不调用任何会发起网络请求的方法。
3、日志与行为记录须另行取得明确同意。 这两项能力所上报的内容由接入方自行组织,其中可能包含可识别到最终用户的信息。接入方应当在取得最终用户明确同意的前提下调用,并在调用前自行完成内容的最小化与匿名化处理。 服务端按原样接收并存储,不代为解析或者匿名化,也无从判断某一次上报是否已经取得同意。
4、留存授权记录。 接入方应确保已通过隐私政策等文件取得最终用户明确有效的授权,相关授权文件与授权记录需要存档备查。当最终用户或者监管机构提出授权异议时,接入方有义务提供相应记录以证明其合规使用。
5、未成年人。 接入方的应用面向未成年人的,应采取必要措施确保相关使用已取得监护人同意,并在其自身隐私政策中履行相应的告知义务。
6、及时升级。 接入方应关注 SDK 的版本更新,及时升级至最新版本。
因接入方未合规使用 SDK 所导致的风险与后果,由接入方自行承担。
十、合规配置指引
1、延迟初始化。 在最终用户同意隐私政策之前不要创建客户端。SDK 在构造时不会发起任何网络请求,但会读取系统版本信息,因此仍建议把构造动作放在取得同意之后。
2、关闭平台与系统版本声明。 若接入方不希望上报平台类型与系统版本明细,可在初始化时显式关闭:
| 语言版本 | 关闭方式 |
|---|---|
| TypeScript / JavaScript、浏览器 | 初始化选项中传入 platform 为 null;需要保留平台声明而只关闭版本时,传入 platformVersion 为 null |
| Python | 构造参数传入 platform=None;只关闭版本时传入 platform_version=None |
| Rust | 构造器上调用 without_platform(),平台与系统版本一并不再声明 |
关闭后,服务端仍会依据 User-Agent 作出推断(浏览器环境尤其如此)。该推断仅用于聚合统计,不影响接口返回的内容。
3、按需启用能力。 SDK 的各项能力互相独立,未调用的能力不会产生任何数据。只需要版本检查与公告的接入方,无需调用反馈、日志与行为记录相关的方法。
4、谨慎使用自定义请求头。 行为记录会连同完整请求头一并落库,接入方在初始化时附加的自定义请求头也会被记录。请勿在自定义请求头中放置凭据或者其他不应留存的内容。
十一、本文档的更新
SDK 的采集范围、字段或者处理规则发生变化时,本文档将同步修订。修订后的版本自在本页面发布之日起适用,页面底部标注最后更新日期。
如您对本文档有任何疑问,可以通过 [email protected] 与我们联系。
最后更新:2026-07-29(UTC)
