要集成 iOS 26 的端侧 AI 与视觉新特性,开发者需掌握两大核心:通过 foundation-models-on-device Skill 实现 Apple FoundationModels 的模型检测、@Generable 结构化输出与 Tool Calling;以及利用 Liquid Glass Design Skill 的 GlassEffectContainer 实现多元素融合玻璃材质与交互形变。本文基于 Everything Claude Code 的 Skill 体系,提供从激活到实践的完整操作指南。

iOS 26 端侧 AI 集成:Apple FoundationModels、@Generable 结构化输出与 Liquid Glass 设计

iOS 26 为开发者带来了两场革新:一是设备端运行的 Apple FoundationModels 框架,实现了隐私优先的 AI 能力;二是全新的 Liquid Glass 设计语言,定义了动态、交融的视觉标准。将两者结合,可以构建出既智能又美观的下一代应用。

Everything Claude Code 的 foundation-models-on-deviceliquid-glass-design 两个 Skill,正是为此场景设计的工程化实践指南。它们遵循古法编程中“契约驱动”与“架构先行”的原则,将复杂的框架特性转化为清晰、可重复的操作步骤。本指南将分步详解如何激活并应用这两个 Skill,完成从模型可用性检查到 UI 融合渲染的全流程。

第一部分:Foundation Models On Device 端侧 AI 集成

此 Skill 将 Apple FoundationModels 框架的能力系统化,让开发者在 iOS 26+ 设备上安全、稳定地调用本地大语言模型。

激活条件与核心场景

当你的项目需求涉及以下任一场景时,应启用此 Skill:

  • 隐私与离线优先:处理用户数据需严格保密,或应用需在无网络环境下提供 AI 功能。
  • 结构化数据生成:需要模型直接输出可解析的强类型数据,而非纯文本。
  • 本地逻辑调用:希望模型能触发应用内的搜索、计算等业务逻辑。
  • 流式交互体验:需要实时生成内容并逐步更新 UI。

核心操作流程

步骤一:模型可用性检测(必选)

在创建任何会话前,必须检查模型状态。这是避免运行时崩溃的关键,体现了工程纪律中的防御性编程。

// 检查 SystemLanguageModel.default 的 availability
switch model.availability {
case .available:
    // 模型就绪,可以进行后续操作
case .unavailable(let reason):
    // 根据具体原因(如 .deviceNotEligible, .appleIntelligenceNotEnabled)向用户提供明确提示
}

错误表现与验证:如果忽略此检查,当设备不支持或未开启 Apple Intelligence 时,直接调用会话将导致应用崩溃或无响应。

步骤二:定义会话与结构化输出(@Generable)

使用 @Generable 宏定义数据契约,实现类型安全的输出,替代手动解析字符串的易错方式。

@Generable(description: "天气预报摘要")
struct WeatherSummary {
    var city: String
    @Guide(description: "温度范围,如 20~25°C", .range(0...50))
    var temperatureRange: String
    @Guide(description: "未来三小时天气概况")
    var summary: String
}

通过 LanguageModelSession 请求结构化生成:

let session = LanguageModelSession(instructions: "你是一位天气播报员,输出需简洁准确。")
let response = try await session.respond(
    to: "查询北京今日天气",
    generating: WeatherSummary.self
)
// response.content 即为 WeatherSummary 实例,可直接使用其属性。

步骤三:扩展模型能力——Tool Calling

让 LLM 调用你定义的本地工具,将 AI 推理与设备功能打通。

  1. 定义工具:实现 Tool 协议,明确工具名称、描述和参数(参数本身也建议用 @Generable)。
  2. 将会话与工具绑定:在创建会话时传入工具数组。
  3. 处理调用与错误:模型会根据对话内容决定是否调用工具,你需要实现工具的执行逻辑并处理可能的 ToolCallError

最佳实践:工具描述应清晰明确,帮助模型准确理解其用途。工具执行逻辑应保持高效,避免阻塞。

步骤四:流式快照与 UI 更新

对于需要实时反馈的场景(如列表生成、进度展示),使用 streamResponse 获取流式部分结果。

let stream = session.streamResponse(to: prompt, generating: WeatherSummary.self)
for try await partial in stream {
    // partial 是 WeatherSummary.PartiallyGenerated 类型,所有属性为 Optional
    // 你可以基于 partial 的当前状态安全地更新 UI,例如显示一个进度条或逐步填充的列表。
}

验证与注意事项

  • 输入 Token 限制:单次请求的总 Token(包括 instructions、prompt 和预期输出)需控制在 4096 以内。对于长输入,应在应用层进行分块。
  • 会话并发:同一个 LanguageModelSession 实例一次只能处理一个请求,需检查 isResponding 属性。
  • 质量保障:端侧模型生成的内容可通过 Everything Claude Code 的 Verification Loop Skill 进行自动化验证,形成质量闭环。这体现了端到端质量保障中“验证循环”的工程思想。

第二部分:Liquid Glass Design 动态视觉集成

Liquid Glass Design Skill 解决了在 SwiftUI、UIKit 和 WidgetKit 中实现高性能、动态玻璃材质的复杂问题。

激活条件与核心场景

  • 应用需要适配 iOS 26 全新视觉语言。
  • UI 包含卡片、按钮、浮动面板等需要玻璃质感的组件。
  • 多个玻璃元素需要平滑融合、动态形变(如分组展开/合并)。
  • 组件需在 WidgetKit 的 accented 渲染模式下保持设计一致性。

核心操作流程

步骤一:基础应用与交互反馈

使用 .glassEffect() 修饰符,一行代码为视图添加玻璃材质。可通过链式调用进一步定制。

Text("欢迎回来")
    .padding()
    .glassEffect(.regular.tint(.blue).interactive(), in: .rect(cornerRadius: 12))
  • .tint() 控制高光色彩。
  • .interactive() 使材质响应触摸/指针交互。
  • 指定 in: 参数可自定义玻璃形状。

步骤二:多元素融合——GlassEffectContainer

这是实现复杂玻璃布局的关键。当多个玻璃元素需要视觉上融合(如一排图标合并为一个玻璃条)或产生形变动画时,必须将它们包裹在 GlassEffectContainer 中。

GlassEffectContainer(spacing: 20) { // spacing 控制元素融合的距离阈值
    HStack {
        Image(systemName: "sun.max")
            .frame(width: 60, height: 60)
            .glassEffect()
        Image(systemName: "moon.stars")
            .frame(width: 60, height: 60)
            .glassEffect()
    }
}

不使用容器的后果:元素无法融合,各自独立渲染,导致视觉割裂且性能下降。

步骤三:分组融合与动态形变动画

利用 @NamespaceglassEffectID,可以实现更复杂的玻璃元素分组以及平滑的布局切换动画。

@Namespace private var glassNamespace
@State private var isGrouped = false

GlassEffectContainer {
    HStack {
        // 元素 A
        Color.blue.frame(width: 50, height: 50)
            .glassEffect()
            .glassEffectID("elementA", in: glassNamespace)
        // 元素 B
        Color.red.frame(width: 50, height: 50)
            .glassEffect()
            .glassEffectID("elementB", in: glassNamespace)
            // 当 isGrouped 为 true 时,为元素 B 添加一个不同的分组 ID
            .glassEffectUnion(id: isGrouped ? "sameGroup" : "differentGroup", namespace: glassNamespace)
    }
}
Button("切换形态") {
    withAnimation(.spring) {
        isGrouped.toggle()
    }
}

当状态改变时,玻璃元素会根据其分组ID自动计算融合区域,并播放形变动画。

步骤四:适配 WidgetKit

在 Widget 视图中,需考虑不同渲染模式。使用 .widgetRenderingMode 环境值来判断当前模式,并提供适配的玻璃效果或备用视图。

@Environment(\.widgetRenderingMode) var renderingMode
var body: some View {
    if renderingMode == .accented {
        // 应用玻璃效果或特定高亮样式
        MyGlassContent()
            .widgetAccentable() // 标记需要强调的元素
    } else {
        // 普通模式下的视图
    }
}

验证与注意事项

  • 调用顺序.glassEffect() 通常应在 .frame().padding() 等影响布局的修饰符之后调用。
  • 性能优化:避免在滚动列表中为每一行都使用复杂的玻璃效果,尤其是在低端设备上。
  • 可访问性:确保玻璃背景上的文本有足够的对比度。可结合 .tint() 和测试不同外观模式来验证。
  • 协作验证:Liquid Glass 的视觉输出可以与 Everything Claude Code 的写时质量守护与 Skill 治理能力结合,自动检查 UI 组件是否符合设计规范。

FAQ

Q: FoundationModels 和 Liquid Glass 可以在同一个项目中集成吗? A: 完全可以。这是推荐的模式:使用 FoundationModels 处理本地 AI 逻辑,使用 Liquid Glass 构建现代 UI。例如,一个智能助手应用可以用 @Generable 生成回复,然后以流式玻璃卡片的形式展示给用户。

Q: 如何确保端侧 AI 生成的内容在 Liquid Glass 卡片中清晰可读? A: 重点在于对比度。为玻璃视图使用 .tint() 选择合适的背景色调,并为文本设置不透明的前景色。利用 Everything Claude Code 的 Verification Loop Skill 可以自动化测试在不同主题下的可读性。

Q: 这两个 Skill 需要特定的 Claude Code 配置吗? A: 它们作为 Everything Claude Code 技能体系的一部分,遵循统一的工程化规范。具体的激活和配置方式,可以参考Everything Claude Code 完全指南:38 Agent + 156 Skill 生产级 AI 编程插件全景解析中的详细说明。