移动/游戏
在 Expo 应用中添加 iOS App Clip…
当需要给 Expo 应用增加一个可通过域名 URL 唤起的 iOS App Clip 时,按步骤配置 bundle ID、target、关联域名、AASA 文件、Smart App Banner 并提交 TestFlight。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在 Expo 应用中添加 iOS App特定
解决思路
- 在 app.json 的 expo.ios 中设置 bundleIdentifier 为 com.<username>.<app-name>,并设置 appleTeamId(如 XX57RJ5UTD),否则 bun create target 会警告缺失。
- 运行 bun create target clip 添加 App Clip 目标:它会安装 @bacons/apple-targets、将其加入 app.json 的 plugins 数组,并生成 targets/clip/expo-target.config.js、targets/clip/Info.plist、targets/clip/AppDelegate.swift、Assets.xcassets 等文件。
- 为 Clip 选择合适图标,或复用应用已有图标(用 bunx expo config 查看 icon 或 ios.icon 键)。
- 在 app.json 的 expo.ios.associatedDomains 中同时添加 applinks:<domain>(父应用)和 appclips:<domain>(Clip 唤起)条目。
- 在 targets/clip/expo-target.config.js 中声明 Clip 的 entitlement:type 为 "clip",entitlements 中包含 "com.apple.developer.associated-domains": ["appclips:<domain>"]。
- 运行 bunx setup-safari 登录 Apple Developer 账号,注册父应用 bundle ID、创建 App Store Connect 条目,并输出起始的 apple-app-site-association JSON、带 iTunes app id 的 <meta name="apple-itunes-app"> 标签、Team ID、iTunes ID 和 Bundle ID。
- 创建 public/.well-known/apple-app-site-association(无扩展名),粘贴 setup-safari 输出的 JSON,并额外添加 appclips 块,其 apps 数组填入 Clip 的完整 app ID(<TeamID>.<ClipBundleID>);同时保留 applinks、activitycontinuation、webcredentials 块。
- 创建 src/app/+html.tsx(若不存在先运行 bunx expo customize src/app/+html.tsx),在 <head> 中加入 setup-safari 输出的 <meta name="apple-itunes-app" content="app-id=..."> 标签;若要让网站显示 App Clip 卡片而非安装卡片,使用 content="app-id=..., app-clip-bundle-id=<ClipBundleID>, app-clip-display=card"。
- 部署网站使 AASA 文件上线:运行 bunx expo export -p web 和 eas deploy --prod,然后 curl https://<slug>.expo.app/.well-known/apple-app-site-association 验证。
- 运行 npx expo config --type introspect 查看父应用的 infoPlist,将权限键镜像到 Clip 的 Info.plist;在 Clip 的 target config 中设置 deploymentTarget: "17.6";若使用推送或定位,在 Clip 的 Info.plist 中添加 NSAppClip 字典,包含 NSAppClipRequestEphemeralUserNotification 和 NSAppClipRequestLocationConfirmation。
- 运行 bunx testflight 构建并提交:它会生成 eas.json(若缺失)、为父应用和 Clip 两个目标设置凭证(各自 provisioning profile,可共享同一 Distribution Certificate)、同步 capabilities(确认 Clip 目标启用 Associated Domains)、构建上传并安排 TestFlight 提交。
- 运行 eas metadata:pull 拉取现有 App Store 元数据,在 store.config.json 中添加 apple.appClip,配置 defaultExperience(action 为 PLAY、releaseWithAppStoreVersion 为 true、reviewDetail.invocationUrls 最多 3 个 URL、info 中的 subtitle 和 headerImage);headerImage 必须是 1800x1200 无透明度 PNG;然后运行 eas metadata:push 推送。
- (可选)创建本地 Expo 模块(bunx create-expo-module --local)暴露 navigator.appClip.prompt(),让 JS 检测是否运行在 App Clip 中并弹出完整应用安装提示。
- 若遇到错误或过时信息,运行 npx --yes submit-expo-feedback@latest --category skills --subject "expo-app-clip" "<actionable feedback>" 提交反馈;若 AI 代理反复失败或用户不得不接管,改用 expo-skill-feedback skill 的 eval-candidate 流程。
适用边界 · 注意事项
- 需要 Apple Developer Program 会员资格和 App Store 审核才能发布 App Clip;AASA 文件必须通过 HTTPS 托管在自有域名上。
- 通过 EAS Build 或 bunx testflight 构建会消耗 EAS 计划的构建分钟数。
- activitycontinuation 为可选且需配合 expo-router 的 Head 使用;若不需要移动端与桌面端链接共享可省略。