|
App Pipeline

产品使用手册

App Pipeline — Flutter 多层级用户分流系统

产品使用手册

文档版本

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 管理页面
App 管理页面
App 管理页面以卡片形式展示所有 Flutter 应用,支持新建、编辑和删除操作。

App 管理页面用于维护系统中的 Flutter 应用列表,每个 App 是规则版本的顶层容器。

字段说明
App 名称用于在后台识别的显示名称,建议与实际产品名一致
平台选择 iOS、Android 或跨平台,影响后续规则层级的平台筛选
描述可选,填写 App 的用途或备注说明
⚠️删除 App 会同时删除其下所有规则版本、规则层级以及 AppLink 记录,此操作不可恢复,请谨慎操作。

3.3 规则版本管理

规则版本列表页面
规则版本列表页面
规则版本列表展示所有版本的状态、输出模式和发布时间,支持状态流转操作。

规则版本是分流规则的核心载体,每个版本包含完整的规则层级配置和输出配置。

版本状态说明

状态颜色标识是否对用户生效说明
草稿灰色初始状态,可自由编辑规则
测试蓝色仅测试设备用于内部测试验证
灰度黄色全部拦截(送审隔离)所有用户一律不放行;比例参数(1“100%)控制写入黑名单的用户范围,专为 App Store 送审期间设计
全量绿色全部用户对所有通过验证的用户生效
已下线红色停止生效,保留历史记录

灰度版本的送审隔离机制

灰度版本专为 App Store 送审期间设计。与普通灰度发布(按比例放行)不同,App Pipeline 的灰度模式采用「全拦截 + 选择性记录」策略:

行为说明
所有用户一律不放行无论比例设定为多少,进入灰度版本的用户全部返回拦截结果,审核员无法看到线上内容
比例内用户写入黑名单命中比例的用户被记录到黑名单,原因为「灰度试图闯关」,后续请求直接被黑名单优先拦截
比例外用户仅拦截不记录未命中比例的用户同样被拦截,但不写入黑名单,避免黑名单无限膨胀
去重保护同一用户多次触发灰度规则,黑名单中只保留一条记录(upsert 机制)
💡送审标准操作:将版本状态切换为「灰度」,比例设为 100%(全部记录),送审通过后将版本切换为「全量」,并在黑名单页面清除所有「灰度试图闯关」的记录。

输出模式选择指南

输出模式适用场景示例
URL 跳转App 根据 URL 加载 WebView 或跳转外链通过 → https://app.example.com/vip
Type 标识App 根据 type 值切换页面路由或功能模块通过 → type: "vip_content"
自定义参数App 需要接收多个参数进行复杂逻辑处理通过 → {"tier": "A", "region": "TW"}
💡最佳实践:建议先以 10% 灰度发布,观察验证日志中的通过率和错误率,确认无异常后再逐步提升到 30%、50%,最终切换为全量。

3.4 规则层级配置

规则层级配置页面
规则层级配置页面
版本编辑页展示规则层级列表,支持添加、编辑、删除和排序,右侧提供规则测试工具。

规则层级是版本内的单个判断步骤,多个层级按照排序权重依次执行,全部通过才视为最终通过。

检测类型判断依据典型用途
国家检测请求携带的 countryCode按地区限制内容访问
安全参数请求携带的自定义安全参数值验证 App 是否携带合法签名
用户黑名单设备 UID 或用户 ID 是否在黑名单中拦截已封禁用户
平台类型请求携带的 platform 字段区分 iOS 和 Android 的内容
自定义参数请求携带的指定参数键值根据业务自定义的任意参数判断
ℹ️白名单和黑名单模式互斥,切换模式时名单内容保留,仅判断逻辑取反。层级按照「排序权重」字段的升序执行,建议按照从宽到严的顺序排列:先做国家检测(粗筛),再做用户黑名单(精筛),最后做安全参数(精确校验)。

3.5 用户黑名单

用户黑名单页面
用户黑名单页面
用户黑名单支持单条添加、批量 CSV 导入和解除封禁操作,支持按标识符类型筛选。

用户黑名单用于封禁特定用户,封禁后该用户的所有验证请求将直接返回拦截结果,无需经过规则层级判断。黑名单的优先级高于规则层级,但低于即时覆盖。

黑名单来源

来源触发方式原因标识
手动添加管理员在黑名单页面手动新增或批量 CSV 导入自定义填写
灰度自动封禁用户进入灰度版本且命中比例时,系统自动写入灰度试图闯关
ℹ️去重保护:同一标识符(identifierType + identifierValue)在黑名单中只保留一条记录。若同一用户多次触发灰度规则,不会产生重复记录,仅更新最后触发时间。

批量导入 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 生成页面
SDK 生成页面
SDK 生成页面根据选定版本自动生成 Dart SDK 代码,支持一键复制和 JSON 配置导出。

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 端验证请求,支持多维度搜索和展开查看各层级判断详情。

验证日志记录所有来自 App 端的验证请求,是监控系统运行状态和排查用户问题的核心工具。

筛选项说明
关键词搜索支持按设备UID、用户ID、IP地址、国家码模糊搜索
判断结果全部 / 通过 / 拦截 / 错误
平台全部 / iOS / Android / Other

验证结果类型说明(resultLevel)

结果类型含义常见场景
allow规则引擎判断通过用户通过所有规则层级正常放行
blocked规则引擎判断拦截用户未通过某一层规则(国家、平台、黑名单等)
user_blacklisted黑名单优先拦截该设备/用户在黑名单中,未进入规则引擎直接拦截
override_allow即时覆盖放行管理员已对该用户添加「允许通过」覆盖,优先级高于规则引擎
override_block即时覆盖拦截管理员已对该用户添加「强制拦截」覆盖
applink_unlockedAppLink 解锁放行用户通过点击 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 获取建议

平台推荐方案
iOSdevice_info_plus 插件获取 identifierForVendor
Androiddevice_info_plus 插件获取 androidId
通用首次启动时生成 UUID 并存储到 shared_preferences,作为持久化设备标识

4.3 降级策略建议

当验证 API 请求失败(网络超时、服务端错误)时,建议 App 端采用以下降级策略:

💡优先使用本地缓存:将上一次成功的验证结果缓存到本地(shared_preferences),请求失败时使用缓存结果。若无缓存,默认视为通过验证,展示默认内容,避免因服务端问题导致 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. 名词对照表

中文名称英文标识说明
Appapp顶层应用对象
规则版本rules_version一套完整的分流规则配置
规则层级rules_layer版本内的单个判断步骤
白名单模式whitelist仅名单内的值通过
黑名单模式blacklist名单内的值被拦截
输出模式outputModeURL 跳转 / Type 标识 / 自定义参数
即时覆盖override最高优先级的单用户处置记录
用户黑名单blacklist基于标识符的封禁记录
灰度发布canary release送审隔离模式:所有用户一律不放行,比例参数控制黑名单记录范围
灰度自动封禁canary_blacklisted用户进入灰度版本且命中比例时,系统自动写入黑名单的 userLevel 标识
灰度仅拦截canary_excluded用户进入灰度版本但未命中比例时,仅拦截不写黑名单的 userLevel 标识
设备 UIDdeviceUid设备唯一标识符
国家码countryCodeISO 3166-1 alpha-2 格式,如 TW、CN
验证请求verify requestApp 启动时调用的分流判断请求
AppLinkapplinkDeep Link 解锁机制,每个 App 一个,点击连结即可永久解锁
URL SchemeurlSchemeApp 自定义协议,如 vclock://,用于唤起 App
AppLink Tokentoken6 位数字的唯一标识符,嵌入在深层连结 URL 中
applink_unlockedapplink_unlocked用户通过 AppLink 解锁后的验证结果标识
操作日志operation log管理员操作的审计记录
验证日志verify logApp 端验证请求的历史记录

准备好开始配置了吗?