Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a392d18a6a | |||
| a913fe56fb | |||
| 18fb5177be | |||
| cd1ef98b27 | |||
| 6a3cb48a02 |
@@ -40,6 +40,10 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
# 浅克隆:走 ali frps 隧道时数据量从全历史降到一层,大幅降低 Checkout 超时率
|
||||
# (外网/在家都受益;根治外网稳定见 fetch 重试 + frps 调优)。
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Compile (Android APK)
|
||||
env:
|
||||
@@ -71,6 +75,10 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
# 浅克隆:走 ali frps 隧道时数据量从全历史降到一层,大幅降低 Checkout 超时率
|
||||
# (外网/在家都受益;根治外网稳定见 fetch 重试 + frps 调优)。
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Compile (Windows installer)
|
||||
shell: bash
|
||||
@@ -113,6 +121,10 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
# 浅克隆:走 ali frps 隧道时数据量从全历史降到一层,大幅降低 Checkout 超时率
|
||||
# (外网/在家都受益;根治外网稳定见 fetch 重试 + frps 调优)。
|
||||
fetch-depth: 1
|
||||
|
||||
# 多账号切换(见 docs/ci-multi-account-signing-design.html):从 signing.env
|
||||
# 单源读 SIGNING_ACCOUNT(us|cn),下方按它选账号的证书/ASC 密钥集。
|
||||
@@ -158,6 +170,10 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
# 浅克隆:走 ali frps 隧道时数据量从全历史降到一层,大幅降低 Checkout 超时率
|
||||
# (外网/在家都受益;根治外网稳定见 fetch 重试 + frps 调优)。
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Resolve signing account
|
||||
id: acct
|
||||
@@ -191,6 +207,10 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
# 浅克隆:走 ali frps 隧道时数据量从全历史降到一层,大幅降低 Checkout 超时率
|
||||
# (外网/在家都受益;根治外网稳定见 fetch 重试 + frps 调优)。
|
||||
fetch-depth: 1
|
||||
- name: Compile (Astro 官网)
|
||||
env:
|
||||
SITE_URL: https://pangolin.yanmeiai.com
|
||||
@@ -226,6 +246,10 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
# 浅克隆:走 ali frps 隧道时数据量从全历史降到一层,大幅降低 Checkout 超时率
|
||||
# (外网/在家都受益;根治外网稳定见 fetch 重试 + frps 调优)。
|
||||
fetch-depth: 1
|
||||
|
||||
# 一次性下所有 artifact(不带 name),避免同 job 内两次复用 download-artifact
|
||||
# action → act 对其只读缓存 git 仓库做二次操作时 EACCES(pack idx 444)。
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
# Uncomment this line to define a global platform for your project
|
||||
platform :ios, '14.0'
|
||||
platform :ios, '15.0'
|
||||
|
||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||
|
||||
@@ -465,7 +465,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
@@ -543,7 +543,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
@@ -592,7 +592,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
@@ -663,7 +663,7 @@
|
||||
"$(PROJECT_DIR)/Frameworks",
|
||||
);
|
||||
INFOPLIST_FILE = PacketTunnel/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@@ -695,7 +695,7 @@
|
||||
"$(PROJECT_DIR)/Frameworks",
|
||||
);
|
||||
INFOPLIST_FILE = PacketTunnel/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@@ -727,7 +727,7 @@
|
||||
"$(PROJECT_DIR)/Frameworks",
|
||||
);
|
||||
INFOPLIST_FILE = PacketTunnel/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
# download_urls 目前是固定「仅保留最新一份」的稳定 URL(deploy-client.sh 每次
|
||||
# 用同名文件覆盖),不是按版本变化的路径,因此这里不需要随发版改写。
|
||||
# macos 自 client-v1.0.59 起由 build-macos 产出 pangolin-macos-x64.zip 并部署到
|
||||
# /downloads,故填稳定直链;ios 走 TestFlight(无直接下载文件),保持留空。
|
||||
# /downloads,故填稳定直链;ios 走 TestFlight(无直接下载文件),填公测公开链接,客户端「有更新」按钮直接跳 TestFlight。
|
||||
version: "1.0.48"
|
||||
build_number: 10048
|
||||
force_update: false
|
||||
@@ -19,5 +19,5 @@ download_urls:
|
||||
android: "https://api.yanmeiai.com/downloads/pangolin-android.apk"
|
||||
windows: "https://api.yanmeiai.com/downloads/pangolin-windows-x64-setup.exe"
|
||||
macos: "https://api.yanmeiai.com/downloads/pangolin-macos-x64.zip"
|
||||
ios: ""
|
||||
ios: "https://testflight.apple.com/join/6HFfw8Jc"
|
||||
changelog: []
|
||||
|
||||
@@ -57,7 +57,14 @@ rm -rf "$WORK/sing-box"
|
||||
# sing-box 源码:默认 github,CI 里国内 runner 连不上 github → 经 SINGBOX_GIT 指向
|
||||
# NAS gitea 镜像(wangjia/sing-box,gitea migrate 自 github)。见 deploy-client.yml。
|
||||
SINGBOX_GIT="${SINGBOX_GIT:-https://github.com/SagerNet/sing-box.git}"
|
||||
git clone --depth 1 --branch "$SINGBOX_VERSION" "$SINGBOX_GIT" "$WORK/sing-box"
|
||||
# 已是 --depth 1 浅克隆;外网 runner 经 ali frps 隧道 clone 偶发超时 → 重试 3 次。
|
||||
_sb_ok=
|
||||
for _try in 1 2 3; do
|
||||
rm -rf "$WORK/sing-box"
|
||||
if git clone --depth 1 --branch "$SINGBOX_VERSION" "$SINGBOX_GIT" "$WORK/sing-box"; then _sb_ok=1; break; fi
|
||||
echo " sing-box clone 第 $_try 次失败(frps 抖动?),12s 后重试..."; sleep 12
|
||||
done
|
||||
[ -n "$_sb_ok" ] || { echo "✗ sing-box clone 重试耗尽($SINGBOX_GIT)"; exit 1; }
|
||||
cd "$WORK/sing-box"
|
||||
|
||||
echo "==> [3/3] 用官方 build_libbox 编核心库"
|
||||
|
||||
@@ -6,10 +6,18 @@ import { SITE } from '../config/site';
|
||||
interface Props { t: T }
|
||||
const { t } = Astro.props;
|
||||
|
||||
// href 缺省 = 本轮未接入下载(iOS 走 TestFlight / Linux),按钮渲染为禁用态占位。
|
||||
// Android + Windows + macOS 已由客户端 CI 产出真实产物并部署到 /downloads。
|
||||
const plats: { icon: string; name: string; ver: string; href?: string }[] = [
|
||||
{ icon: 'smartphone', name: 'iOS', ver: 'iOS 16+' },
|
||||
// href 缺省 = 未接入下载 → 禁用「敬请期待」占位。
|
||||
// iOS/iPad 合成一张卡、两个按钮:「测试版」(TestFlight 公开链接) 现已可装,
|
||||
// 「正式版」(App Store) 禁用,按钮内带「?」——悬浮提示「美区即将上线,需美区 Apple ID」。
|
||||
type Action = { label: string; href?: string; hint?: string };
|
||||
const plats: { icon: string; name: string; ver: string; href?: string; badge?: string; note?: string; actions?: Action[] }[] = [
|
||||
{
|
||||
icon: 'smartphone', name: 'iOS / iPad', ver: 'iOS / iPadOS 15+',
|
||||
actions: [
|
||||
{ label: t('dl.beta'), href: SITE.downloads.ios },
|
||||
{ label: t('dl.stable'), hint: `${t('dl.us_soon')} · ${t('dl.us_id')}` },
|
||||
],
|
||||
},
|
||||
{ icon: 'smartphone', name: 'Android', ver: 'Android 9+', href: SITE.downloads.android },
|
||||
{ icon: 'laptop', name: 'macOS', ver: 'macOS 12+', href: SITE.downloads.macos },
|
||||
{ icon: 'monitor', name: 'Windows', ver: 'Win 10/11', href: SITE.downloads.windows },
|
||||
@@ -27,9 +35,30 @@ const plats: { icon: string; name: string; ver: string; href?: string }[] = [
|
||||
{plats.map((p) => (
|
||||
<div class="dl">
|
||||
<div class="ico"><Icon name={p.icon} /></div>
|
||||
<div class="pn">{p.name}</div>
|
||||
<div class="pn">
|
||||
<span>{p.name}</span>
|
||||
{p.badge && <span class="badge">{p.badge}</span>}
|
||||
{p.note && <span class="q" title={p.note} tabindex="0" aria-label={p.note}>?</span>}
|
||||
</div>
|
||||
<div class="pv">{p.ver}</div>
|
||||
{p.href ? (
|
||||
{p.actions ? (
|
||||
<div class="btns">
|
||||
{p.actions.map((a) => (
|
||||
a.href ? (
|
||||
<a class="b2 beta" href={a.href}><span>{a.label}</span></a>
|
||||
) : (
|
||||
<span class="b2 disabled" aria-disabled="true">
|
||||
<span>{a.label}</span>
|
||||
{a.hint && (
|
||||
<span class="q" tabindex="0" aria-label={a.hint}>
|
||||
?<span class="tip" role="tooltip">{a.hint}</span>
|
||||
</span>
|
||||
)}
|
||||
</span>
|
||||
)
|
||||
))}
|
||||
</div>
|
||||
) : p.href ? (
|
||||
<a class="gb" href={p.href}><Icon name="download" /><span>{t('dl.get')}</span></a>
|
||||
) : (
|
||||
<span class="gb disabled" aria-disabled="true"><Icon name="download" /><span>{t('dl.soon')}</span></span>
|
||||
@@ -39,3 +68,56 @@ const plats: { icon: string; name: string; ver: string; href?: string }[] = [
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<style>
|
||||
/* iOS/iPad 测试版徽标 + 「?需美区 Apple ID」提示;颜色全走设计 token,不硬编码。 */
|
||||
.dl .pn { display: inline-flex; align-items: center; justify-content: center; gap: .38rem; flex-wrap: wrap; }
|
||||
.dl .badge {
|
||||
font-size: 11px; font-weight: 700; line-height: 1;
|
||||
padding: .22em .5em; border-radius: 999px;
|
||||
background: var(--accent-subtle); color: var(--accent);
|
||||
font-family: var(--font-mono); letter-spacing: .02em;
|
||||
}
|
||||
.dl .q {
|
||||
position: relative;
|
||||
display: inline-flex; align-items: center; justify-content: center;
|
||||
width: 16px; height: 16px; border-radius: 50%;
|
||||
font-size: 11px; font-weight: 700; cursor: default;
|
||||
background: var(--bg-subtle); color: var(--fg3);
|
||||
}
|
||||
/* 自定义提示气泡:走设计 token,悬浮/聚焦「?」时上浮显示,带小箭头。 */
|
||||
.dl .q .tip {
|
||||
position: absolute; bottom: calc(100% + 9px); left: 50%;
|
||||
transform: translateX(-50%) translateY(4px);
|
||||
width: max-content; max-width: 210px; white-space: normal;
|
||||
padding: 8px 11px; border-radius: var(--radius-md, 10px);
|
||||
background: var(--fg1); color: var(--bg);
|
||||
font-family: var(--font-sans); font-size: 12px; font-weight: 500;
|
||||
line-height: 1.45; text-align: center; letter-spacing: 0;
|
||||
box-shadow: var(--shadow-md, 0 6px 20px rgba(45,30,20,.18));
|
||||
opacity: 0; visibility: hidden; pointer-events: none; z-index: 20;
|
||||
transition: opacity var(--dur-base, .18s) var(--ease-out, ease),
|
||||
transform var(--dur-base, .18s) var(--ease-out, ease),
|
||||
visibility var(--dur-base, .18s);
|
||||
}
|
||||
.dl .q .tip::after {
|
||||
content: ""; position: absolute; top: 100%; left: 50%;
|
||||
transform: translateX(-50%);
|
||||
border: 5px solid transparent; border-top-color: var(--fg1);
|
||||
}
|
||||
.dl .q:hover .tip, .dl .q:focus-visible .tip {
|
||||
opacity: 1; visibility: visible; transform: translateX(-50%) translateY(0);
|
||||
}
|
||||
/* iOS/iPad 单卡双按钮:测试版(实心 accent 可点)+ 正式版(描边禁用,内含「?」悬浮提示)。 */
|
||||
.dl .btns { display: flex; gap: 8px; justify-content: center; flex-wrap: wrap; margin-top: 2px; }
|
||||
.dl .b2 {
|
||||
display: inline-flex; align-items: center; justify-content: center; gap: 6px;
|
||||
padding: 8px 15px; border-radius: 999px; line-height: 1.15;
|
||||
font-size: 13px; font-weight: 600; text-decoration: none;
|
||||
border: 1px solid var(--accent); color: var(--accent);
|
||||
}
|
||||
.dl .b2.beta { background: var(--accent); color: var(--fg-on-accent); border-color: var(--accent); }
|
||||
/* 禁用态:不导航(本就是 span)+ 默认光标,但不禁用指针事件——否则内含「?」的 title 悬浮失效。 */
|
||||
.dl .b2.disabled { border-color: var(--border); color: var(--fg3); cursor: default; }
|
||||
.dl .b2 .q { background: transparent; border: 1px solid var(--border); }
|
||||
</style>
|
||||
|
||||
@@ -41,5 +41,7 @@ export const SITE = {
|
||||
android: 'https://api.yanmeiai.com/downloads/pangolin-android.apk',
|
||||
windows: 'https://api.yanmeiai.com/downloads/pangolin-windows-x64-setup.exe',
|
||||
macos: 'https://api.yanmeiai.com/downloads/pangolin-macos-x64.zip',
|
||||
// iOS 无直接下载文件 → TestFlight 公测公开链接(点按钮直接跳 TestFlight 安装/更新)。
|
||||
ios: 'https://testflight.apple.com/join/6HFfw8Jc',
|
||||
},
|
||||
} as const;
|
||||
|
||||
@@ -137,6 +137,10 @@ export const STRINGS: Record<string, Record<Lang, string>> = {
|
||||
'dl.sub': { zh: '一个账户,所有设备同步。下载即用,无需配置。', en: 'One account syncs every device. Download and go.', ja: '一つのアカウントで全デバイスを同期。ダウンロードしてすぐ使えます。', ko: '하나의 계정으로 모든 기기를 동기화. 내려받아 바로 사용.', ru: 'Один аккаунт синхронизирует все устройства. Скачал — и в путь.', es: 'Una cuenta sincroniza todos tus dispositivos. Descarga y listo.' },
|
||||
'dl.get': { zh: '下载', en: 'Download', ja: 'ダウンロード', ko: '다운로드', ru: 'Скачать', es: 'Descargar' },
|
||||
'dl.soon': { zh: '敬请期待', en: 'Coming soon', ja: '近日公開', ko: '출시 예정', ru: 'Скоро', es: 'Próximamente' },
|
||||
'dl.beta': { zh: '测试版', en: 'Beta', ja: 'ベータ版', ko: '베타', ru: 'Бета', es: 'Beta' },
|
||||
'dl.stable': { zh: '正式版', en: 'Stable', ja: '正式版', ko: '정식판', ru: 'Релиз', es: 'Estable' },
|
||||
'dl.us_id': { zh: '需美区 Apple ID', en: 'Requires a US Apple ID', ja: '米国 Apple ID が必要', ko: '미국 Apple ID 필요', ru: 'Нужен Apple ID (США)', es: 'Requiere un Apple ID de EE. UU.' },
|
||||
'dl.us_soon': { zh: '美区即将上线', en: 'Coming to US App Store', ja: '米国 App Store で近日公開', ko: '미국 App Store 출시 예정', ru: 'Скоро в App Store (США)', es: 'Pronto en App Store (EE. UU.)' },
|
||||
|
||||
'docs.eyebrow': { zh: '文档', en: 'Docs', ja: 'ドキュメント', ko: '문서', ru: 'Документация', es: 'Documentación' },
|
||||
'docs.h': { zh: '需要帮助?都在这里', en: 'Need help? It’s all here', ja: 'お困りですか?すべてここに', ko: '도움이 필요하세요? 모두 여기에', ru: 'Нужна помощь? Всё здесь', es: '¿Necesitas ayuda? Todo está aquí' },
|
||||
|
||||
Reference in New Issue
Block a user