Highlight
iOS 17 将数字调用场景的 App Clip 体积上限提升至 50MB,新增 Default App Clip Links 免配置调起链接,并允许任何 App 直接调起 App Clip 无需经过 Safari。
核心内容
App Clip 让用户无需下载完整 App 就能体验核心功能。iOS 17 从三个维度降低了构建和分发 App Clip 的门槛。
体积上限:数字调用 50MB,物理调用 15MB
(00:59)App Clip 需要小体积来保证即时启动。但不同使用场景的网络条件差异很大:NFC 标签、QR 码通常在户外蜂窝网络下使用,而 Messages 链接、Safari 页面往往在 Wi-Fi 环境下打开。
iOS 17 区分了两种调用方式的体积限制:
| 调用方式 | 体积限制 | 适用场景 |
|---|---|---|
| 物理调用(NFC、QR 码、App Clip Code) | 15MB | 户外、移动中 |
| 数字调用(Messages、Safari、Spotlight) | 50MB | Wi-Fi、室内 |
| iOS 15 及更早 | 10MB | 兼容旧系统 |
(01:53)50MB 的空间足够放入更多资源。如果你之前为了控制体积而在运行时下载素材,现在可以直接打包进 App Clip,让首屏体验更完整。游戏试玩、在线点餐、内容预览等场景都能受益。
Default App Clip Links:零配置调起链接
(02:19)过去要让 App Clip 通过 URL 调起,需要在自己的网站上托管 Apple App Site Association 文件和相关元数据。这对没有网站或不想维护网站配置的开发者是个负担。
iOS 16.4 起,App Store Connect 会自动生成 Default App Clip Link:
https://appclip.apple.com/id?p=com.example.app.Clip
(03:40)链接支持附加查询参数。游戏试玩 App Clip 可以通过 ?character=wizard 指定初始角色,点餐 App Clip 可以通过 ?restaurant=123 指定餐厅。
App Clip 启动后解析参数:
import SwiftUI
struct ContentView: View {
@State var parameters: [URLQueryItem] = []
var body: some View {
VStack {
ForEach(parameters, id: \.name) { item in
Text("\(item.name): \(item.value ?? "")")
}
}
.onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { userActivity in
guard let inputURL = userActivity.webpageURL else { return }
let components = NSURLComponents(
url: inputURL,
resolvingAgainstBaseURL: true
)
guard let queryItems = components?.queryItems else { return }
self.parameters = queryItems
}
}
}
关键点:
onContinueUserActivity捕获 App Clip 调起时的NSUserActivitywebpageURL包含完整的调起 URL,包括查询参数NSURLComponents解析参数与处理普通 Universal Link 相同
从任意 App 内调起 App Clip
(04:20)iOS 17 之前,App 内调起 App Clip 需要经过 Safari 或 Safari View Controller。现在可以直接调起。
方式一:Link Presentation 富文本预览
import LinkPresentation
let provider = LPMetadataProvider()
let url = URL(string: "https://appclip.apple.com/id?p=com.example.app.Clip")!
provider.startFetchingMetadata(for: url) { metadata, error in
guard let metadata = metadata else { return }
DispatchQueue.main.async {
let lpView = LPLinkView(metadata: metadata)
// 添加到视图层级,用户点击即可调起 App Clip
}
}
关键点:
LPMetadataProvider异步获取链接元数据LPLinkView渲染带图标和标题的富文本卡片- 用户点击卡片直接调起 App Clip,无需 Safari 中转
方式二:直接调起(Default App Clip Link)
SwiftUI:
var body: some View {
let appClipURL = URL(
string: "https://appclip.apple.com/id?p=com.example.naturelab.backyardbirds.Clip"
)!
Link("Backyard Birds", destination: appClipURL)
}
UIKit:
func launchAppClip() {
let appClipURL = URL(
string: "https://appclip.apple.com/id?p=com.example.naturelab.backyardbirds.Clip"
)!
UIApplication.shared.open(appClipURL)
}
关键点:
- Default App Clip Link 可以直接用
Link或open(_:)调起 - 调起后系统显示 App Clip 卡片,用户确认后进入
- 任何 App 都可以调起任何 App Clip,不限于同一开发者
详细内容
体积限制的实际影响
(01:10)物理调用保持 15MB 限制的原因是用户通常在移动中、网络条件不稳定。数字调用提升到 50MB 则允许更丰富的体验:
- 游戏试玩:可以包含完整的关卡资源、角色模型、音效
- 在线点餐:可以包含菜单图片、餐厅环境照片
- 内容预览:可以包含视频片段、高清图片集
(02:04)如果目标用户包含 iOS 15 用户,仍需遵守 10MB 限制。可以通过条件编译或运行时检测来区分处理。
Default App Clip Link 的生成与使用
(03:13)Default App Clip Link 在 App Store Connect 发布 App Clip 时自动生成,格式固定:
https://appclip.apple.com/id?p={BundleIdentifier}
Bundle Identifier 是 App Clip target 的完整 bundle ID,通常以 .Clip 结尾。
参数传递示例:
https://appclip.apple.com/id?p=com.example.game.Clip&level=demo&character=knight
App Clip 中解析:
.onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { activity in
guard let url = activity.webpageURL,
let components = URLComponents(url: url, resolvingAgainstBaseURL: true),
let items = components.queryItems else { return }
let level = items.first(where: { $0.name == "level" })?.value
let character = items.first(where: { $0.name == "character" })?.value
// 根据参数配置初始界面
}
跨 App 调起的场景
(04:33)演讲者用 Notes App 演示:在笔记中放入 Backyard Birds 的 App Clip 链接,点击后直接弹出 App Clip 卡片。这个流程不需要 Safari 参与。
实际应用场景:
- 社交 App 中分享餐厅 App Clip,好友点击直接点餐
- 导航 App 中调起停车场 App Clip,直接完成缴费
- 邮件 App 中调起会议 App Clip,直接加入视频会议
核心启发
1. 为完整 App 构建游戏试玩 App Clip
- 做什么:利用 50MB 体积上限,将游戏的第一个关卡或教程打包为 App Clip
- 为什么值得做:用户无需下载几百 MB 的完整游戏就能体验核心玩法,转化率远高于传统广告
- 怎么开始:在 Xcode 中为项目添加 App Clip target,将关卡资源、核心逻辑共享,通过 Default App Clip Link 分发
2. 在内容分享中嵌入 App Clip
- 做什么:用户在你的 App 中分享内容时,附带相关 App Clip 的 Default Link
- 为什么值得做:接收方点击链接即可体验相关功能,无需先下载完整 App,降低体验门槛
- 怎么开始:生成带参数的 Default App Clip Link(如
?itemID=123),用LPLinkView展示富文本预览
3. 线下场景的快速服务
- 做什么:餐厅、停车场、健身房等场所用 NFC 标签或 QR 码调起 15MB 以内的轻量 App Clip
- 为什么值得做:用户手机贴近标签就能完成点餐、缴费、签到,无需下载 App 或打开网页
- 怎么开始:App Clip 体积控制在 15MB 以内,配置物理调用体验,在 App Store Connect 生成 App Clip Code
4. 跨 App 生态的即时服务
- 做什么:让你的 App Clip 可以被其他 App 直接调起,成为生态系统中的服务节点
- 为什么值得做:iOS 17 允许任意 App 调起任意 App Clip,这是构建跨应用服务网络的机会
- 怎么开始:设计简洁的 Default App Clip Link 参数协议,文档化调起方式,让合作方易于集成
关联 Session
- Meet StoreKit for SwiftUI — App Clip 中的应用内购买实现
- What’s new in Safari and WebKit — Safari 中 App Clip 的调起与展示
- Design App Clips — App Clips 的用户体验设计指南
- Meet App Intents — 将 App 功能暴露给系统的另一种方式,与 App Clips 互补
评论
GitHub Issues · utterances