配置和链接你的 App Clips
Configure and link your App Clips
2020年6月24日
一句话判断
App Clips 是 iOS 14 最让人兴奋的新特性之一,这场 Session 把从配置到链接的全链路讲得清清楚楚——不做 App Clips,你可能在错过下一个流量入口。
这场 Session 讲了什么
App Clips 是主应用的轻量级版本,体积限制在 10MB 以内,用户无需安装完整应用就能即时体验核心功能。Session 详细介绍了如何通过 Xcode 配置 App Clip target,包括设置 NSAppClip dictionary、定义体验 URL 以及处理 _appclips associated domain。
整个配置流程涉及多个环节:在 Xcode 中新增 App Clip target、配置 Info.plist 中的场景配置数据、设置 associated domains 来支持智能 App Clip 横幅和 NFC 标签触发。Session 还演示了如何通过 Safari App Clip 横幅、NFC 标签、QR 码和 Messages 等多种方式触发 App Clip 体验。
最关键的部分是 URL 夷新定机制。当用户通过特定 URL 打开 App Clip 时,系统会将完整的 URL 传递给你的 onContinueUserActivity 处理器,你可以从中提取参数并直接跳转到对应功能页面。这意味着用户扫码点咖啡,App Clip 直接展示咖啡下单页面,没有任何多余步骤。
值得深挖的点
Associated Domains 与体验 URL 的配合机制
App Clip 的触发依赖于 Universal Link 机制。你需要在 Apple Developer Portal 配置 _appclips 类型的 associated domain,并在服务器上托管 apple-app-site-association 文件。这个文件定义了哪些 URL 路径可以触发你的 App Clip。值得注意的是,一个应用可以有多个 App Clip 体验 URL,每个对应不同的使用场景——比如餐厅的菜单页面和停车场的缴费页面可以是同一个 App Clip 的不同入口。
10MB 体积限制下的工程取舍
10MB 听起来很少,但实际上足以承载一个功能完整的轻量体验。关键在于不要把整个 UI 框架都搬进来,而是只保留核心交互流程。Shared frameworks 和 on-demand resources 在 App Clip 中不可用,所以你需要重新思考依赖管理策略。Session 建议把共享代码放在 shared framework 中同时被主应用和 App Clip target 引用。
代码片段
// 在 AppDelegate 中处理 App Clip 的 URL 传入
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// 检查是否来自 App Clip 的 activity
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL else {
return false
}
// 解析 URL 参数,跳转到对应功能
let components = URLComponents(url: incomingURL, resolvingAgainstBaseURL: true)
if let orderID = components?.queryItems?.first(where: { $0.name == "order" })?.value {
// 直接导航到订单详情
navigateToOrder(orderID)
}
return true
}
// SwiftUI 中通过 onContinueUserActivity 处理 App Clip URL
@main
struct CoffeeAppClip: App {
var body: some Scene {
WindowGroup {
ContentView()
.onContinueUserActivity(
NSUserActivityTypeBrowsingWeb
) { activity in
// 从 userActivity 中提取网页 URL
guard let url = activity.webpageURL else { return }
handleAppClipURL(url)
}
}
}
func handleAppClipURL(_ url: URL) {
// 解析路径,提取咖啡店 ID
let pathComponents = url.pathComponents
if pathComponents.contains("order") {
let storeId = pathComponents.last ?? ""
// 跳转到对应门店的点单页面
OrderManager.shared.selectedStore = storeId
}
}
}
// 配置 SKOverlay 引导用户安装完整应用
import StoreKit
func showAppStoreOverlay() {
let config = SKOverlay.AppClipConfiguration(
position: .bottom
)
let overlay = SKOverlay(
appIdentifier: "你的应用AppStoreID",
configuration: config
)
overlay.delegate = self
// 在当前场景中展示
if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
overlay.present(in: scene)
}
}
最佳实践
- 在开发阶段就规划好 App Clip 与主应用的代码共享策略,把核心业务逻辑抽到 shared framework 中,避免后期重构
- 使用
#if APPCLIP编译条件来区分 App Clip 和主应用的代码路径,保持代码库统一 - 每个 App Clip 体验只聚焦一个核心任务,不要试图在 10MB 里塞进完整的应用功能
- 测试时使用 Xcode 的 App Clip 体验调试功能,可以直接模拟 NFC、QR 码等触发场景
- 上线前务必用真实设备测试各个入口的触发流程,包括 Safari 横幅、NFC 标签和 Messages 链接
还有什么值得关注
- App Clip 可以请求有限的位置权限,用户可以选择”仅本次允许”,这是一个很妙的隐私保护设计
- Session 提到了 App Clip Code——一种同时支持 NFC 和视觉识别的新二维码格式,值得深入研究
- 通过
SKOverlay在 App Clip 体验中优雅地引导用户安装完整应用,转化率数据值得关注