Hawk VPN
اینترنت امن و سریع
برای اتصال لمس کنید
سریع‌ترین سرور انتخاب می‌شود
انتخاب سرور
Ad
📢
تبلیغات TopOn
320×50 Banner
ترافیک
حجم امروز۵۰۰ MB
حجم باقی‌مانده۱۸۰ MB
🎁
سرورها
EU
اروپا
۵ سرور
32-45 ms
TR
ترکیه و همسایه
۳ سرور
28-35 ms
Asia
آسیا
۲ سرور
85-92 ms
ورود روزانه
+1 GB
🎬
حجم ویدیویی
+50 MB
👥
دعوت از دوستان
عمومی
زبان
فارسی
حساب
حساب کاربری
وصل نشده
پروفایل
کد دعوت دوست
بازخورد
نسخه
v1.0.0
درباره
مجوز متن‌باز
GPL-3.0
سیاست حفظ حریم خصوصی
جزئیات
پروژه پایهFlClash
مجوزGPL-3.0
اطلاعات حساب
UUIDa1b2c3d4-e5f6
ایمیل
کد دعوتTRN-A7K2M
حساب کاربری
ایمیل و بازیابی حساب
کد دعوت دوست
🎁

هر دعوت = ۵ گیگابایت

پس از اولین اجرای برنامه توسط دوستتان، هر دو نفر حجم می‌گیرید

5
دعوت موفق
25 GB
حجم دریافت شده
کد دعوت دارید؟ اینجا وارد کنید
AD5s
Loading ad...
🎉
恭喜获得奖励!
+50 MB
流量已添加到您的账户
🚀
连接成功
看一个短视频,立即获得额外流量
流量快用完了
剩余流量不足 20%,看一个短视频立即补充,避免连接中断
به‌روزرسانی اختیاری
نسخه جدید در دسترس است
v1.0.0 → v1.2.0
تغییرات این نسخه
حجم: 12.4 MB
0%
شما از آخرین نسخه استفاده می‌کنید
📱
حساب در دستگاه دیگری وارد شد
حساب شما روی یک دستگاه جدید وارد شده است. این دستگاه به حالت مهمان بازگشت.
⚠️
دریافت اشتراک ناموفق بود
دریافت لیست سرورها با خطا مواجه شد. لطفاً اتصال اینترنت خود را بررسی کنید یا برای کمک با پشتیبانی تماس بگیرید.
🚦
حجم شما تمام شد
حجم امروز شما به پایان رسید و اتصال قطع شد. برای دریافت حجم بیشتر با پشتیبانی تماس بگیرید یا وظایف رایگان را انجام دهید.
原型语言
启动 主页 节点 免费/权益 签到 设置 更新 订阅失败 流量用尽 反馈 资料 账号 邀请码 邀请 落地页 埋点
启动页 (Splash)
App 冷启动时展示品牌标识,同时完成初始化检查
📋 页面元素
元素说明数据源
品牌 Logo盾牌图标,圆角方形,绿色渐变,100×100px静态
App 名称"Hawk VPN",36px 粗体白色静态
品牌标语多语言标语(安全快速的互联网)静态i18n
加载动画旋转圆环,品牌绿色,40×40px本地
🔄 交互逻辑
触发行为时机
自动App 启动展示 Splash 页 → 执行后台初始化立即
自动初始化完成生成/读取 UUID → 拉取节点列表 → 版本检查 → 进入主页2.5s
⚙️ 后台初始化任务
任务说明失败处理
UUID 检查首次安装自动生成并上报服务端注册离线时延迟上报
节点列表更新拉取最新订阅地址,更新本地缓存使用本地缓存
版本检查对比最新版本号,强制更新时阻断进入跳过
任务状态同步同步当日签到/视频/分享完成状态默认未完成
Splash 固定 2.5s。网络不可用时跳过远程任务,使用本地缓存直接进入主页。订阅/节点列表拉取失败且无缓存时的处理见「订阅失败」页签。
主页 (Home)
核心页面,一键连接 VPN 并展示实时网络状态,一屏完整展示。连接前为大按钮,连接后切换为紧凑控制栏,减少占用面积
📋 页面元素
元素说明数据源
连接按钮(未连接)130px 大圆形,绿色+脉冲动画,居中展示,下方为状态文案+节点选择器本地VPN 引擎
紧凑控制栏(已连接)连接后大按钮收起,替换为一行:关闭(圆形) — 节点药丸(蓝绿描边胶囊,含节点名+国旗) — 重启(圆形),下方居中显示"已连接: HH:MM:SS"本地
关闭按钮54px 圆形,红色调电源图标,点击断开 VPN 并恢复大按钮视图本地
重启核心按钮54px 圆形,橙色调刷新图标,点击重启 VPN 核心(不断开会话),图标旋转 ~1.6s本地VPN 引擎
节点药丸(中间)绿色渐变胶囊,圆形国旗 + 节点名 + 实时连接指示(呼吸绿点"已连接") + 箭头,点击切换节点本地
节点选择器(未连接)圆角胶囊,圆形国旗 + 节点名 + 箭头,默认已预选节点(欧洲),非"选择节点"占位文案本地
实时速率下载/上传 (Mb/s) + 延迟 (ms),每 2s 刷新本地VPN 引擎
速率曲线图下载(绿)+上传(紫)双线实时曲线本地
Banner 广告位速率曲线图与流量卡片之间,60px 高横幅,左上角"Ad"角标,承载 TopOn 聚合 320×50 BannerTopOn SDK
流量配额卡片标题栏含刷新按钮(圆形,旋转图标)+获取流量按钮(绿色胶囊,FREE 角标);下方总流量(500MB)/剩余流量(180MB)+进度条服务端
获取流量按钮绿色渐变胶囊,文案"获取流量",右上角橙色"FREE"角标,点击跳转免费任务页静态
刷新按钮30px 圆形,刷新图标,点击重新拉取流量数据,加载时图标旋转 ~0.8s服务端
🔄 交互逻辑
操作行为
点击大连接按钮(未连接)进入"连接中"过渡态:按钮图标淡出 → 显示白色旋转圈 + 光晕呼吸动画 + 状态文案"正在连接..."(~1.2s) → 连接成功后大按钮淡出收起 → 紧凑控制栏缩放淡入 → 开始计时 → 开始速率监控
连接中过渡期间按钮锁定(pointer-events:none),忽略重复点击,避免状态错乱
点击关闭按钮(已连接)进入"断开中"过渡态:状态显示"正在断开..." → 紧凑控制栏缩放淡出(~0.28s) → 清除速率数据 → 大按钮(脉冲)视图淡入 → 停止计时
点击重启核心按钮保持连接 → 图标旋转 → 速率短暂重置 → ~1.6s 后恢复"已连接",状态文案显示"核心重启中..."
点击节点选择器/中间节点信息弹出节点底部弹窗(覆盖当前页面 70% 高度),已连接时切换节点即时更新控制栏
点击获取流量按钮跳转到免费任务页(Tab 切换至"免费"),引导用户做任务赚流量
点击刷新按钮图标旋转 → 重新请求服务端流量数据 → 更新总量/剩余/进度条(~0.8s)
自动流量耗尽强制断开 → 弹窗提示"流量已用尽" → 提供联系客服索要流量主按钮 + 获取免费流量次按钮(跳免费任务页)
自动网络断线网络恢复后自动重连
📢 Banner 广告 (TopOn 聚合)
说明
位置速率曲线图与流量卡片之间,常驻展示
广告平台TopOn 聚合平台,标准 Banner 尺寸 320×50
广告标识左上角"Ad"角标,符合广告合规要求
加载失败拉取失败时折叠隐藏,不占用布局空间
刷新策略建议 30-60s 自动刷新一次(遵循各广告源政策,最短 30s)
免广告后续 Premium 用户可移除 Banner 广告
一屏布局确保连接操作零滚动。节点选择器默认预选最优节点(欧洲),用户无需先选节点即可直接连接。连接/断开均有过渡动画:连接中显示旋转加载圈+光晕呼吸(~1.2s),两个视图缩放淡入淡出平滑切换。流量卡片提供刷新(手动同步服务端数据)与"获取流量"(跳免费任务页)两个快捷操作,FREE 角标强化引导。Banner 广告通过 TopOn 聚合变现,需遵循平台刷新与标识规范。流量用尽的强制断开与弹窗引导逻辑见「流量用尽」页签。
节点选择 (Node Sheet)
底部弹窗形式,从首页唤起,选择后自动关闭回到首页
📋 节点列表
区域节点延迟范围
🇪🇺 欧洲德国/法兰克福、荷兰/阿姆斯特丹、芬兰/赫尔辛基、罗马尼亚/布加勒斯特、瑞典/斯德哥尔摩32-45ms
🇹🇷 土耳其及邻国土耳其/伊斯坦布尔、亚美尼亚/埃里温、格鲁吉亚/第比利斯28-35ms
🌏 亚洲新加坡、印度/孟买85-92ms
📋 卡片信息
字段说明
国旗 Emoji视觉标识,28px
国家名称多语言,14px 粗体白色
城市名称多语言,11px 灰色
延迟值绿色数字 + "ms",右对齐
🔄 交互逻辑
操作行为
点击首页节点选择器弹出底部弹窗(高度 70%),列表可滚动
点击节点卡片卡片高亮(绿色边框)→ 200ms 后自动关闭弹窗 → 首页显示已选节点名
点击遮罩层关闭弹窗,不改变选择
节点数据 Splash 时预加载并缓存。底部弹窗保证用户不离开主页,选择后可直接连接。未来版本可增加 Premium 节点标识和延迟排序。
免费页 = 免费流量权益中心 (Benefit Center)
从「任务列表」升级为「权益中心」:把签到、视频补给、额外奖励、邀请统一成一个「拿权益」的入口。广告不是独立任务,而是换权益的步骤。
📋 页面结构
区块说明数据源
今日已获取(Hero)顶部大数字,实时累计当日所有来源获得的流量;右侧「今日」角标;下方动态提示「今日还能拿多少 / 还差多少领奖励」本地累加
每日签到(内嵌)直接内嵌在权益中心,非二级页:顶部卡片(连签天数/今日奖励/是否需视频/距高奖励天数) + 领取 CTA + 5 天波浪轨道。详见「签到」页签服务端配置
视频补给卡看激励视频换流量(单次奖励/每日次数后台配置),显示 {n}/{max} 进度;广告=换权益的步骤TopOn
邀请入口卡每邀请一人双方各得奖励流量(首开发放,数值后台配置),点击进入邀请页静态
🔄 状态标签
状态含义样式
去领取 / 去领今日可领、未完成绿色 ready
✓ 已领 / ✓ 已满今日已完成或达上限灰色 done,卡片禁用点击
🎬 激励视频流程
阶段UI 表现时长
1. 启动全屏黑色覆盖 + AD 标识 + 倒计时(5s) + 旋转加载圆0s
2. 加载文案"加载中..." + 进度条从 0% 开始走0-1.5s
3. 播放文案变"播放中..." + 进度条持续推进1.5-5s
4. 完成视频层消失 → 流量直接加进配额 → 弹出奖励弹窗5s
📊 埋点建议
事件名触发时机附加参数
benefit_center_view进入权益中心earned_today_mb
video_supply_complete视频补给完成发放count_today, reward_mb
激励视频的定位是「换权益的步骤」——补给流量直接加进配额,用户感知到的是流量,不是单纯广告。视频任务需完整播放 5s 才计入。签到详见「签到」页签,邀请详见「邀请」页签。奖励数值由后台配置。
每日签到 = 5 天波浪(内嵌权益中心)(Check-in Loop)
把固定签到改成 5 天一轮的波浪式奖励:前段轻松直领,中后段加视频门槛并出现峰值,形成「坚持到第 5 天最值」的心理锚点。直接内嵌在免费页/权益中心顶部,不做二级页面。
📅 5 天波浪节奏
天数奖励领取方式说明
第 1 天1 GB免费直领注册第1天直接领
第 2 天1 GB免费直领注册第2天直接领
第 3 天2 GB看激励视频中段出现门槛
第 4 天1 GB看激励视频
第 5 天5 GB🏆看激励视频峰值记忆点,橙色高亮
之后进入下一轮看激励视频循环 1→5
📋 页面元素
元素说明数据源
顶部卡片(紧凑)连续签到天数(只显示已连续 N 天,不显示"共5天",可无限连签) / 今日奖励(占比缩小) / 是否需看视频 / 距下次高奖励还差几天服务端
领取按钮 CTA免费天:「免费领取」;视频天:「看视频领取」;已领:「✓ 今日已领取」灰化本地
5 天轨道横向 5 格,今日高亮描边并上浮,第 5 天橙色峰值样式,已领打勾;不显示底部视频标识本地
🔄 交互逻辑
操作行为
点击领取(免费天)直接发放 → 流量加进配额 → 奖励弹窗 → 推进到下一天
点击领取(视频天)先播激励视频(5s) → 完成后发放 → 奖励弹窗 → 推进到下一天
第 5 天后回到第 1 天,进入下一轮
📊 埋点建议
事件名触发时机附加参数
checkin_view进入签到页streak_day
checkin_claim成功领取签到奖励day(1-5), reward_mb, via_video(bool)
checkin_peak_reached领取第 5 天峰值奖励reward_mb
基础版:连签展示(只显示已连续天数,可一直连续签到) + 下次高奖励提示。奖励节奏 5 天一轮循环,连续签到不因进入新一轮而中断。补签、连签保护、连续签到提醒为后续迭代。奖励数值与第 5 天是否递增均由后台配置。第 5 天做成记忆点是留存关键,让用户愿意回来。
设置页 (Settings)
通用偏好和账户管理入口,精简展示
📋 设置项
设置项类型分组说明
语言选择器(底部Sheet)通用波斯语/English/中文,切换即时生效,方向自动 RTL↔LTR
账号入口 →账户显示绑定状态(邮箱/未绑定),跳转账号页(绑定/找回/退出)
个人资料入口 →账户跳转个人资料子页(UUID、邮箱状态、邀请码只读展示)
填写邀请码入口 →账户一级入口,跳转邀请码填写子页,输入好友邀请码双方各得奖励流量(数值后台配置)
反馈入口 →账户跳转反馈子页,提交问题/建议
版本号入口 + 版本号账户显示当前版本 v1.0.0,点击即检查更新(检查更新功能合并到此项,无独立入口),逻辑见"更新"页
🔄 交互逻辑
操作行为存储
点击语言弹出底部 Sheet → 三选一 → 全局文案即时切换本地SharedPreferences
点击账号跳转账号页(邮箱+验证码绑定/找回/退出登录)服务端
点击个人资料跳转 Profile 子页
点击填写邀请码跳转邀请码填写子页 → 输入 TRN-XXXXX → 校验提交后输入框灰化服务端
点击反馈跳转 Feedback 子页
点击版本号请求服务端版本 → 有更新弹更新窗 / 无更新 Toast 提示
MVP 设置页精简。检查更新无独立入口,合并到"版本号"项——点击版本即检查更新,符合用户直觉。填写邀请码从个人资料页提升为设置一级入口,缩短被邀请人填码路径。后续版本可增加 Kill Switch、自动连接、分应用代理、深色模式等高级选项。
应用更新 (App Update)
启动时检查版本,根据更新类型弹出可选/强制更新弹窗;设置页提供手动检查入口
📋 更新类型
类型updateType可否关闭行为
可选更新optional可关闭弹窗显示「稍后」+「立即更新」,用户可关闭继续使用
强制更新force不可关闭隐藏「稍后」,无遮罩关闭,点击遮罩/返回均无效,必须更新完成才能使用
无更新none启动时静默;手动检查时提示「已是最新版本」
📋 弹窗元素
元素说明数据源
更新图标圆角方形下载图标,绿色渐变,64×64px静态
类型标签「可选更新」蓝色 / 「强制更新」红色服务端
标题可选:「发现新版本」/ 强制:「需要更新」静态i18n
版本号当前版本 → 最新版本 (v1.0.0 → v1.2.0)服务端
更新内容更新说明列表(多语言),可滚动,最大高 160px服务端
安装包大小显示 APK 体积 (12.4 MB)服务端
下载进度条点击更新后显示,0-100% + 百分比文案本地
操作按钮「立即更新」主按钮 + 「稍后」次按钮(仅可选)静态
🔄 启动检查流程
触发行为时机
自动Splash 初始化请求服务端版本信息接口启动 ~0.4s
自动进入主页后若 optional/force → 弹出更新弹窗;none → 不弹Splash 结束 2.5s 后
自动请求失败(离线)跳过检查,使用本地版本正常进入
🔄 设置页手动检查
操作行为
点击版本号项检查更新已合并到设置页"版本号"项;点击 → 版本号变「...」→ 请求服务端
有更新弹出更新弹窗(逻辑与启动一致,按类型区分可选/强制)
无更新底部 Toast 提示「已是最新版本」,2.2s 后消失
🔄 更新交互逻辑
操作行为
点击立即更新隐藏按钮 → 显示下载进度条 → 进度到 100% → 「安装中...」→ 关闭弹窗 → Toast「更新成功」→ 版本号刷新
点击稍后(仅可选)关闭弹窗,正常使用 App
点击遮罩(强制更新)无响应,弹窗不可关闭
点击遮罩(可选更新)保留弹窗(也可配置为关闭),引导用户决策
📡 版本检查接口 (示例)
字段类型说明
updateTypestringforce / optional / none
latestVersionstring最新版本号 (v1.2.0)
apkSizestring安装包大小 (12.4 MB)
downloadUrlstringAPK / 商店下载地址
minSupportedVersionstring低于此版本强制更新
notesobject多语言更新说明 {fa, en, zh}
强制更新场景:服务端协议变更、严重安全漏洞、低于 minSupportedVersion。强制更新弹窗不可绕过,确保旧版本用户必须升级。可选更新尊重用户选择,避免打扰。建议同一版本的可选更新弹窗每日最多提示一次。
订阅获取失败 (Subscription Fail)
拉取订阅/节点列表失败且无本地缓存时的兜底弹窗,引导用户联系客服
📋 触发条件
场景处理
拉取失败 + 本地缓存不弹窗,静默使用缓存节点进入主页
拉取失败 + 可用缓存弹出「订阅获取失败」弹窗,阻断进入,引导求助
触发入口Splash 初始化拉取订阅;主页/节点手动刷新失败亦可复用
📋 弹窗元素
元素说明数据源
警告图标⚠️ 红色圆形背景,60×60px静态
标题"订阅获取失败"(多语言)静态i18n
说明文案提示检查网络或联系客服(多语言)静态i18n
主按钮联系客服,含消息图标,点击打开客服渠道静态
次按钮"重试",关闭弹窗并重新拉取订阅本地
🔄 交互逻辑
操作行为
点击联系客服打开客服渠道(Telegram/邮箱/在线客服,示例 t.me/hawkvpn_support),关闭弹窗
点击重试关闭弹窗 → 重新执行订阅拉取(成功进入主页 / 再次失败复弹)
📊 埋点建议
事件名触发时机附加参数
sub_fetch_fail订阅拉取失败且无缓存,弹窗展示error_code, has_cache(bool)
contact_support_tap点击联系客服按钮source(sub_fetch_fail)
sub_fetch_retry点击重试按钮
仅在无缓存可用、无法进入应用时弹出,避免打扰有缓存的正常用户。客服入口是关键兜底:网络受限地区订阅失败常见,直达人工可显著降低卸载率。客服渠道通过脚本顶部 SUPPORT_URL 统一配置。
流量不足 & 流量用尽 (Quota Low / Exhausted)
两个阶段:① 剩余低于 20% 的「流量不足」提示看视频补给(不断开,属广告变现节点);② 剩余归零的「流量用尽」强制断开弹窗,引导联系客服。
⚡ 流量不足弹窗(20%)
说明
触发剩余流量跌破 20% 阈值且 >0、当前已连接时弹出;每次跌破最多提示一次(回升到阈值以上后重置)
定位广告变现节点:用户有明确痛感时,用看视频换流量,转化更高;不强制断开
主按钮「看视频 +流量」→ 播激励视频 → 完成补充流量 → 奖励弹窗
次按钮「暂不需要」→ 关闭,继续使用直到真正用尽
阈值默认 20%,后台可配置
📋 流量用尽触发条件
场景处理
剩余流量归零强制断开 VPN → 弹出「流量已用尽」弹窗
演示行为点击触发按钮时,若当前已连接会先模拟强制断开再弹窗
📋 弹窗元素
元素说明数据源
警示图标🚦 橙色圆形背景,60×60px静态
标题"流量已用尽"(多语言)静态i18n
说明文案提示联系客服索要流量或做任务获取(多语言)静态i18n
主按钮联系客服索要流量,含消息图标,打开客服渠道静态
次按钮"获取免费流量",关闭弹窗并跳转免费任务页本地
🔄 交互逻辑
操作行为
自动流量归零强制断开 VPN → 清空实时速率 → 弹出弹窗
点击联系客服索要流量打开客服渠道(示例 t.me/hawkvpn_support),关闭弹窗
点击获取免费流量关闭弹窗 → 切换到「免费」任务页
📊 埋点建议
事件名触发时机附加参数
quota_warning剩余流量跌破 20%,流量不足弹窗展示remaining_mb, total_mb
quota_low_boost_accept流量不足弹窗点击看视频补给reward_mb
quota_exhausted流量用尽,VPN 被断开,弹窗展示total_used_mb
contact_support_tap点击联系客服索要流量source(quota_exhausted)
get_traffic_tap点击获取免费流量跳转免费页source(quota_exhausted)
两阶段设计:「流量不足(20%)」是广告变现节点——用户有痛感时用看视频换流量,转化高于被动 Banner;「流量用尽」是核心转化节点,双路径(客服直达 + 做任务自助)。流量不足阈值与补给数值均后台可配置。客服渠道通过脚本顶部 SUPPORT_URL 统一配置,复用「订阅失败」页同一渠道。
反馈页 (Feedback)
用户提交问题或建议,自动附带设备信息辅助定位
📋 表单字段
字段类型必填说明
问题类型下拉选择连接/速度/错误/建议/其他
问题描述多行文本最多 500 字
截图图片上传最多 3 张,单张 ≤5MB
🔄 交互逻辑
操作行为
点击提交按钮校验必填项 → 提交 → 按钮变"已提交 ✓"(2s) → 恢复
点击上传图片唤起系统图片选择器 → 显示"已选择 1 个文件"
自动附带信息设备型号、OS版本、App版本、UUID、网络类型、当前节点
反馈提交后无需等待回复确认。设备信息自动收集减少用户填写负担。
个人资料 (Profile)
只读账户信息展示。邮箱绑定/找回已抽离为独立"账号"页(设置一级入口)
📋 页面元素
区块元素说明数据源
账户信息卡片UUID设备唯一标识(匿名账号),自动生成,不可修改本地
邮箱状态未绑定(红色标签)/ 已绑定(绿色✓)服务端
邀请码用户唯一码 TRN-XXXXX(只读展示)服务端
账号入口「邮箱与账号找回」入口 →跳转账号页(绑定/找回/退出)点击
个人资料页改为纯展示。账号相关的所有操作(绑定邮箱、换机找回、退出登录)统一收口到独立"账号"页,本页与设置页均提供入口。
账号体系 (Account)
匿名优先 + 邮箱找回。一个动作(邮箱+验证码)统一承担绑定、登录、找回,无密码,单设备登录
🧭 账号模型
概念角色说明
UUID匿名账号本身安装即生成,零注册可用,全部功能开放
邮箱账号钥匙(找回锚点)绑定后可在新设备找回;不是账号本身
云端账号数据载体按账号存流量/邀请/绑定状态/当前活跃设备;一个邮箱对应一个云端账号
🔑 核心原则:一个动作走天下
说明
用户视角永远只做"输入邮箱 → 收验证码 → 填验证码",无需理解绑定/登录/找回的区别
服务端判定邮箱未注册 → 绑定到当前匿名账号;邮箱已注册 → 切换到老账号(找回/登录)
验证方式邮箱 6 位数字验证码(OTP),无密码
📋 页面元素(三态)
状态元素说明
未绑定·邮箱步说明卡片"绑定邮箱后换机可找回账号和流量"
邮箱输入 + 发送验证码校验邮箱格式,点击发送进入验证码步
未绑定·验证码步验证码输入框6 位数字,大字间距居中
重发倒计时"重新发送(60s)",倒计时结束才可点
更换邮箱返回上一步重填邮箱
已绑定账号卡片绿色✓ + 邮箱地址 + "退出登录"按钮
保护说明说明单设备登录规则
🔄 四条流程
流程步骤
A 首次使用安装 → 生成 UUID → 直接可用,不弹任何登录/注册
B 绑定邮箱设置/资料→账号 → 输入邮箱 → 发码 → 填码 → 绑定成功,状态变"已绑定/可找回"
C 新机找回新机(临时匿名账号) → 账号页 → 输入已注册邮箱 → 验证码 → 拉取老账号数据 → 临时账号丢弃
D 老设备被踢新机登录后,老设备下次活动时收到"已在他处登录" → 弹窗提示 → 退回匿名账号
🔐 验证码 (OTP) 规则
规则
位数 / 有效期6 位数字 / 10 分钟
发送频率60s 内仅一次,按钮倒计时
错误处理验证码错误:输入框抖动报错;过期:提示重新发送
防滥用同邮箱/同 IP 每日发送次数上限(服务端)
⚖️ 单设备登录 & 边界场景
场景处理
单设备规则一个账号同一时刻仅一台设备活跃;新设备登录成功 → 老设备下次活动被踢下线
踢下线时机被动发现(下次打开/连接时),无需长连接推送
被踢后状态温和弹窗"账号已在新设备登录" → 退回新的匿名账号,App 仍可用
绑定时邮箱已被占用不报错,自动转找回:"该邮箱已有账号,正在为你恢复" → 走流程 C
新机登录时本地已有流量以老账号为准,本地临时数据丢弃
主动退出登录退回新的匿名账号,App 继续可用,不停在空白页
绑定前换机/卸载数据不可恢复(匿名固有代价),靠"攒流量后引导绑定"降低发生率
设计目标:用户不需要理解"注册/登录/绑定"的概念,全程只有"填邮箱+验证码"一个动作。绑定时机不应一进 App 就强制,而是在用户攒下流量/成功邀请等"有价值资产"时温和引导。话术讲收益("换手机也能找回流量"),不讲动作("去注册")。原型中已绑定态提供一个"模拟其他设备登录(演示)"入口,用于演示被踢下线弹窗。
填写邀请码 (Invite Code)
被邀请人填写好友邀请码的独立子页,从设置页一级入口进入
📋 页面元素
元素说明数据源
邀请码输入框placeholder: TRN-XXXXX,LTR 方向,供被邀请人填写
提交按钮半透明绿色按钮,提交成功后灰化不可再次修改
奖励提示"填写好友邀请码,双方各得免费流量"(数值后台配置,与邀请页一致)静态
🔄 交互逻辑
操作行为后续影响
点击设置→填写邀请码跳转本子页
点击提交邀请码校验格式 TRN-XXXXX → 提交 → 输入框+按钮灰化禁用双方各获得奖励流量(数值后台配置)
输入格式错误输入框边框变红 1.5s → 恢复
邀请码仅能提交一次,提交后不可修改。提升为设置一级入口,缩短被邀请人填码路径。奖励发放需被邀请人同时满足:填码 + 绑定邮箱(见"邀请"页奖励机制)。
邀请页 = 分享落地页链接 (Invite / Share)
从「填邀请码」改为「分享邀请链接 → 落地页 → 用户主动下载」。主路径是分享,邀请码输入框降级为老用户迁移 / 客服兜底。
📋 页面元素
元素说明数据源
🎁 奖励说明卡片「每邀请 = 奖励流量」,好友首次打开 App 后双方各得(数值后台配置)静态
主按钮:分享邀请链接调用系统分享(Web Share API),分享带参数的落地页链接;降级为分享流演示本地
次按钮:复制链接复制落地页链接到剪贴板,含 invite_code 参数本地
链接预览虚线框展示完整邀请链接本地
邀请统计成功邀请数 + 已获流量(双卡片),数值随语言本地化服务端
邀请码输入入口降级为底部小字链接「有邀请码?在这里输入」,仅老用户迁移/客服兜底,非主路径静态
🔄 推荐主流程
步骤说明
1. 分享用户点「分享邀请链接」,系统生成带 invite_code 参数的落地页链接
2. 落地页承接好友点开先进落地页(不直接跳商店),展示邀请关系 / 产品价值 / CTA
3. 主动下载好友主动点「下载 / 打开 Play / 打开其他商店 / 下载 APK」后才跳转
4. 建票据点击时链接参数先进服务器侧会话,生成一次性邀请票据 invite_session_id
5. 认领发奖App 首次打开自动注册成功后带票据回来认领 → 双方各得 5 GB
🎯 归因与发奖(两层)
职责说明
层 1:点击与落地页归因记录「谁分享给谁」落地页建 invite_session,写入服务器会话 + 短期 cookie/localStorage
层 2:有效行为发奖首开发放App 首次成功打开(自动注册成功)即允许认领并发奖;全局统一,不混用多个发奖点
🗄️ 邀请码输入框(保留旧路径)
用途说明
老用户迁移历史用户手动补录邀请关系
客服兜底归因异常时人工补录
不再作主路径普通用户不先面对邀请码输入框
邀请奖励继续用流量单位(GB),和签到/视频/分享统一成「免费流量权益中心」。发奖触发点固定为首开(用户打开自动注册成功后即发放)。落地页承接与归因票据详见「落地页」页签。
邀请落地页 + 归因 (Invite Landing)
好友点开邀请链接后先进落地页(website/invite/),承接邀请关系并由用户主动选择下载路径。归因不依赖 URL 参数自然透传,而是靠服务器票据 + App 首开认领。
📋 页面元素
元素说明数据源
邀请奖励卡「5 GB」大数字 + Install → First open 路径静态
主 CTA 安装按钮按 UA 检测跳 Play / Galaxy Store / 小米 GetApps本地UA
商店说明「打开 Google Play / Galaxy Store / GetApps」+「首次打开后发放奖励」静态i18n
APK 下载兜底按钮下方一行小字「直接下载 APK」,无商店设备的备用路径静态
多语言en / ru / fa,按 ?lang= 或浏览器语言,fa 自动 RTL本地
🔄 归因边界(各渠道)
渠道归因做法注意
Samsung Galaxy Store按官方 Install Referrer / User Attribution 接收归因信号不承诺任意自定义参数一定透传
Xiaomi GetApps按官方 Referral API / Install Referrer 接收以商店返回的 referral 与落地页票据匹配
直接下载 APK落地页先建票据,App 首开带票据回服务器认领普通浏览器下载 URL 参数不可靠透传,不依赖 query string
无商店兜底提示「未检测到可用商店」→ 唯一主 CTA 下载官方 APK,保留票据不让用户第一步卡死,不强制跳商店
🎫 邀请票据机制
阶段行为
建票据点击安装/下载时,落地页向服务器登记邀请关系,拿回一次性 invite_session_id,同时写入短期 cookie/localStorage
透传尝试商店链接附带 referrer(Play Install Referrer / Galaxy 官方参数),作为辅助信号
认领App 首次打开(自动注册成功)时带票据回服务器认领;服务器确认后正式记邀请关系
发奖首开认领成功 → 双方各得奖励(数值后台配置)
📊 埋点建议
事件名触发时机附加参数
invite_landing_view落地页展示has_invite_code(bool), lang, store
invite_session_create建立邀请票据invite_code, session_id
landing_install_tap点击主安装按钮store(play/galaxy/getapps)
landing_apk_tap点击 APK 兜底下载
invite_claim_successApp 首开认领票据成功session_id, claim_at(first_open)
核心原则:不承诺商店透传任意参数;普通 APK 下载不依赖 URL 参数保留到安装后。归因靠「落地页建票据 + App 首开认领」——发奖触发点全局统一为首开,不混用首连。落地页已在 website/invite/ 实现基础版(含 Play / Galaxy / GetApps 分流、APK 兜底与票据占位逻辑),真实认领接口待 App 端与服务端联调。
数据埋点 (Tracking)
用户行为与关键事件埋点,用于分析留存、转化和增长
📋 公共参数(每个事件自动附带)
参数类型说明
uuidstring设备唯一标识
app_versionstringApp 版本号 (v1.0.0)
osstring操作系统 (Android/iOS)
os_versionstring系统版本号
device_modelstring设备型号 (Samsung SM-G991B)
channelstring渠道来源 (official/telegram/invite)
regionstring用户地区 (IR/TR/DE),根据 IP 或 SIM 卡判断
languagestringApp 当前语言 (fa/en/zh)
network_typestring网络类型 (wifi/4g/5g)
timestampint64事件时间戳 (ms)
🚀 App 生命周期
事件名触发时机附加参数
app_launchApp 冷启动完成is_first_launch(bool)
app_init_completeSplash 初始化完成进入主页duration_ms(int)
app_enter_foreground从后台切回前台
app_enter_background切到后台connection_status(connected/disconnected)
🔗 VPN 连接
事件名触发时机附加参数
vpn_connect_tap点击连接按钮selected_node(string), is_auto_select(bool)
vpn_connect_successVPN 隧道建立成功node_id, node_country, connect_duration_ms
vpn_connect_fail连接失败node_id, error_code, error_msg
vpn_disconnect_tap手动点击断开session_duration_sec, traffic_used_bytes
vpn_disconnect_auto被动断开reason(quota_exhausted/network_lost), session_duration_sec
vpn_reconnect断线后自动重连成功node_id, reconnect_count
🎬 任务墙(免费流量)
事件名触发时机附加参数
task_page_view进入免费流量页
task_video_start点击观看激励视频video_count_today(int)
task_video_complete视频播放完成,发放奖励reward_mb(int), video_count_today
task_checkin_tap点击签到完成reward_mb(int)
task_share_tap点击分享按钮platform(telegram/whatsapp/copy)
task_share_complete分享完成返回,发放奖励reward_mb(int)
task_invite_entry_tap点击邀请好友入口
🎁 奖励闭环(签到 / 补给)
事件名触发时机附加参数
checkin_view进入签到页streak_day
checkin_claim成功领取签到奖励day(1-5), reward_mb, via_video(bool)
checkin_peak_reached领取第 5 天峰值奖励reward_mb
connect_boost_offer连接成功后展示视频补给提示
connect_boost_complete连接后视频补给发放reward_mb
video_supply_complete权益中心视频补给发放count_today, reward_mb
👥 邀请系统(分享落地页 + 票据)
事件名触发时机附加参数
invite_page_view进入邀请页
invite_share_tap点击分享邀请链接主按钮method(web_share/copy)
invite_landing_view好友打开落地页has_invite_code(bool), lang, store
invite_session_create落地页建立邀请票据invite_code, session_id
invite_claim_successApp 首开认领票据成功发奖session_id, claim_at(first_open)
invite_code_submit老用户/客服兜底提交邀请码code(string), success(bool)
📧 账号 / 邮箱登录
事件名触发时机附加参数
profile_page_view进入个人资料页email_bound(bool)
account_page_view进入账号页email_bound(bool)
email_send_code点击发送验证码email_domain, is_resend(bool)
email_verify_success验证码校验通过action(bind/recover)
email_verify_fail验证码校验失败reason(invalid/expired)
account_bind_success新邮箱绑定成功
account_recover_success已有邮箱找回老账号成功
account_login_other_device本设备被新设备登录踢下线
account_logout用户主动退出登录
📊 流量配额
事件名触发时机附加参数
quota_warning剩余流量低于 20%,流量不足弹窗展示remaining_mb, total_mb
quota_low_boost_accept流量不足弹窗点击看视频补给reward_mb
quota_exhausted流量用完,VPN 被断开total_used_mb
quota_refresh_tap点击流量刷新按钮remaining_mb, total_mb
get_traffic_tap点击"获取流量"按钮跳转免费页source(home_quota)
📢 广告 (TopOn 聚合)
事件名触发时机附加参数
ad_banner_impression主页 Banner 广告成功展示ad_unit_id, ad_network, ad_format(banner)
ad_banner_click点击 Banner 广告ad_unit_id, ad_network
ad_banner_failBanner 广告加载失败error_code
ad_rewarded_impression激励视频广告展示(任务墙)ad_unit_id, ad_network, ad_format(rewarded)
📋 上报策略
策略说明
上报方式实时上报,失败时本地缓存,下次启动重发
批量合并5s 内的事件合并为一次请求
离线缓存无网络时本地存储,上限 1000 条,FIFO 淘汰
核心闭环漏斗:连接 → 看到权益 → 看广告换流量 → 签到形成习惯 → 第 5 天高峰奖励 → 分享邀请带来新增 → 回来继续用。对应埋点:vpn_connect_success → benefit_center_view → video_supply_complete → checkin_claim → checkin_peak_reached → invite_share_tap → invite_landing_view → invite_claim_success。关注每步流失率。