What's new in App Clips
App Store & Distribution 进阶 20m

App Clips 的新特性

What's new in App Clips

2021年6月9日

在 Apple 官方观看视频

一句话判断

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.plistNSAppClip 配置中声明 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 场景下提供更精确的一次性定位。
WWDC 2021