Highlight
Apple 把 App Clip 定义为与完整 App 一起提交的第二个应用 target,通过 App Store Connect 注册的体验 URL、10MB 体积限制和系统清理/迁移机制,让用户在 QR 码、NFC、Safari、Messages 或 Maps 场景中直接完成一个短任务。
核心内容
做一个点餐、停车缴费、停车计时器提醒或店内结账功能时,完整 App 往往从首页、Tab Bar、列表、详情页一路走到目标操作。用户站在停车缴费桩前,不想先找商店、注册账号、浏览功能,再找到付款入口。App Clip 的切入点就是这个瞬间:用户已经在现场,系统应该把他直接带到那一个任务。(04:40)
Apple 给出的模型由三个部分组成:完整 App、App Clip Experience(体验 URL)和 App Clip 本身。体验 URL 在 iOS 14 上会交给 App Clip 处理,QR 码、NFC 标签、Safari、Messages 和 Maps 都只是把这个 URL 带到系统面前的入口。(00:58)
实现上没有特殊魔法。开发者在 Xcode 里创建第二个 application target,把需要的代码、依赖和资源加入 App Clip target membership,再和完整 App 一起提交审核。完整 App 已安装时,系统优先打开完整 App;未安装时,系统下载并启动 App Clip。(02:55)
这也解释了为什么 App Clip 要重新设计流程。它不能照搬完整 App 的导航结构。Session 直接建议省掉 Tab Bar 等顶层导航,为每个不同体验准备单独 URL,让用户从 URL 直达对应任务。店内取货、寄送订单、不同门店,都应该成为不同的入口。(05:06)
App Clip 的边界同样明确。它 after thinning 必须小于 10MB;它的数据可被系统清理;它不能注册 custom URL schemes、document types 或 Universal Links;如果用户随后安装完整 App,系统可以迁移相机、麦克风、蓝牙授权,并让开发者通过共享数据容器转移业务数据。(03:46)
详细内容
用体验 URL 定义入口
(01:26)App Clip Experience 的基础是 URL。Apple 特别区分了它和 Universal Links:如果你已经处理过 Universal Links,App Clip URL 的处理会很熟悉;差别是 App Clip URL 不在 Apple-App-Site-Association 文件里定义,而是在 App Store Connect 注册。
App Store Connect
└─ App Clip Experience URL
├─ QR code
├─ NFC tag
├─ Safari link
├─ Messages link
└─ Maps business detail
关键点:
- URL 是 App Clip Experience 的身份,入口渠道只负责把这个 URL 交给系统
- App Clip live in store 后,系统会在 URL 被打开时展示对应体验
- App Clip Code 结合了 NFC 和视觉码,用户可以轻触或扫描
在 Xcode 中创建第二个 target
(06:53)Luming 用 Fruta demo 展示了创建 App Clip 的过程。她新建 App Clip target,命名为 Fruta Clip,Xcode 自动把它嵌入完整 App,并填好名称和 bundle identifier。随后再把必要依赖、共享 asset catalog 和 Swift source files 加到 App Clip。
Fruta app
└─ Fruta Clip target
├─ Dependency: Nutrition Facts
├─ Shared Assets: app icon, colors, ingredient, smoothie
├─ Included source: Model, Orders, Smoothies, Ingredients
└─ Excluded source: Store, Recipes, top-level tab navigation
关键点:
- App Clip target 和完整 App 一起构建、一起提交审核,不能单独上传
- target membership 是控制体积的第一道门,只勾选完成当前任务需要的文件
- demo 保留点单路径,移除 recipe、store unlock 和顶层 Tab 导航
用编译条件隔离完整 App 功能
(09:38)Fruta Clip 第一次构建失败,因为 OrderPlacedView.swift 引用了已经排除在 App Clip 之外的 Store。解决方法是在 Swift Compiler - Custom Flags 中为 Debug 和 Release 都添加 APPCLIP 条件,再把 Store 相关引用做条件编译隔离,让这部分只留在完整 App target。
关键点:
APPCLIP是 demo 中实际添加的自定义编译条件- 构建错误来自 target membership 和代码引用之间的不一致
- 条件编译让完整 App 保留高级功能,同时让 App Clip 只包含当下任务
用 NSUserActivity 路由不同体验
(12:07)App Clip 可以使用 UIKit,也可以使用新的 SwiftUI app lifecycle。启动时,App Clip 或完整 App 会收到 NSUserActivity。如果一个 App Clip 支持多个体验,就读取 activity 上的 web page URL 来判断当前要处理哪个入口。
Launch event: NSUserActivity
Routing detail: read the web page URL on the activity
UI frameworks: UIKit or SwiftUI app lifecycle
关键点:
NSUserActivity是这场 session 明确提到的启动输入- 读取 activity 上的 web page URL,用来区分多个 App Clip Experiences
- 完整 App 安装后也要继续处理这些体验,用户不应该因为安装 App 丢失原入口
按 App Clip 的生命周期设计数据
(14:14)App Clip 不需要用户管理。用户用完之后,如果很久没有再次打开,iOS 会删除 App Clip、它的数据容器和 Keychain 数据。频繁使用的 App Clip 生命周期会被延长,但开发者仍应把本地数据当作临时缓存。
App Clip data
├─ standard container: temporary cache
├─ Keychain data: deleted with App Clip cleanup
└─ shared group container: migration path to the full app
关键点:
- 标准容器里的数据可能被系统删除,不适合存唯一业务状态
- 如果用户安装完整 App,App Clip 会被删除
- 需要迁移的数据应提前放进共享 group data container,完整 App 安装后再复制出来
用系统能力降低输入成本
(17:36)App Clip 的目标是短而快。Session 点名了几类系统能力:Apple Pay 处理付款,Notifications 提醒取餐或停车到期,SwiftUI 复用小组件式界面,SKOverlay 或 SwiftUI 的 App Store overlay modifier 引导下载完整 App,ASAuthorizationController 处理登录或 Sign in with Apple。
Payment: Apple Pay
Upgrade: SKOverlay / App Store overlay modifier
Account: ASAuthorizationController
Federated sign-in callback: ASWebAuthenticationSession
Location check: location confirmation API
关键点:
- Apple Pay 和 Sign in with Apple 能减少 App Clip 里的表单输入
- federated sign-in 回调不要依赖 custom URL scheme,session 建议使用
ASWebAuthenticationSession - location confirmation API 用来确认用户在预期地点,避免向刚遇到 App Clip 的用户索取完整定位权限
核心启发
-
做什么:把一个现有购买流程拆成门店专用 App Clip。 为什么值得做:Session 建议用不同 URL 表示不同体验,门店 URL 可以跳过 store chooser,直接进入当前门店的商品或服务。 怎么开始:先选一个固定场景,例如柜台点单;为每个门店准备独立体验 URL,在 App Clip 中读取 activity 上的 web page URL 来识别门店。
-
做什么:给完整 App 做一次 target membership 瘦身演练。 为什么值得做:App Clip after thinning 必须小于 10MB,Fruta demo 通过排除 recipes、store unlock 和 Tab navigation 来控制范围。 怎么开始:新建 App Clip target,把模型、当前任务页面、共享 assets 逐项加入 target membership;构建失败时用
APPCLIP条件隔离完整 App 功能。 -
做什么:把 App Clip 的本地数据改成“临时缓存 + 可迁移数据”两层。 为什么值得做:iOS 可能删除 App Clip、标准容器和 Keychain 数据;用户安装完整 App 时,只有共享 group data container 能承接需要迁移的业务数据。 怎么开始:把最近一次订单、用户 ID、草稿状态分类;临时展示数据放标准容器,安装后要保留的数据写入共享 group container。
-
做什么:用 Apple Pay 和 Sign in with Apple 做一次零表单交易路径。 为什么值得做:App Clip 用户通常没有耐心填写长表单,Session 明确建议用 Apple Pay、
ASAuthorizationController和 Sign in with Apple 减少输入。 怎么开始:先保留游客流程,再在付款前接入 Apple Pay;需要账户时用 Sign in with Apple 创建或关联用户,完成主任务后再提示下载完整 App。 -
做什么:为 App Clip 设计一个完整 App 接力点。 为什么值得做:用户喜欢 App Clip 后可能会安装完整 App,Session 推荐用
SKOverlay或 SwiftUI 的 App Store overlay modifier 引导升级。 怎么开始:在任务完成页放下载入口,不要在任务前拦截用户;把 App Clip 中的状态写入共享容器,让完整 App 首次启动时继续刚才的上下文。
关联 Session
- Design great App Clips — 从用户流程、通知和下载引导角度补齐 App Clip 的设计判断。
- Streamline your App Clip — 深入讲解位置确认、临时通知、SKOverlay 和 secure app group。
- Configure and link your App Clips — 继续讲 App Clip Code、NFC、QR code、Safari banner 和 App Store Connect 配置。
- Create App Clips for other businesses — 适合需要为多个商户或品牌提供同一个 App Clip binary 的场景。
- Get the most out of Sign in with Apple — 补充 App Clip 中账户创建、凭证检查和用户迁移能力。
评论
GitHub Issues · utterances