Safe Haven 开发者入门,注册应用、放 .safehaven 文件完成验证
为什么要注册
在 Safe Haven 目录里,一个应用条目的来源有三种:
- 开发者自己注册(verified_source)→ 可信度最高
- 社区贡献(unverified)→ 等开发者认领
- F-Droid / Izzy 同步(有 upstream 标记)→ 上游仓库来的
作为开发者,自己在 Safe Haven 注册应用的好处:
- 条目标记为 verified_source,详情页亮起"已验证源码"标志
- 可以完全控制条目描述、截图、标签、版本生命周期
- 自动同步或手动提交两种模式可选
- 后续自动更新走你自己的仓库(不需要再等 F-Droid / Izzy 同步)
第一步:Web 门户注册
打开 store.colourswift.com,登录(Safe Haven 自己的账号系统,不依赖 GitHub / Google),然后点"新建应用"。
需要填写的内容:
| 字段 | 类型 | 说明 |
|---|---|---|
| 显示名(Name) | 必填 | 用户在详情页看到的名字 |
| 简短描述(Summary) | 必填 | 一句话介绍,客户端列表卡片上显示 |
| 完整描述(Description) | 必填 | 完整功能说明,支持 Markdown |
| 包名 | 可选 | 不知道可以留空占位,扫描管线从 manifest 里提取真实包名后自动替换 |
| 源码仓库地址 | 必填 | GitHub / GitLab / Codeberg |
| 分类 | 必填 | 十个固定分类之一 |
| 标签(Keywords) | 可选 | 搜索关键词 |
| 应用图标 | 可选 | 1 个,PNG / JPEG / WebP,≤ 2 MB |
| 截图 | 可选 | 最多 6 张,同上格式约束 |
填完点"创建条目",Safe Haven 生成一个唯一的仓库验证 token——复制保存,第二步要用。
第二步:放 .safehaven 文件
Safe Haven 怎么知道你给的仓库地址真的归你管?
在你的源码仓库根目录(不是 app/ 子目录)创建一个叫 .safehaven 的文件(无扩展名),文件内容就是第一步 Safe Haven 给你的那个 token。
GitHub 上直接创建:
- 仓库主页点 "Add file" → "Create new file"
- 文件名输入
.safehaven - 文件内容粘贴 token(没有换行、没有多余字符)
- 点 "Commit changes" 提交
本地创建后推送(推荐,不容易出错):
# Linux / macOS 终端
echo "SAFEHAVEN_TOKEN_GOES_HERE" > .safehaven
git add .safehaven
git commit -m "Add Safe Haven verification file"
git push
# Windows PowerShell
Set-Content -Path .safehaven -Value "SAFEHAVEN_TOKEN_GOES_HERE" -NoNewline
git add .safehaven
git commit -m "Add Safe Haven verification file"
git push
重要:文件名必须是 .safehaven(没有 .txt 或其他后缀),必须放在仓库根目录,默认分支名如果是 master 而不是 main,Safe Haven 后台用的是 main——这种情况你可能需要改一下默认分支或等 Safe Haven 侧适配。
第三步:上传 APK 走扫描管线
创建条目并通过验证握手后,有两种方式上传 APK:
方式 A:自动提交(推荐)
在管理门户的应用设置里开启自动提交。Safe Haven 的统一 Poller 会每 6 小时检查你的上游仓库(GitHub Release / GitLab Tags / Codeberg Releases):
- 发现新版本 → 自动下载 APK → 自动过扫描管线 → 自动进公开目录
- 全程不需要你动手
方式 B:手动提交
如果你的发布节奏需要手动控制:
- 关闭自动提交模式
- 管理门户点"上传新版本"
- Safe Haven 生成一个 presigned PUT URL(AWS Signature Version 4,有效期 15 分钟)
- 用 PUT 请求把 APK 上传到这个 URL
上传工具可以用任何 HTTP 客户端。命令行示例:用 curl 发 PUT 请求,-T 后面指定 APK 文件路径,URI 填 Safe Haven 后台生成的 presigned URL(形如 在线存储桶域名/staging/包名/versionCode/app.apk + AWS Signature 参数)。Windows PowerShell 可以用 Invoke-WebRequest,Method 指定 PUT,InFile 填 APK 路径,Uri 填 presigned URL。或者用 Postman / Insomnia 等图形化工具,Body 选 Binary,选择 APK 文件,URI 填 URL。
上传完成后,扫描管线自动开始处理。
扫描管线会做什么
上传的 APK 会依次经过:
- pending_upload → pending_scan:文件到达 staging
- scanning:扫描器拉取 APK
- 计算 SHA-256,检查重复
- 提取 manifest 的 versionCode、versionName、包名
- 提取签名哈希,做签名锁定
- 跑 VX-TITANIUM 引擎(如果可用)
- 查本地威胁数据库
- 通过 → pending_review → live(自动批准,通常几小时内)
- 未通过 → rejected(查看具体拒绝原因,修正后重新提交)
提交成功了吗怎么看
回到 store.colourswift.com 的开发者后台,你的应用条目会显示当前状态和历史版本。状态是 live 就说明进公开目录了,客户端下次同步时能看到。
进目录后,Store 前端的公开页面格式为:在线商店域名 + /app/ + 包名。徽章图片地址:在线商店域名/badge.svg。
常见坑
.safehaven 文件放错位置
很多开发者第一次会把 .safehaven 放在 app/ 或 android/ 子目录下——Safe Haven 只查仓库根目录,子目录下的不算。确认路径:仓库根/.safehaven。
默认分支不是 main
Safe Haven 后台用 raw.githubusercontent.com 的 main 分支 URL 去抓 .safehaven。如果你的仓库默认分支叫 master,Safe Haven 可能抓不到文件。解决办法:在 GitHub 设置里把默认分支改成 main,或在 Safe Haven 后台反馈这个问题。
versionCode 没递增
扫描管线会用 manifest 里的 versionCode 做去重检查。如果你提交新版本但 manifest 里的 versionCode 和已有的一样,会触发"versionCode 重复"自动拒绝。每次提交新版本必须递增 versionCode。
APK 太大
单 APK 上限 100 MB。超过的会被扫描管线直接跳过。大应用可以:
- 拆成分包上传(AAB 格式,但 Safe Haven 目前只支持 APK)
- 或者直接等 Safe Haven 目录收录(如果它是开源且有人社区贡献的话)
x86 构建被排除
Safe Haven 只收 arm64-v8a 和 armeabi-v7a,x86 构建直接排除。如果你只发布 x86 版本(模拟器专用),Safe Haven 不会收录。