产品使用手册
文档版本
V2.0
适用系统
v4.11+
目标读者
运营/产品/研发
最后更新
2026-03-25
1. 系统简介
App Pipeline 是一套服务端驱动的 Flutter App 用户分流管理系统。 它解决了一个核心问题:当你的 Flutter App 需要针对不同地区、不同用户群体展示差异化内容时, 传统方案需要重新打包发版,而 App Pipeline 让你通过 Web 管理后台实时配置规则, App 启动时自动从服务端获取分流结果,无需发版即可生效。
核心工作原理:App 启动 → 调用验证 API → 服务端按规则判断 → 返回分流结果(URL / Type / 自定义参数)→ App 渲染对应内容。
| 能力 | 说明 |
|---|---|
| 多层级规则引擎 | 支持国家检测、平台类型、安全参数、用户黑名单、自定义参数等多种检测类型,按顺序叠加判断 |
| 即时用户处置 | 无需修改规则版本,直接对特定设备 UID 或用户 ID 执行放行或拦截,秒级生效 |
| SDK 代码生成 | 根据版本配置自动生成 Dart 代码,开发者复制即可集成,降低接入成本 |
2. 快速上手:完整配置流程
以下是从零开始配置一套分流规则并集成到 Flutter App 的完整步骤,预计耗时 15–20 分钟。
创建 App
进入左侧导航「App 管理」,点击「新建 App」,填写 App 名称(如「旅游订房 App」)、选择平台(iOS / Android / 跨平台),点击「确定」完成创建。
创建规则版本
进入「规则版本」,点击「新建分流规则版本」,选择刚创建的 App,填写版本号(如 v1.0.0),选择输出模式(URL 跳转 / Type 标识 / 自定义参数),配置通过和拦截时的输出内容,点击「创建」。
配置规则层级
在版本列表中点击「编辑」进入版本编辑页,点击「添加规则层级」,按需配置一个或多个判断层级:国家检测(白名单 TW/HK/SG)、平台类型(白名单 ios/android)、用户黑名单(黑名单模式)。
使用测试工具验证
在版本编辑页点击「规则测试工具」,输入测试参数(如 countryCode: TW、platform: ios),点击「执行测试」,确认各层级判断结果符合预期。
发布版本
确认规则无误后,在版本编辑页点击状态切换按钮,将版本从「草稿」发布为「全量」(或先发布为「灰度」进行小流量验证)。
(选填)设定 AppLink
进入「App 管理」,展开 App 卡片,切换到「AppLink」标签,输入 URL Scheme(如 vclock),点击「建立 AppLink」。系统自动生成 6 位数 Token,用于行销推广时的一键解锁功能。
生成并集成 SDK
进入「SDK 生成」,选择版本,若已设定 AppLink 则同时选择对应 App,点击「生成 Dart SDK」。生成的代码已自动带入版本 ID 和 AppLink URL Scheme,复制到 Flutter 项目即可使用。
3.1 系统仪表板

仪表板是系统的首页,提供整体运行状态的概览视图。
| 区域 | 说明 |
|---|---|
| 统计卡片 | 展示活跃版本数、黑名单用户数、今日验证请求数、即时覆盖数四个核心指标 |
| 快速操作 | 提供新建分流规则版本、添加用户到黑名单、即时放行特定用户、生成 Flutter SDK 四个常用入口 |
| 最近操作记录 | 展示最新的 10 条管理操作历史,点击「查看全部」跳转到操作日志页面 |
3.2 App 管理

App 管理页面用于维护系统中的 Flutter 应用列表,每个 App 是规则版本的顶层容器。
| 字段 | 说明 |
|---|---|
| App 名称 | 用于在后台识别的显示名称,建议与实际产品名一致 |
| 平台 | 选择 iOS、Android 或跨平台,影响后续规则层级的平台筛选 |
| 描述 | 可选,填写 App 的用途或备注说明 |
3.2.1 AppLink 解锁
AppLink 是一种深层连结(Deep Link)解锁机制,让用户只需点击一个连结即可永久解锁 App 内容,无需输入任何验证码或密码。每个 App 只需设定一个 AppLink,适合用于行销推广、渠道追踪和 VIP 邀请等场景。
建立 AppLink 的步骤
进入「App 管理」,点击 App 卡片右侧的展开箭头,切换至「AppLink」标签页。在 URL Scheme 欄位输入自订 scheme(如 vclock),此值必须与 App 的 AndroidManifest 和 iOS Info.plist 中设定的 scheme 完全一致。点击「建立 AppLink」按钮,系统自动生成一个 6 位数 Token,并显示完整的深层连结 URL。
| 项目 | 说明 | 范例 |
|---|---|---|
| URL Scheme | App 注册的自定义协议,必须与 App 端一致 | vclock |
| 深层连结 URL | 用于行销推广的完整连结,用户点击后触发 App 解锁 | vclock://open/086021 |
| API 验证 URL | App 端 SDK 调用的后端验证接口 | https://your-domain.com/api/applink/086021 |
| 累计点击次数 | 统计该 AppLink 被触发的总次数,用于评估推广效果 | - |
AppLink 解锁流程
用户点击深层连结 → App 被唤起(冷启动或热启动)→ SDK 的 initAppLinkListener() 监听到连结 → 自动调用后端 API 完成解锁 → 触发 onUnlocked 回调 → App 显示解锁成功内容。解锁成功后,SDK 将结果写入本地缓存,后续 5 分钟内调用 verify() 直接返回 applink_unlocked,不会重复触发规则引擎。
3.3 规则版本管理

规则版本是分流规则的核心载体,每个版本包含完整的规则层级配置和输出配置。
版本状态说明
| 状态 | 颜色标识 | 是否对用户生效 | 说明 |
|---|---|---|---|
| 草稿 | 灰色 | 否 | 初始状态,可自由编辑规则 |
| 测试 | 蓝色 | 仅测试设备 | 用于内部测试验证 |
| 灰度 | 黄色 | 全部拦截(送审隔离) | 所有用户一律不放行;比例参数(1“100%)控制写入黑名单的用户范围,专为 App Store 送审期间设计 |
| 全量 | 绿色 | 全部用户 | 对所有通过验证的用户生效 |
| 已下线 | 红色 | 否 | 停止生效,保留历史记录 |
灰度版本的送审隔离机制
灰度版本专为 App Store 送审期间设计。与普通灰度发布(按比例放行)不同,App Pipeline 的灰度模式采用「全拦截 + 选择性记录」策略:
| 行为 | 说明 |
|---|---|
| 所有用户一律不放行 | 无论比例设定为多少,进入灰度版本的用户全部返回拦截结果,审核员无法看到线上内容 |
| 比例内用户写入黑名单 | 命中比例的用户被记录到黑名单,原因为「灰度试图闯关」,后续请求直接被黑名单优先拦截 |
| 比例外用户仅拦截不记录 | 未命中比例的用户同样被拦截,但不写入黑名单,避免黑名单无限膨胀 |
| 去重保护 | 同一用户多次触发灰度规则,黑名单中只保留一条记录(upsert 机制) |
输出模式选择指南
| 输出模式 | 适用场景 | 示例 |
|---|---|---|
| URL 跳转 | App 根据 URL 加载 WebView 或跳转外链 | 通过 → https://app.example.com/vip |
| Type 标识 | App 根据 type 值切换页面路由或功能模块 | 通过 → type: "vip_content" |
| 自定义参数 | App 需要接收多个参数进行复杂逻辑处理 | 通过 → {"tier": "A", "region": "TW"} |
3.4 规则层级配置

规则层级是版本内的单个判断步骤,多个层级按照排序权重依次执行,全部通过才视为最终通过。
| 检测类型 | 判断依据 | 典型用途 |
|---|---|---|
| 国家检测 | 请求携带的 countryCode | 按地区限制内容访问 |
| 安全参数 | 请求携带的自定义安全参数值 | 验证 App 是否携带合法签名 |
| 用户黑名单 | 设备 UID 或用户 ID 是否在黑名单中 | 拦截已封禁用户 |
| 平台类型 | 请求携带的 platform 字段 | 区分 iOS 和 Android 的内容 |
| 自定义参数 | 请求携带的指定参数键值 | 根据业务自定义的任意参数判断 |
3.5 用户黑名单

用户黑名单用于封禁特定用户,封禁后该用户的所有验证请求将直接返回拦截结果,无需经过规则层级判断。黑名单的优先级高于规则层级,但低于即时覆盖。
黑名单来源
| 来源 | 触发方式 | 原因标识 |
|---|---|---|
| 手动添加 | 管理员在黑名单页面手动新增或批量 CSV 导入 | 自定义填写 |
| 灰度自动封禁 | 用户进入灰度版本且命中比例时,系统自动写入 | 灰度试图闯关 |
批量导入 CSV 格式
identifierType,identifierValue,reason,expiresAt device_uid,DEVICE-UID-001,违规行为,2026-12-31 23:59:59 user_id,USER-12345,账号异常, ip,192.168.1.1,恶意请求,2026-06-30 00:00:00
3.6 即时覆盖

即时覆盖是系统中优先级最高的处置机制,高于所有规则层级和黑名单判断。适用于需要立即对特定用户生效的紧急场景。
| 场景 | 操作 |
|---|---|
| VIP 用户需要永久放行 | 添加「允许通过」覆盖,不设过期时间 |
| 测试人员需要临时放行 | 添加「允许通过」覆盖,设置过期时间为测试结束时间 |
| 发现恶意用户需要立即封禁 | 添加「强制拦截」覆盖,可设置过期时间或永久 |
| 某用户被误加入黑名单需临时放行 | 添加「允许通过」覆盖,覆盖优先级高于黑名单 |
3.7 SDK 生成

SDK 生成模块根据选定的规则版本,自动生成可集成到 Flutter App 的代码。
在左侧选择目标规则版本(建议选择已发布为全量或灰度的版本)。若该 App 已设定 AppLink,还需在下方的「选择 App」下拉选单中选择对应 App;选择后,生成的 Dart 代码会自动嵌入正确的 URL Scheme,无需手动填写。点击「生成 Dart SDK」按钮,代码生成后显示在代码预览区域,点击「复制代码」一键复制。
生成的 Dart 代码包含
| 类/内容 | 说明 |
|---|---|
| AppPipelineSDK 类 | 封装了验证 API 的调用逻辑,包含超时处理和错误处理 |
| VerifyResult 类 | 验证结果的数据模型 |
| VerifyOutput 类 | 根据 outputMode 解析对应输出(URL / type / params) |
| 完整使用示例 | 展示如何在 main.dart 中调用 |
3.8 操作日志

操作日志记录所有管理员在后台执行的关键操作,用于审计追溯和问题排查。
日志内容包含:操作时间、操作人、操作类型(创建/更新/删除/状态变更)、目标对象类型和名称、操作详情(修改前后的字段对比)。点击任意日志记录可展开查看完整的修改前后对比,以 JSON 格式展示字段变化。
3.9 验证日志

验证日志记录所有来自 App 端的验证请求,是监控系统运行状态和排查用户问题的核心工具。
| 筛选项 | 说明 |
|---|---|
| 关键词搜索 | 支持按设备UID、用户ID、IP地址、国家码模糊搜索 |
| 判断结果 | 全部 / 通过 / 拦截 / 错误 |
| 平台 | 全部 / iOS / Android / Other |
验证结果类型说明(resultLevel)
| 结果类型 | 含义 | 常见场景 |
|---|---|---|
| allow | 规则引擎判断通过 | 用户通过所有规则层级正常放行 |
| blocked | 规则引擎判断拦截 | 用户未通过某一层规则(国家、平台、黑名单等) |
| user_blacklisted | 黑名单优先拦截 | 该设备/用户在黑名单中,未进入规则引擎直接拦截 |
| override_allow | 即时覆盖放行 | 管理员已对该用户添加「允许通过」覆盖,优先级高于规则引擎 |
| override_block | 即时覆盖拦截 | 管理员已对该用户添加「强制拦截」覆盖 |
| applink_unlocked | AppLink 解锁放行 | 用户通过点击 AppLink 深层连结解锁,属于永久放行状态 |
| canary_blacklisted | 灰度自动封禁 | 用户进入灰度版本且命中比例,已自动写入黑名单 |
| canary_excluded | 灰度仅拦截 | 用户进入灰度版本但未命中比例,仅拦截不写黑名单 |
排查用户问题的典型流程
在搜索框输入用户的设备 UID → 找到对应的验证记录 → 展开详情查看是哪一层规则导致拦截 → 根据情况选择修改规则、解除黑名单或添加即时覆盖。
4. Flutter App 集成指南
4.1 集成步骤
在 SDK 生成页面选择目标版本,生成并复制 Dart SDK 代码。
在 Flutter 项目中创建 app_pipeline_sdk.dart 文件,粘贴生成的代码。
在 pubspec.yaml 中确认已添加 http 依赖:http: ^1.1.0
在 App 启动时(通常在 main.dart 或首屏页面的 initState)调用验证 API。
import 'app_pipeline_sdk.dart';
final sdk = AppPipelineSDK(
apiEndpoint: 'https://your-domain.com/api/verify',
);
final result = await sdk.verify(
deviceUid: await getDeviceUid(),
userId: currentUser?.id,
countryCode: 'TW',
platform: Platform.isIOS ? 'ios' : 'android',
);
if (result.allowed) {
switch (result.outputMode) {
case 'url':
launchUrl(Uri.parse(result.output!.url!));
break;
case 'type':
navigateByType(result.output!.type!);
break;
case 'custom_params':
handleCustomParams(result.output!.params!);
break;
}
} else {
showBlockedContent(result.output);
}4.2 设备 UID 获取建议
| 平台 | 推荐方案 |
|---|---|
| iOS | device_info_plus 插件获取 identifierForVendor |
| Android | device_info_plus 插件获取 androidId |
| 通用 | 首次启动时生成 UUID 并存储到 shared_preferences,作为持久化设备标识 |
4.3 降级策略建议
当验证 API 请求失败(网络超时、服务端错误)时,建议 App 端采用以下降级策略:
5. 常见问题(FAQ)
Q:修改规则层级后需要多久生效?
A:规则修改后立即生效,下一次 App 端发起验证请求时即可命中新规则。无需重新发版,也无需等待缓存刷新。
Q:灰度版本和普通灰度发布有什么区别?
A:App Pipeline 的灰度模式专为 App Store 送审隔离设计,不是按比例放行用户。所有进入灰度版本的用户一律不放行,比例参数(1“100%)控制的是将多少比例的用户写入黑名单。送审期间建议设为 100%,确保所有尝试进入的审核员都被记录。
Q:即时覆盖和黑名单有什么区别?
A:两者都可以拦截用户,但优先级和用途不同。验证顺序为:黑名单检查 → 灰度判断 → 即时覆盖 → 规则层级。即时覆盖优先级最高,支持「允许通过」操作(可覆盖黑名单)。黑名单适合批量封禁,包括灰度自动封禁;即时覆盖适合对单个用户的紧急处置。
Q:验证 API 的请求频率有限制吗?
A:系统对单个 IP 的请求频率有限流保护(默认 100 次/分钟)。正常的 App 使用场景(每次启动调用一次)不会触发限流。若有批量测试需求,请联系研发调整限流配置。
Q:如何确认某个用户是否被拦截?
A:进入「验证日志」页面,在搜索框输入该用户的设备 UID 或用户 ID,查看最近的验证记录。展开详情可以看到是哪一层规则导致拦截,以及具体原因。
Q:同一个 App 可以有多个全量版本吗?
A:不建议。系统在执行验证时会取最新发布的全量版本。若同时存在多个全量版本,以 publishedAt 时间最新的为准。建议在发布新全量版本前,将旧版本下线。
Q:AppLink 解锁后为什么同时出现 applink_unlocked 和 override_allow?
A:这是旧版 SDK 的已知问题。AppLink 解锁后,旧版 SDK 会调用 clearCache() 导致后续 verify() 重走规则引擎,触发 override_allow。最新版 SDK 已修正此问题:解锁成功后将 applink_unlocked 结果写入缓存,5 分钟内的 verify() 直接返回 applink_unlocked,不会重复触发规则引擎。请重新生成并更新 SDK。
Q:AppLink 的 URL Scheme 应该怎么设定?
A:URL Scheme 必须与 App 的 AndroidManifest.xml 和 iOS Info.plist 中设定的 scheme 完全一致(区分大小写)。建议使用全小写字母加数字的组合(如 vclock、myapp2),避免使用通用名称(如 app、open)以防止与其他 App 冲突。
6. 名词对照表
| 中文名称 | 英文标识 | 说明 |
|---|---|---|
| App | app | 顶层应用对象 |
| 规则版本 | rules_version | 一套完整的分流规则配置 |
| 规则层级 | rules_layer | 版本内的单个判断步骤 |
| 白名单模式 | whitelist | 仅名单内的值通过 |
| 黑名单模式 | blacklist | 名单内的值被拦截 |
| 输出模式 | outputMode | URL 跳转 / Type 标识 / 自定义参数 |
| 即时覆盖 | override | 最高优先级的单用户处置记录 |
| 用户黑名单 | blacklist | 基于标识符的封禁记录 |
| 灰度发布 | canary release | 送审隔离模式:所有用户一律不放行,比例参数控制黑名单记录范围 |
| 灰度自动封禁 | canary_blacklisted | 用户进入灰度版本且命中比例时,系统自动写入黑名单的 userLevel 标识 |
| 灰度仅拦截 | canary_excluded | 用户进入灰度版本但未命中比例时,仅拦截不写黑名单的 userLevel 标识 |
| 设备 UID | deviceUid | 设备唯一标识符 |
| 国家码 | countryCode | ISO 3166-1 alpha-2 格式,如 TW、CN |
| 验证请求 | verify request | App 启动时调用的分流判断请求 |
| AppLink | applink | Deep Link 解锁机制,每个 App 一个,点击连结即可永久解锁 |
| URL Scheme | urlScheme | App 自定义协议,如 vclock://,用于唤起 App |
| AppLink Token | token | 6 位数字的唯一标识符,嵌入在深层连结 URL 中 |
| applink_unlocked | applink_unlocked | 用户通过 AppLink 解锁后的验证结果标识 |
| 操作日志 | operation log | 管理员操作的审计记录 |
| 验证日志 | verify log | App 端验证请求的历史记录 |
准备好开始配置了吗?