App Clips 的新特性
What's new in App Clips
2021年6月9日
一句话判断
App Clips 在 iOS 15 里的改进集中在「让用户更容易回来」——通知提醒、地图整合、Siri 建议都在推用户安装完整 app,而不是用完就走。
这场 Session 讲了什么
App Clips 在 iOS 14 推出后,Apple 收集了大量开发者反馈。iOS 15 的更新主要围绕三个方向:提高 App Clip 的发现性、增强用户回访率、简化开发流程。
在发现性方面,App Clips 现在可以出现在 Spotlight 搜索结果和 Siri 建议中。用户之前使用过某个 App Clip 后,系统会在合适的场景下主动推荐。Maps 中的 App Clips 展示也得到了增强,支持更丰富的卡片预览。
用户回访方面,iOS 15 允许 App Clip 在用户离开后发送最多 8 小时的本地通知。比如用户在停车场用 App Clip 付了停车费,系统可以在计费到时前发提醒。这个机制配合 App Clip Experience 的通知权限管理,让用户有理由回来——甚至安装完整 app。
开发流程上,Xcode 现在可以直接从 App Clip Experience 的 URL 配置中生成测试场景,不用再手动构造 NFC 标签或二维码。
值得深挖的点
8 小时通知窗口的策略设计
这 8 小时是 App Clip 最有商业价值的新能力。但用不好会让用户反感。Session 建议只在「事件驱动」的场景下使用通知:停车到期、外卖到达、排队轮到——而不是营销推送。每条通知都应该有明确的行动按钮,直接打开 App Clip 的对应功能。
通知需要在 Info.plist 的 NSAppClip 配置中声明 UIApplicationShortcutItems,系统会根据用户使用 App Clip 的上下文决定是否展示。不能滥用的原因是:如果用户在通知设置中关闭了某个 App Clip 的通知,这个 App Clip 的所有后续通知都会被系统屏蔽。
App Clip Card 在 Maps 中的新展示方式
Maps 里的 App Clip 现在可以展示更丰富的内容:图片、价格区间、营业时间。这些信息来自你在 App Store Connect 中配置的元数据,而不是从 app 内动态获取。所以如果你的 App Clip 依赖 Maps 发现渠道,确保 App Store Connect 中的信息是最新且准确的。
代码片段
// 在 App Clip 中请求发送本地通知
import UserNotifications
func scheduleParkingReminder(expiryTime: Date) {
let content = UNMutableNotificationContent()
content.title = "停车提醒"
content.body = "您的停车时段即将到期"
content.sound = .default
content.categoryIdentifier = "PARKING_EXPIRY"
// 添加打开 App Clip 的动作
let extendAction = UNNotificationAction(
identifier: "EXTEND_PARKING",
title: "延长停车",
options: [.foreground]
)
let category = UNNotificationCategory(
identifier: "PARKING_EXPIRY",
actions: [extendAction],
intentIdentifiers: []
)
UNUserNotificationCenter.current()
.setNotificationCategories([category])
let trigger = UNTimeIntervalNotificationTrigger(
timeInterval: expiryTime.timeIntervalSinceNow - 600,
repeats: false
)
let request = UNNotificationRequest(
identifier: "parking-reminder",
content: content,
trigger: trigger
)
UNUserNotificationCenter.current().add(request)
}
// 解析 App Clip 启动 URL
func handleAppClipLaunch(userActivity: NSUserActivity) {
guard let url = userActivity.webpageURL else { return }
// 解析 URL 参数,提取停车位置等信息
let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
let spotId = components?.queryItems?.first(where: { $0.name == "spot" })?.value
if let spotId = spotId {
// 直接跳转到对应的停车缴费页面
showParkingPayment(spotId: spotId)
}
}
// 检测用户是否已安装完整 app,引导安装
func checkAndPromptFullApp() {
let appClipURL = URL(string: "https://example.com/app")!
// 通过 App Store 的 SKOverlay 引导安装
if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
let config = SKOverlay.AppClipConfiguration(
position: .bottom
)
let overlay = SKOverlay(
url: appClipURL,
config: config
)
overlay.present(in: scene)
}
}
最佳实践
App Clip 的通知权限应该在实际需要时才请求,不要在启动时立即弹窗。把权限请求和用户的操作绑定——比如用户点击「开启到期提醒」按钮后再请求。这样通过率会高得多。
确保你的 App Clip Experience URL 结构清晰且稳定。URL 一旦发布就不应该轻易改动,因为物理世界中的 NFC 标签和二维码已经印好了。如果必须迁移,在服务端做 301 重定向。
还有什么值得关注
- Xcode 13 的 App Clip 测试体验大幅改善,可以直接从 Debug 菜单模拟不同 Experience 的启动场景。
- App Clips 现在支持 Apple Pay 的自动付款(recurring payments),订阅类服务可以利用这个能力。
- 如果你的 App Clip 依赖位置信息,iOS 15 的新定位 API 可以在 App Clip 场景下提供更精确的一次性定位。