Design for intelligence: Meet people where they are
Design 入门 22m

为智能而设计:在用户需要的地方出现

Design for intelligence: Meet people where they are

2020年6月23日

在 Apple 官方观看视频

一句话判断

“智能”不是在应用里塞一个 AI 对话框——真正的智能设计是”在用户需要的时候,用最少的工作量,完成用户想做的事”。这场 Session 用 Apple 自己的产品案例重新定义了”智能体验”。

这场 Session 讲了什么

这场 Session 从设计哲学层面探讨了如何在应用中构建”智能”体验。Apple 对”智能”的定义不是”用机器学习做很酷的事情”,而是”让用户感觉应用在替他们想”。Session 提出了智能设计的三个核心原则:情境感知(Contextual Awareness)、主动帮助(Proactive Help)和渐进式信息披露(Progressive Disclosure)。

情境感知意味着应用要理解用户当前的状态和意图。比如 Maps 在检测到用户在机场时,会主动展示登机口信息和航班状态;Siri 在检测到用户的日常通勤模式后,会提前计算路线和预计到达时间。这些功能不是用户主动请求的,而是系统”猜”到了用户可能需要。

主动帮助是情境感知的延伸——不只是知道用户在做什么,还要在合适的时机主动提供帮助。Session 用了 Translate 应用的例子:当用户复制了一段外语文本,系统会自动在通知中提供翻译结果,不需要用户打开任何翻译应用。

渐进式信息披露是指信息的展示要分层。第一次接触时只展示最核心的内容,随着用户深入使用逐步揭示更多功能。这避免了”功能过载”——一上来就给用户展示 20 个选项的界面不是智能,而是懒惰。

值得深挖的点

“零点击”体验的设计目标

Session 提出了一个激进的设计目标:最好的交互是零点击的交互。如果你的应用能做到”用户还没想到就已经完成了”,那才是真正的智能。Apple 自己的案例包括:自动填充验证码(从短信中提取验证码并自动填入)、自动切换深色模式(根据时间自动切换)、以及 App Clips(扫码即用,零安装)。这些体验的共同特点是用户不需要做任何”学习”——系统就按照最自然的方式工作了。

智能推荐的可信度问题

Session 坦诚地讨论了智能推荐”猜错”的代价。如果你的应用主动推荐了用户不需要的内容,比”不推荐”更糟糕——因为用户会失去对应用的信任。Apple 的建议是:只在高置信度时做主动推荐,低置信度时提供”你可能还需要…”这样的弱推荐。宁可漏掉一次有用的推荐,也不要做出错误的强推荐。

代码片段

// 利用 Core Spotlight 让应用内容可被系统搜索
import CoreSpotlight
import MobileCoreServices

class IndexingManager {
    func indexArticle(_ article: Article) {
        // 创建 Spotlight 索引条目
        let attributeSet = CSSearchableItemAttributeSet(
            itemContentType: kUTTypeText as String
        )
        attributeSet.title = article.title
        attributeSet.contentDescription = article.summary
        attributeSet.keywords = article.tags
        
        let item = CSSearchableItem(
            uniqueIdentifier: "article-\(article.id)",
            domainIdentifier: "articles",
            attributeSet: attributeSet
        )
        
        CSSearchableIndex.default().indexSearchableItems([item]) { error in
            if let error = error {
                print("索引失败: \(error)")
            }
        }
    }
    
    // 用户从 Spotlight 搜索结果进入应用时处理
    func handleSpotlightEntry(_ activity: NSUserActivity) {
        guard activity.activityType == CSSearchableItemActionType,
              let uniqueId = activity.userInfo?[CSSearchableItemActivityIdentifier] as? String else {
            return
        }
        
        // 直接跳转到对应文章
        let articleId = uniqueId.replacingOccurrences(of: "article-", with: "")
        navigateToArticle(id: articleId)
    }
}
// 使用 NSUserActivity 实现主动推荐
class SmartSuggestionManager {
    
    func donateViewActivity(for product: Product) {
        let activity = NSUserActivity(
            activityType: "com.example.app.viewProduct"
        )
        activity.title = "查看\(product.name)"
        activity.userInfo = ["productId": product.id]
        activity.isEligibleForSearch = true
        activity.isEligibleForPrediction = true
        activity.suggestedInvocationPhrase = "查看\(product.name)"
        
        // 关键属性:让 Siri 理解这个活动的上下文
        activity.keywords = Set(product.tags)
        activity.requiredUserInfoKeys = Set(["productId"])
        
        activity.becomeCurrent()
    }
    
    // 捐赠定期的用户习惯
    func donateDailyHabit() {
        let activity = NSUserActivity(
            activityType: "com.example.app.dailyCheckin"
        )
        activity.title = "每日签到"
        activity.isEligibleForPrediction = true
        activity.suggestedInvocationPhrase = "每日签到"
        
        // 持续捐赠让 Siri 学习用户的使用时间模式
        activity.becomeCurrent()
    }
}
// 利用 Intelligent Suggestions 改善输入体验
import SwiftUI

struct SmartOrderView: View {
    @State private var selectedItems: [String] = []
    let suggestions: [String]  // 基于用户历史生成的智能建议
    
    var body: some View {
        VStack {
            // 智能建议区域:基于用户习惯推荐
            if !suggestions.isEmpty {
                ScrollView(.horizontal, showsIndicators: false) {
                    HStack {
                        Text("常点菜品")
                            .font(.caption)
                            .foregroundColor(.secondary)
                        
                        ForEach(suggestions, id: \.self) { item in
                            Button(item) {
                                selectedItems.append(item)
                            }
                            .buttonStyle(.bordered)
                            .font(.subheadline)
                        }
                    }
                    .padding(.horizontal)
                }
            }
            
            // 完整菜单(渐进式信息披露)
            List(menuItems) { item in
                // ...
            }
        }
    }
}

最佳实践

  • 让你的应用内容出现在 Spotlight 搜索结果中——这是最低成本的”在用户需要时出现”
  • 使用 NSUserActivity 捐赠用户行为,让 Siri 学习使用模式并做出智能建议
  • 智能推荐的 UI 要明显标注”为你推荐”,让用户知道这是个性化内容而非固定内容
  • 当推荐出错时提供简单的”不感兴趣”反馈按钮,持续改善推荐质量
  • 在应用启动时检查 NSUserActivity,确保从 Spotlight/Siri 进入时能直接跳转到正确页面

还有什么值得关注

  • Apple 的 Human Interface Guidelines 新增了”Intelligence”章节,专门讲智能功能的设计规范
  • Session 提到了 Widget 的智能叠放(Smart Stack)——系统会根据用户习惯自动选择展示哪个 Widget
  • App Clips 的”零安装”体验是”零点击”设计理念的极致体现,值得深入研究其交互模型
WWDC 2020