From 84a2d3db016c7fa41c5bd261ed9136b690b8f4eb Mon Sep 17 00:00:00 2001 From: shenlei Date: Tue, 4 Aug 2026 16:50:22 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=89=E8=A3=85=E9=A1=B5=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E7=A7=BB=E5=8A=A8=E7=AB=AF=E5=8D=A1=E7=89=87=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E5=B9=B6=E6=94=AF=E6=8C=81=E6=B7=B1=E8=89=B2=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 抽出 DOWNLOAD_PAGE_TEMPLATE,卡片布局 + 大按钮,适配 iPhone 安全区 - 通过 prefers-color-scheme 切换配色,主色沿用 #50a0ff - 展示构建版本/Bundle ID/分支,补充 Safari 打开与信任描述文件提示 - 动态字段统一 html.escape,修正 install_url 中裸 & 未转义的问题 Co-Authored-By: Claude Opus 5 --- backend/services/distribution.py | 138 +++++++++++++++++++++++++++++-- 1 file changed, 132 insertions(+), 6 deletions(-) diff --git a/backend/services/distribution.py b/backend/services/distribution.py index 4982189..fe90cae 100644 --- a/backend/services/distribution.py +++ b/backend/services/distribution.py @@ -4,6 +4,7 @@ import plistlib import posixpath import re import shutil +from html import escape from pathlib import Path from urllib.parse import quote, unquote, urlparse @@ -54,14 +55,139 @@ def _write_manifest(config: dict, manifest: Path, ipa_url: str): plistlib.dump(data, f) +DOWNLOAD_PAGE_TEMPLATE = """ + + + + + +{title} - 安装 + + + +
+

{title}

+

版本 {version}

+ 安装 App +
{meta}
+

请使用 iPhone 自带的 Safari 浏览器打开本页面安装。
+ 安装后如提示“未受信任的开发者”,请前往「设置 → 通用 → VPN 与设备管理」信任该描述文件。

+
+ + +""" + + def _write_download_page(config: dict, html: Path, manifest_url: str): - install_url = f"itms-services://?action=download-manifest&url={quote(manifest_url, safe=':/?=&') }" - title = config.get("APPID_NAME", "iOS App") + install_url = f"itms-services://?action=download-manifest&url={quote(manifest_url, safe=':/?=&')}" + title = config.get("APPID_NAME") or "iOS App" + meta_items = [ + ("构建版本", config.get("BUILD_VERSION", "")), + ("Bundle ID", config.get("BUNDLE_ID", "")), + ("分支", config.get("SOURCE_BRANCH", "")), + ] + meta = "".join( + f"
{escape(label)}
{escape(str(value))}
" + for label, value in meta_items + if value + ) html.write_text( - "" - f"{title}

{title}

" - f"

版本 {config.get('VERSION', '')}

安装 App" - "", + DOWNLOAD_PAGE_TEMPLATE.format( + title=escape(title), + version=escape(str(config.get("VERSION", ""))), + install_url=escape(install_url, quote=True), + meta=meta, + ), encoding="utf-8", )