Highlight
App Clips 通常被认为是一种让用户快速体验你的 App 功能的方式。但 Session 10118 揭示了 App Clips 的另一个重要用途:作为平台型公司为你的企业客户提供的即用型服务。
核心内容
很多平台型 App 本来就在替线下商家做入口。餐厅目录、会员积分、停车缴费、预约服务都属于这一类。过去的问题是,平台的发现路径常常被锁在完整 App 内,用户要先安装 App,才能找到某一家店的菜单、积分或预约页面。
小商家通常没有精力维护自己的 iOS App。白标服务商又会遇到另一个麻烦:每个客户都想保留品牌感,但每个客户一个 App 会让开发、审核和维护成本持续上升。Session 10118 给出的路径是,把多个商家的 App Clip 体验收敛到一个 App Clip binary,再在 App Store Connect 里为每个商家创建独立的 Advanced App Clip Experience。
从用户视角看,Fantastico 餐厅、Mandy and Jason 商店、Reward+ 积分入口像是不同的 App Clip。它们可以有不同的体验 URL、卡片标题、头图、动作按钮和图标。从工程视角看,这些体验共用一个 binary,靠 URL、通知路由和当前会话状态进入正确的商家页面。
这让 App Clips 从“完整 App 的试用入口”变成了平台能力。你的 App 负责目录、交易和账号体系;每个商家拿到自己的 NFC、QR code、App Clip Code、位置建议或 Safari 入口;用户无需安装完整 App,就能完成一个很短的任务。
详细内容
多商家 App Clip 适合什么产品
(00:41)Apple 先给了三个判断标准。第一,你的 App 聚合了很多商家,用户通过目录发现它们。第二,你服务的小商家没有自己的 App。第三,你在某个行业里做很多白标 App,希望把它们合并成一个可维护的 App。
这些场景的共同点是:业务入口很多,核心流程相似,品牌需要分开。Food Grid 这样的餐厅目录可以为每家餐厅创建体验;Reward+ 这样的积分服务可以让顾客扫描线下码领取权益;白标 App 厂商可以把模板 App 合并成一套代码。
一个 App Clip binary
├── https://foodgrid.example/fantastico
├── https://foodgrid.example/mandy-and-jason
└── https://foodgrid.example/metatop
关键点:
foodgrid.example/fantastico来自 transcript 中的通知路由示例,表示某个商家的体验 URL 前缀。- 每个 URL 对应一个 Advanced App Clip Experience,系统用它决定启动哪一个商家体验。
- binary 只有一个,品牌入口可以有很多个。
先把完整 App 准备好
(04:43)落地步骤从完整 App 开始。你的完整 App 需要先能处理每个商家:目录浏览、搜索、分类展示、业务数据和商家页面都要存在。白标 App 则适合先把多个模板合并成一个主 App。
(05:55)完整 App 还应该支持 Universal Links。App Clip 的链接处理会以 NSUserActivity 的形式进入 App Clip,完整 App 里的深链模型越清楚,App Clip 的路由越容易保持一致。
func route(_ userActivity: NSUserActivity) {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL
else {
return
}
openBusinessExperience(for: incomingURL)
}
关键点:
NSUserActivityTypeBrowsingWeb对应 transcript 中提到的 browsing web 类型 invocation。webpageURL是体验 URL,App Clip 用它识别商家和具体任务。openBusinessExperience代表你自己的路由层,具体页面必须来自现有业务数据。
创建 App Clip target 并连接入口
(06:23)准备好完整 App 后,在 Xcode 里创建新的 App Clip target,并把主 App 中需要的代码、资源和 framework dependencies 选择性放进去。Session 明确强调,App Clip 被视为主 App 的一部分,大量代码可以复用。
(06:48)入口连接由三件事组成:配置 associated domains,处理 NSUserActivity,再到 App Store Connect 的 Advanced section 配置 App Clip card。这样用户才能从 NFC tag、QR code 或 App Clip Code 进入具体商家体验。
准备入口的最小清单
1. App Clip target: 只包含即时任务所需代码和资源
2. Associated domains: 让体验 URL 能匹配到 App Clip
3. NSUserActivity: 从 URL 解析商家和任务
4. Advanced App Clip Experience: 为每个商家配置卡片和审核项
关键点:
- target 负责“能运行”。
- associated domains 负责“系统能找到它”。
NSUserActivity负责“启动后去哪里”。- Advanced App Clip Experience 负责“每个商家怎么被展示和审核”。
通知必须能路由到正确商家
(07:45)多商家 App Clip 的第一个特殊问题是通知。通知会发给 App bundle,而不是发给某个具体 App Clip experience。iOS 需要额外信息来判断这条通知属于 Fantastico 还是 Mandy and Jason。
(08:19)做法是在通知内容里填入 targetContentIdentifier,值是一段描述通知内容的 URL。iOS 会做最长前缀匹配;如果字段前缀是 foodgrid.example/fantastico,系统就把通知路由到 Fantastico 的 App Clip experience。
let content = UNMutableNotificationContent()
content.title = "Fantastico"
content.body = "Your order is ready."
content.targetContentIdentifier = "https://foodgrid.example/fantastico"
关键点:
targetContentIdentifier是这段路由的关键字段。- URL 前缀要能对应 App Store Connect 中配置的体验 URL。
- 多商家体验不能只按 bundle 处理通知,否则系统无法知道通知属于哪家商户。
不要在相同 URL 上重开会话
(08:48)第二个特殊问题是会话状态。每次 App Clip invocation 都会带一个 browsing web 类型的 NSUserActivity。如果用户正在 Fantastico 里点餐,切到 Messages 后又从 App Library 打开 Fantastico,系统会再次传入同一个 URL。
(09:51)如果你的代码看到 URL 就 push 新页面,用户刚才的购物车会丢失。正确处理方式是先比较新 URL 是否对应当前 in-flight session;只有切到不同商家或不同任务时,才保存当前状态并进入新会话。
func continueExperience(with incomingURL: URL) {
if currentSession.matches(incomingURL) {
restoreCurrentScreen()
return
}
saveCurrentSession()
startSession(for: incomingURL)
}
关键点:
matches的判断来自你的业务路由,例如商家 ID、桌号、订单 ID。- 相同体验 URL 不应该清空当前页面栈。
- 不同商家体验进入前要保存状态,因为 App Clips 不支持多个窗口。
每个商家都要有自己的 App Clip card
(11:20)提交主 App 和嵌入的 App Clip 后,在 App Store Connect 中为每个商家创建 Advanced App Clip Experience。流程包括指定 experience URL,选择“promote a different business, service or brand powered by your app”,再提交审核。
(12:40)App Clip card 是用户第一次看到的入口。每个商家都能独立配置 header image、display title、subtitle、location association 和 action。Session 特别提醒,title 和 subtitle 应代表商家,而不是代表平台 App。
experienceURL: "https://foodgrid.example/fantastico"
presentation: "promote a different business, service, or brand"
card:
headerImage: "Fantastico.png"
displayTitle: "Fantastico"
subtitle: "Order Food"
action: "Open (Order Food)"
关键点:
- 这是配置清单,不是 App Store Connect API payload。
- header image 会出现在 App Clip card 和 loading screen,推荐上传高质量 PNG 或 JPG。
- action 来自预定义列表,例如 Open、View、Play;绑定物理地点时,Maps 语境下会有更多动作。
图标有三层含义
(15:25)最后一部分是图标。Session 区分了 app icon、app clip icon 和 app clip experience icon。app icon 代表完整 App,会出现在 App Clip card 底部的归属信息和 App Banner 里。
(15:52)app clip icon 在系统泛指这个 App Clip 时出现,例如 multitasking switcher、Notifications 和 Settings。iOS 会基于你的 app icon 自动应用 App Clip 的边框处理,所以仍然要提供方形、不透明图标。
(16:37)app clip experience icon 代表具体商家体验。它始终和一个 URL 关联,点按后会用 experience URL 启动 App Clip。对于有实体地点的商家,这个图标会匹配 Maps Point of Interest icon;商家也可以在 Maps Connect 上传图标。
app icon -> 完整 App 的归属
app clip icon -> 这个 App Clip binary
app clip experience icon -> 某个商家体验和它的 URL
关键点:
- 多商家 App Clip 的品牌感主要来自 card metadata 和 experience icon。
- 没有商家图标时,iOS 会回退到剧院、购物、餐饮、停车等通用类别图标。
- 图标和 URL 的绑定让用户感觉自己打开的是某个商家的 App Clip。
核心启发
1. 多门店扫码点餐
- 做什么:为每家餐厅生成独立 App Clip Code,用户扫码后直接进入该餐厅菜单或桌号页面。
- 为什么值得做:Session 的 Food Grid 示例正是餐厅目录平台;Advanced App Clip Experience 能让每家餐厅保留自己的卡片、头图和标题。
- 怎么开始:先把餐厅 ID、门店 ID、桌号放进体验 URL,再用
NSUserActivity.webpageURL进入对应菜单页。
2. 线下积分领取入口
- 做什么:让商家把 NFC tag、QR code 或 App Clip Code 放在线下物料上,顾客扫码后录入促销码或领取积分。
- 为什么值得做:Reward+ 示例说明,小商家可以借助平台提供 app-like experience,无需自己开发 App。
- 怎么开始:为每个商家配置 experience URL,在后端把 URL 前缀映射到商家权益规则。
3. 白标 App 收敛为一个平台 App
- 做什么:把多个相似白标 App 合成一个完整 App 和一个 App Clip binary,每个客户保留独立品牌入口。
- 为什么值得做:Session 明确把“多个模板 App 合并成单一 App”列为适用场景,维护成本会明显下降。
- 怎么开始:先把客户差异移动到配置层,再让 App Clip 根据 URL 加载客户品牌、功能开关和业务数据。
4. 多商家通知中心
- 做什么:订单、预约、排队叫号等通知都带上商家体验 URL,让系统把通知归到正确 App Clip experience。
- 为什么值得做:通知只发给 App bundle,
targetContentIdentifier才能帮 iOS 做最长前缀匹配。 - 怎么开始:把商家 URL 前缀写入通知内容,确保它和 App Store Connect 中的 experience URL 对齐。
5. App Clip 状态恢复
- 做什么:用户重复打开同一商家 App Clip 时保留购物车、预约草稿或填写进度。
- 为什么值得做:Session 的 Fantastico 例子说明,收到相同 URL 后直接重开页面会丢失上一段 in-flight session。
- 怎么开始:在路由层保存当前商家和任务 ID;新
NSUserActivity到来时,先判断是否匹配当前会话。
关联 Session
- Explore App Clips — 先建立 App Clips 的基本模型,理解 App Clip 和完整 App 的关系。
- Configure and link your App Clips — 补齐 associated domains、
NSUserActivity、Smart App Banner 和测试流程。 - Streamline your App Clip — 深入交易压缩、临时通知、位置确认和从 App Clip 迁移到完整 App。
- Design great App Clips — 从设计角度处理 App Clip flow、通知文案和引导下载完整 App 的时机。
评论
GitHub Issues · utterances