docs: Apple 开发者账号迁移 Runbook(中国→美国 Yanmei AI LLC)

完整迁移流程:把 Pangolin 的 Apple 签名从中国「岩美北京技术」(Team BYL4KQHMTN)
整体迁到美国「Yanmei AI LLC」,目标产物+仓库无中国账号痕迹。干净切割方案(全新
Bundle ID com.yanmeiai.* + 全新 Team/证书/描述文件/公证凭据,零依赖旧账号)。

含:命名总表、Apple 后台建资产逐步(App ID/App Group/两证书/四描述文件/ASC Key)、
本机钥匙串+公证凭据配置、仓库 Team ID/Bundle ID/App Group/实体名全量替换点清单、
gitea 12 个 Apple secret 换新、无痕验收清单、责任顺序表。已登记 docs/index.html。

代码替换待用户提供新 Team ID + 证书全名后单独一批执行。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FEVUXAbFT6bF1Qw27RHWoD
This commit is contained in:
wangjia
2026-09-06 19:42:46 +08:00
parent 4a76134ca9
commit 47c1e3329f
2 changed files with 243 additions and 0 deletions
+238
View File
@@ -0,0 +1,238 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Apple 开发者账号迁移 Runbook(中国 → 美国 Yanmei AI LLC</title>
<style>
:root{
--bg:#0f1117; --panel:#171a22; --panel2:#1d2129; --fg:#e6e8ee; --fg2:#a8afbd;
--accent:#e0884f; --accent2:#5fb0c9; --ok:#5ec27a; --bad:#e06a6a; --warn:#e0b84f;
--border:#272c36; --mono:"SF Mono",ui-monospace,Menlo,Consolas,monospace;
--sans:-apple-system,"PingFang SC","Helvetica Neue",Arial,sans-serif;
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--fg);font-family:var(--sans);line-height:1.7;font-size:15px}
.wrap{max-width:960px;margin:0 auto;padding:48px 24px 96px}
h1{font-size:29px;line-height:1.3;margin:0 0 8px;letter-spacing:-.01em}
.sub{color:var(--fg2);font-size:15px;margin:0 0 32px}
h2{font-size:21px;margin:52px 0 14px;padding-bottom:8px;border-bottom:1px solid var(--border)}
h3{font-size:16px;margin:28px 0 8px;color:var(--accent2)}
p{margin:10px 0}
code{font-family:var(--mono);font-size:.88em;background:var(--panel2);padding:1px 6px;border-radius:5px;color:#f0d9c4}
pre{background:#0a0c11;border:1px solid var(--border);border-radius:10px;padding:14px 16px;overflow-x:auto;font-family:var(--mono);font-size:13px;line-height:1.55;color:#cdd3df}
pre .c{color:#6b7385}
pre .r{color:var(--bad)}
pre .g{color:var(--ok)}
pre .y{color:var(--warn)}
.tag{display:inline-block;font-size:12px;font-weight:600;padding:2px 9px;border-radius:999px;vertical-align:middle}
.tag.bad{background:rgba(224,106,106,.16);color:var(--bad)}
.tag.ok{background:rgba(94,194,122,.16);color:var(--ok)}
.tag.warn{background:rgba(224,184,79,.16);color:var(--warn)}
.tag.you{background:rgba(95,176,201,.16);color:var(--accent2)}
.tag.me{background:rgba(224,136,79,.16);color:var(--accent)}
.card{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:18px 20px;margin:16px 0}
.card.root{border-left:3px solid var(--accent)}
.card.warn{border-left:3px solid var(--warn)}
.card.ok{border-left:3px solid var(--ok)}
.card h3{margin-top:0}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:14px}
th,td{text-align:left;padding:9px 12px;border-bottom:1px solid var(--border);vertical-align:top}
th{color:var(--fg2);font-weight:600;font-size:13px}
td code{font-size:.85em}
.ok-c{color:var(--ok)} .bad-c{color:var(--bad)} .warn-c{color:var(--warn)}
ul,ol{padding-left:22px;margin:10px 0}
li{margin:6px 0}
.lead{background:linear-gradient(180deg,rgba(224,136,79,.10),transparent);border:1px solid var(--border);border-radius:12px;padding:18px 20px;margin:0 0 8px}
.kbd{font-family:var(--mono);font-size:.85em;color:var(--accent)}
.small{color:var(--fg2);font-size:13px}
hr{border:none;border-top:1px solid var(--border);margin:40px 0}
a{color:var(--accent2)}
.who{font-size:11px;font-weight:700;letter-spacing:.03em}
ol.steps{counter-reset:s;list-style:none;padding-left:0}
ol.steps>li{counter-increment:s;position:relative;padding:2px 0 2px 40px;margin:14px 0}
ol.steps>li::before{content:counter(s);position:absolute;left:0;top:0;width:26px;height:26px;border-radius:50%;background:var(--panel2);border:1px solid var(--border);color:var(--accent);font-family:var(--mono);font-size:13px;font-weight:700;display:flex;align-items:center;justify-content:center}
</style>
</head>
<body>
<div class="wrap">
<h1>Apple 开发者账号迁移 Runbook</h1>
<p class="sub">Pangolin 客户端 · 中国「岩美北京技术」→ 美国「Yanmei AI LLC」· 目标:产物与仓库<strong>无中国开发者账号任何痕迹</strong> · 2026-09-06</p>
<div class="lead">
<strong>一句话:</strong>这是一次<strong>干净切割</strong>——启用全新 Bundle ID<code>com.yanmeiai.*</code>)、全新 Team、全新证书/描述文件/公证凭据,与旧中国账号<strong>零依赖</strong>(无需清理旧 App ID)。
分三块:<span class="tag you">你做</span> Apple 后台建资产 + gitea 传新 secret<span class="tag me">我做</span> 仓库代码里 Team ID / Bundle ID / App Group / 实体名的全量替换;<span class="tag me">我做</span> 本机钥匙串 + 公证凭据配置。
顺序很重要:<strong>先建 Apple 资产 → 我改代码 → 传 gitea → 验证首个构建</strong>
</div>
<div class="card warn">
<h3>⚠️ 动手前唯一的阻塞项:新 Team ID</h3>
<p>代码替换需要美国账号的 <strong>10 位 Team ID</strong>。登录 <a href="https://developer.apple.com/account">developer.apple.com/account</a> → 左栏 <b>Membership details</b><b>Team ID</b>(形如 <code>A1B2C3D4E5</code>)。把它发我,我就执行全量代码替换。本文中一律用 <code>&lt;NEW_TEAM&gt;</code> 占位。</p>
</div>
<h2>0 · 命名总表(新账号下的目标身份)</h2>
<table>
<tr><th></th><th>旧(中国,待清除)</th><th>新(美国 Yanmei AI LLC</th></tr>
<tr><td>Team ID</td><td><code>BYL4KQHMTN</code></td><td><code>&lt;NEW_TEAM&gt;</code>(你提供)</td></tr>
<tr><td>法人实体(证书 CN 内含)</td><td>Yanmei (beijing) Technology Co., Ltd</td><td>Yanmei AI LLC</td></tr>
<tr><td>macOS 主 app Bundle ID</td><td><code>com.pangolin.pangolin</code></td><td><code>com.yanmeiai.pangolin</code></td></tr>
<tr><td>macOS 扩展 Bundle ID</td><td><code>com.pangolin.pangolin.PacketTunnel</code></td><td><code>com.yanmeiai.pangolin.PacketTunnel</code></td></tr>
<tr><td>iOS 主 app Bundle ID</td><td><code>com.pangolin.pangolinVpn</code></td><td><code>com.yanmeiai.pangolin</code></td></tr>
<tr><td>iOS 扩展 Bundle ID</td><td><code>com.pangolin.pangolinVpn.PacketTunnel</code></td><td><code>com.yanmeiai.pangolin.PacketTunnel</code></td></tr>
<tr><td>iOS App Group</td><td><code>group.com.pangolin.pangolinVpn</code></td><td><code>group.com.yanmeiai.pangolin</code></td></tr>
<tr><td>macOS App Group(原生 <code>&lt;Team&gt;.</code> 格式)</td><td><code>BYL4KQHMTN.com.pangolin.pangolin</code></td><td><code>&lt;NEW_TEAM&gt;.com.yanmeiai.pangolin</code></td></tr>
<tr><td>macOS <code>NEMachServiceName</code></td><td><code>BYL4KQHMTN.com.pangolin.pangolin.PacketTunnel</code></td><td><code>&lt;NEW_TEAM&gt;.com.yanmeiai.pangolin.PacketTunnel</code></td></tr>
</table>
<p class="small">iOS App Group 不含 Team ID<code>group.</code> 前缀,跨账号可移植);macOS 用原生 <code>&lt;TeamID&gt;.&lt;name&gt;</code> 格式,<strong>Team 一换前缀必变</strong>——这也是必须改代码而非纯换证书的根本原因。旧 macOS 安装的登录态存在旧 App Group 容器里,切换后清空、用户需重登(重签本就如此,可接受)。</p>
<h2>1 · Apple 后台建资产 <span class="tag you">你做</span></h2>
<p>全部在 <a href="https://developer.apple.com/account">developer.apple.com/account</a>(美国账号)完成。按顺序:</p>
<h3>1.1 记下 Team ID</h3>
<p>Membership details → <b>Team ID</b> → 发我。</p>
<h3>1.2 注册 4 个 App IDIdentifiers</h3>
<p>Certificates, IDs &amp; Profiles → <b>Identifiers</b> → App IDs → App。逐个建:</p>
<table>
<tr><th>Description</th><th>Bundle IDExplicit</th><th>勾选的 Capabilities</th></tr>
<tr><td>Pangolin macOS</td><td><code>com.yanmeiai.pangolin</code></td><td>App Groups、Network Extensions</td></tr>
<tr><td>Pangolin macOS PacketTunnel</td><td><code>com.yanmeiai.pangolin.PacketTunnel</code></td><td>App Groups、Network Extensions</td></tr>
<tr><td>Pangolin iOS</td><td><code>com.yanmeiai.pangolin</code></td><td>App Groups、Network Extensions</td></tr>
<tr><td>Pangolin iOS PacketTunnel</td><td><code>com.yanmeiai.pangolin.PacketTunnel</code></td><td>App Groups、Network Extensions</td></tr>
</table>
<p class="small">iOS 与 macOS 主 app 共用同一字符串 <code>com.yanmeiai.pangolin</code>——App ID 允许跨平台同串(一个 App ID 记录即可对两端生效)。若后台不让重复建,建一个即可,两端工程都指它。</p>
<h3>1.3 创建 App Group</h3>
<p>Identifiers → 右上下拉切到 <b>App Groups</b> → 填 <code>group.com.yanmeiai.pangolin</code>Description 随意)。回到上面 4 个 App ID,编辑其 <b>App Groups</b> capability → Configure → 勾上这个 group。</p>
<div class="card"><p class="small"><b>macOS 端说明:</b>macOS 用的是原生 <code>&lt;NEW_TEAM&gt;.com.yanmeiai.pangolin</code>team 作用域容器,不带 <code>group.</code>),<strong>不需要在后台单独注册</strong>——只要 App ID 勾了 App Groups capability、且用该 Team 的证书签名即可生效。后台注册的 <code>group.com.yanmeiai.pangolin</code> 供 iOS 使用。</p></div>
<h3>1.4 生成 2 张证书(Certificates</h3>
<p>用「钥匙串访问 → 证书助理 → 从证书颁发机构请求证书」生成一个 <code>CertificateSigningRequest.certSigningRequest</code>(存到磁盘),后台上传它换证书;下载后<strong>双击导入 login 钥匙串</strong></p>
<ul>
<li><b>Developer ID Application</b>(macOS 站外分发 + 公证用)→ 下载 <code>developerID_application.cer</code></li>
<li><b>Apple Distribution</b>iOS ad-hoc / App Store / TestFlight)→ 下载 <code>distribution.cer</code></li>
</ul>
<p class="small">导入后,两张证书的主体会是 <code>Developer ID Application: Yanmei AI LLC (&lt;NEW_TEAM&gt;)</code><code>Apple Distribution: Yanmei AI LLC (&lt;NEW_TEAM&gt;)</code><strong>请把这两串完整名字发我</strong><code>security find-identity -v -p codesigning</code> 可打印),我要把它们精确写进 <code>local_test.sh</code></p>
<h3>1.5 导出 .p12(给 CI 用)</h3>
<p>钥匙串里分别右键两张证书(连带私钥)→ 导出为 .p12,设一个导出密码(记进 Bitwarden,别写文件)。得到 <code>developerID.p12</code><code>ios_dist.p12</code>——第 4 节转 base64 传 gitea。</p>
<h3>1.6 创建 4 个描述文件(Profiles)</h3>
<p>Profiles → +:</p>
<table>
<tr><th>类型</th><th>关联 App ID</th><th>证书</th><th>用途</th></tr>
<tr><td><b>Developer ID</b>macOS,含 Network Extensions</td><td><code>com.yanmeiai.pangolin</code></td><td>Developer ID Application</td><td>macOS 主 app</td></tr>
<tr><td><b>Developer ID</b>macOS</td><td><code>com.yanmeiai.pangolin.PacketTunnel</code></td><td>Developer ID Application</td><td>macOS sysext</td></tr>
<tr><td><b>App Store</b>iOS</td><td><code>com.yanmeiai.pangolin</code></td><td>Apple Distribution</td><td>iOS 主 app</td></tr>
<tr><td><b>App Store</b>iOS</td><td><code>com.yanmeiai.pangolin.PacketTunnel</code></td><td>Apple Distribution</td><td>iOS 扩展</td></tr>
</table>
<p class="small">各自下载 <code>.provisionprofile</code>macOS/ <code>.mobileprovision</code>iOS)。CI 会用它们;本机 <code>local_test.sh</code> 的 macOS 流程也从固定目录读这两个 macOS profile(第 3 节代码替换里会核对路径)。</p>
<h3>1.7 App Store Connect API Key</h3>
<p><a href="https://appstoreconnect.apple.com/access/integrations/api">App Store Connect → Users and Access → Integrations → App Store Connect API</a> → 生成一个 <b>Team Key</b>Role: Developer 或 App Manager)→ 记下 <b>Key ID</b><b>Issuer ID</b>,下载 <code>AuthKey_XXXX.p8</code>(只能下一次,妥存 Bitwarden)。用于公证(notarytool)与 CI 上传。</p>
<h2>2 · 本机配置 <span class="tag me">我做</span>(你把证书/凭据准备好后)</h2>
<ol class="steps">
<li>确认新证书已在 login 钥匙串:我跑 <code>security find-identity -v -p codesigning</code> 核对 <code>Developer ID Application: Yanmei AI LLC</code><code>Apple Distribution: Yanmei AI LLC</code> 在列。</li>
<li>建公证凭据 profile<code>local_test.sh</code> 用的 <code>pangolin-notary</code>)——用 1.7 的 ASC Key
<pre>xcrun notarytool store-credentials pangolin-notary \
--key <span class="y">AuthKey_XXXX.p8</span> --key-id <span class="y">&lt;KEY_ID&gt;</span> --issuer <span class="y">&lt;ISSUER_ID&gt;</span></pre>
这一步把凭据存进本机钥匙串,不入 git。(此命令需交互,可能由你在终端用 <span class="kbd">! …</span> 跑,我给你现成命令。)</li>
<li>(可选)清理旧账号残留:删除 login 钥匙串里旧的 <code>… Yanmei (beijing) Technology</code> 两张证书,避免签名时误选旧身份。</li>
</ol>
<h2>3 · 仓库代码全量替换 <span class="tag me">我做</span>(拿到 Team ID + 证书全名后)</h2>
<p>下述文件里的旧 Team ID / Bundle ID / App Group / 实体名一次性替换。改完 <code>flutter build ios --no-codesign</code> + macOS 构建自检,确保工程仍自洽。</p>
<h3>3.1 Team ID <code>BYL4KQHMTN</code><code>&lt;NEW_TEAM&gt;</code></h3>
<table>
<tr><th>文件</th><th></th></tr>
<tr><td><code>scripts/local_test.sh</code></td><td><code>TEAM_ID</code> + 签名主体串</td></tr>
<tr><td><code>scripts/ci/compile-macos.sh</code></td><td><code>TEAM_ID=</code>App Group 由它派生)</td></tr>
<tr><td><code>scripts/ci/compile-ios.sh</code></td><td><code>TEAM_ID=</code></td></tr>
<tr><td><code>client/macos/Runner.xcodeproj/project.pbxproj</code></td><td>6× <code>DEVELOPMENT_TEAM</code></td></tr>
<tr><td><code>client/ios/Runner.xcodeproj/project.pbxproj</code></td><td>6× <code>DEVELOPMENT_TEAM</code></td></tr>
<tr><td><code>client/macos/Runner/Release.entitlements</code></td><td>App Group 值</td></tr>
<tr><td><code>client/macos/PacketTunnel/PacketTunnel.entitlements</code></td><td>App Group 值</td></tr>
<tr><td><code>client/macos/PacketTunnel/Info.plist</code></td><td><code>NEMachServiceName</code> 前缀</td></tr>
<tr><td><code>client/macos/PacketTunnel/PacketTunnelProvider.swift</code></td><td><code>private let appGroup</code></td></tr>
</table>
<h3>3.2 Bundle ID 换新(<code>com.pangolin.*</code><code>com.yanmeiai.pangolin[.PacketTunnel]</code></h3>
<table>
<tr><th>文件</th><th></th></tr>
<tr><td><code>client/macos/Runner.xcodeproj/project.pbxproj</code></td><td><code>PRODUCT_BUNDLE_IDENTIFIER</code>app / 扩展 / Tests+ <code>PRODUCT_NAME</code>(扩展 = 标识符,铁律)</td></tr>
<tr><td><code>client/ios/Runner.xcodeproj/project.pbxproj</code></td><td><code>PRODUCT_BUNDLE_IDENTIFIER</code>app + 扩展)</td></tr>
<tr><td>macOS/iOS 各 <code>*.entitlements</code></td><td><code>application-identifier</code>、App Group 值、<code>NEMachServiceName</code></td></tr>
<tr><td><code>client/ios/{Runner,PacketTunnel}</code> 的 Swift</td><td><code>appGroup</code> 常量(<code>group.com.pangolin.pangolinVpn</code><code>group.com.yanmeiai.pangolin</code></td></tr>
<tr><td>macOS Swift <code>PacketTunnelProvider.swift</code></td><td><code>appGroup</code> 常量</td></tr>
<tr><td><code>scripts/ci/compile-macos.sh</code> / <code>compile-ios.sh</code> / <code>local_test.sh</code></td><td>App Bundle ID / SYSEXT Bundle ID 常量</td></tr>
</table>
<div class="card warn"><p class="small"><b>macOS 扩展铁律:</b><code>PRODUCT_NAME</code> 必须等于扩展 Bundle ID<code>com.yanmeiai.pangolin.PacketTunnel</code>)——否则 sysext 无法 realize。见 <a href="macos-sysext-realize-troubleshooting.html">macOS sysext 排障复盘</a></p></div>
<h3>3.3 实体名 → Yanmei AI LLC</h3>
<p><code>scripts/local_test.sh</code> 3 行签名主体串(<code>SIGN_ID</code><code>IOS_EXPECT_SIGNER</code>、注释)改成 1.4 你发我的证书精确全名。二进制里的签名主体来自证书,换证后自动为美国实体;这几行只是本机签名/自检时的匹配串。</p>
<h3>3.4 文档去痕(可选但符合「无痕」要求)</h3>
<p><code>docs/</code> 下多份历史文档写死了 <code>BYL4KQHMTN</code> 与中国实体名。这些是内部文档不进产物,但为彻底无痕,我会在同一批把 docs/ 里的 Team ID / 实体名一并改为新值或标注「已迁移」。</p>
<h2>4 · gitea Secrets 换新 <span class="tag you">你做</span></h2>
<p>gitea → 仓库 <code>wangjia/pangolin</code> → Settings → Actions → <b>Secrets</b>(注意历史经验:Apple 签名 secret 配在 <strong>用户级</strong>非仓库级,见记忆 <code>pangolin-apple-signing-assets</code>——按你当初配的层级更新)。<strong>名字不变,只换值</strong></p>
<table>
<tr><th>Secret 名</th><th>新值来源</th></tr>
<tr><td><code>DEVELOPER_ID_P12</code></td><td><code>base64 -i developerID.p12</code>1.5</td></tr>
<tr><td><code>P12_PASSWORD</code></td><td>导出 developerID.p12 时设的密码</td></tr>
<tr><td><code>MACOS_APP_PROVISION_PROFILE_BASE64</code></td><td>macOS 主 app 的 <code>.provisionprofile</code> base641.6</td></tr>
<tr><td><code>MACOS_SYSEXT_PROVISION_PROFILE_BASE64</code></td><td>macOS sysext 的 <code>.provisionprofile</code> base64</td></tr>
<tr><td><code>IOS_DIST_P12</code></td><td><code>base64 -i ios_dist.p12</code></td></tr>
<tr><td><code>IOS_DIST_PASSWORD</code></td><td>导出 ios_dist.p12 时设的密码</td></tr>
<tr><td><code>IOS_APP_PROVISIONING_PROFILE_BASE64</code></td><td>iOS 主 app 的 <code>.mobileprovision</code> base64</td></tr>
<tr><td><code>IOS_PACKETTUNNEL_PROVISIONING_PROFILE_BASE64</code></td><td>iOS 扩展的 <code>.mobileprovision</code> base64</td></tr>
<tr><td><code>APPSTORE_API_KEY_ID</code></td><td>1.7 的 Key ID</td></tr>
<tr><td><code>APPSTORE_API_ISSUER_ID</code></td><td>1.7 的 Issuer ID</td></tr>
<tr><td><code>APPSTORE_API_KEY_P8_BASE64</code></td><td><code>base64 -i AuthKey_XXXX.p8</code></td></tr>
</table>
<p class="small">macOS 转 base64<code>base64 -i 文件</code>(默认单行,直接粘 gitea)。Android 的 <code>RELEASE_KEYSTORE</code>/<code>KEY_PASSWORD</code> 是自签名,与 Apple 账号无关,<strong>不用动</strong></p>
<h2>5 · 验证 + 首个构建 <span class="tag me">我做</span> / <span class="tag you">你配合</span></h2>
<ol class="steps">
<li><b>本机 macOS</b><code>bash scripts/local_test.sh macos</code>build+签名+公证+staple+App Group 一致性闸)。</li>
<li><b>iOS 装机:</b>iPhone/iPad 连上后 <code>bash scripts/local_test.sh ipad "&lt;设备&gt;"</code>——脚本会核验签名主体,若还是旧证书会 die。</li>
<li><b>CI 发版:</b>打 tag <code>client-vX.Y.Z</code> 触发 gitea 流水线,用新 secret 构建。首次建议先跑一次看签名步骤绿。</li>
<li><b>无痕核验:</b>对产物二进制跑:
<pre>codesign -dvvv <span class="c"># 看 Authority / TeamIdentifier</span> Runner.app 2>&amp;1 | grep -E "Authority|TeamIdentifier"
<span class="c"># 期望:Yanmei AI LLC + &lt;NEW_TEAM&gt;,无 BYL4KQHMTN / beijing</span></pre>
再全仓 <code>grep -rn "BYL4KQHMTN\|beijing" client scripts .gitea</code> 应为空。</li>
</ol>
<div class="card ok">
<h3>✅ 无痕验收清单</h3>
<ul>
<li>产物二进制 <code>codesign -dvvv</code>Authority = <code>Yanmei AI LLC</code>、TeamIdentifier = <code>&lt;NEW_TEAM&gt;</code></li>
<li><code>grep -rn "BYL4KQHMTN" client scripts .gitea docs</code> → 空。</li>
<li><code>grep -rin "beijing\|岩美" client scripts .gitea</code> → 空。</li>
<li>Info.plist / entitlements 里 App Group / NEMachServiceName 全为 <code>&lt;NEW_TEAM&gt;.com.yanmeiai.pangolin*</code></li>
<li>gitea 12 个 Apple secret 全为新值;旧 p12/profile 不再被任何 workflow 引用。</li>
<li>公证记录归属新账号(notarytool history 显示新 Team)。</li>
</ul>
</div>
<h2>6 · 顺序与责任一览</h2>
<table>
<tr><th>#</th><th>步骤</th><th></th><th>依赖</th></tr>
<tr><td>1</td><td>Apple 后台建 Team/App ID/Group/证书/Profile/ASC Key(§1</td><td><span class="tag you"></span></td><td></td></tr>
<tr><td>2</td><td>把 Team ID + 两张证书全名 + ASC Key 信息发我</td><td><span class="tag you"></span></td><td>1</td></tr>
<tr><td>3</td><td>本机钥匙串核对 + 建 <code>pangolin-notary</code> 公证凭据(§2</td><td><span class="tag me"></span></td><td>2</td></tr>
<tr><td>4</td><td>仓库代码全量替换(§3+ 构建自检</td><td><span class="tag me"></span></td><td>2</td></tr>
<tr><td>5</td><td>gitea 12 个 secret 换新值(§4</td><td><span class="tag you"></span></td><td>1</td></tr>
<tr><td>6</td><td>本机 macOS/iOS 构建验证(§5.15.2</td><td><span class="tag me"></span></td><td>3,4</td></tr>
<tr><td>7</td><td>打 tag 触发 CI 发版 + 无痕核验(§5.3–5.4)</td><td><span class="tag me"></span>+<span class="tag you"></span></td><td>4,5</td></tr>
</table>
<hr>
<p class="small">相关:<a href="macos-sysext-realize-troubleshooting.html">macOS sysext realize 排障</a> · <a href="ios-ipad-support-design.html">iOS/iPad 支持设计</a> · 签名资产位置见项目记忆 <code>pangolin-apple-signing-assets</code>。本文随迁移推进更新。</p>
</div>
</body>
</html>
+5
View File
@@ -235,6 +235,11 @@
</a>
<h2>排障 / Runbook</h2>
<a class="doc" href="apple-account-migration-runbook.html">
<div class="t">Apple 开发者账号迁移 Runbook(中国 → 美国)<span class="tag html">HTML</span></div>
<div class="d">把 Pangolin 的 Apple 签名从中国「岩美北京技术」(Team BYL4KQHMTN)整体迁到美国「Yanmei AI LLC」,做到产物与仓库无中国账号痕迹。干净切割:全新 Bundle ID(com.yanmeiai.*)+ 全新 Team/证书/描述文件/公证凭据,零依赖旧账号。含 Apple 后台建资产、本机钥匙串+公证、仓库 Team ID/Bundle ID/App Group/实体名全量替换点、gitea 12 个 secret 换新、无痕验收清单与责任顺序表。</div>
<div class="path">docs/apple-account-migration-runbook.html</div>
</a>
<a class="doc" href="connect-latency-urltest.html">
<div class="t">连接页延迟(urltest)· 跨端实现 + 排障 <span class="tag html">HTML</span></div>
<div class="d">连接页"延迟"= 内核 urltest(非直连实测)。根因链:服务端配置无 clash_api、libbox 单 client Group 不回调、Dart 广播流抢 EventChannel sink、连接态直连实测假值。各端(macOS/iOS/Android/Windows)注入 clash_api + 本地 HTTP 取法 + 排障打点 + libbox 构建前置(Android 要 JDK 17、包名 io.nekohasekai.libbox)。</div>