← 所有文章

Image Playground API:SwiftUI Sheet、程序化Image Creator与样式控制

Apple Intelligence的Image Playground向应用暴露了两条集成路径。SwiftUI的imagePlaygroundSheet()修饰符呈现系统面向用户的图像生成UI;开发者交出一个起始概念(文本或图像),用户在sheet内迭代,结果返回到应用。ImageCreator API以程序化方式运行同一条生成管线:开发者提供一个ImagePlaygroundConcept对象数组加上一种样式,框架返回生成的图像而不显示UI1。这两条路径针对不同的用例。当用户应当迭代时,sheet集成是合适的;当应用有特定的生成请求并直接呈现结果时,程序化集成是合适的。

本文对照Apple官方文档梳理这套API。立足点是”哪条集成路径与用户的心智模型相匹配”,因为选错路径会产生UX问题:要么从用户那里夺走过多控制权(用户想迭代时却用了程序化),要么给得太少(用户期待一次性结果时却用了sheet)。

TL;DR

  • imagePlaygroundSheet(isPresented:concept:sourceImage:onCompletion:onCancellation:)是SwiftUI修饰符,用于呈现系统的Image Playground sheet。用户进行迭代;应用通过onCompletion接收所选图像的URL(非可选URL);取消会触发onCancellation2
  • ImageCreator().images(for: [ImagePlaygroundConcept], style: ImagePlaygroundStyle, limit: Int)是程序化路径(iOS 18.4+)。该方法返回一个ImageCreator.CreatedImage结果的AsyncSequence3
  • ImagePlaygroundConcept承载模型使用的输入:文本描述(.text("a watercolor of a cat"))、源图像(.image(...))、绘画(.drawing(...)),或从参考中提取的概念(.extracted(from:title:))。
  • ImagePlaygroundStyle选择视觉美学。应用通过查询ImageCreator().availableStyles来发现设备支持哪些case。
  • .imagePlaygroundPersonalizationPolicy(_:)接受.automatic.enabled.disabled.imagePlaygroundGenerationStyle(_:in:)接受一种首选样式和一个允许的样式列表。在涉及隐私敏感或美学锁定的场景中使用这些修饰符。

两条路径:Sheet vs 程序化

在两条集成路径之间做选择,本质上是关于由谁控制迭代。

Sheet集成把系统完整的图像生成UI交给用户。用户输入提示词、挑选变体、选定最终图像。应用的职责是用一个起始概念启动sheet并接收所选结果。在以下情况使用:

  • 用户的创作意图应用无法完全预测。
  • 交互是创作工作流的一部分(消息应用、笔记应用、个人资料定制流程)。
  • 用户期望在确定之前进行迭代。

程序化集成把模型直接交给应用。应用提供概念并取回图像,不显示系统UI。在以下情况使用:

  • 生成是非交互流程的一部分(系统生成的头像、菜谱卡的确定性资产、一次性插图)。
  • 应用有特定的美学要求(始终为插图样式、始终一张图)。
  • 用户不应看到迭代过程;他们关心的是结果。

两条路径共享底层模型,并尊重相同的用户级Apple Intelligence配置。选择纯粹是关于UX。

SwiftUI Sheet

imagePlaygroundSheetView上提供了多个重载形式。规范的5参数形式接受一个起始概念、一个可选的源图像引用,加上完成与取消处理器2

import ImagePlayground
import SwiftUI

struct ProfileEditor: View {
    @State private var showPlayground = false
    @State private var avatarURL: URL?

    var body: some View {
        VStack {
            if let avatarURL {
                AsyncImage(url: avatarURL) { image in
                    image.resizable().scaledToFit()
                } placeholder: {
                    ProgressView()
                }
            }

            Button("Generate Avatar") {
                showPlayground = true
            }
        }
        .imagePlaygroundSheet(
            isPresented: $showPlayground,
            concept: "a friendly cartoon avatar",
            sourceImage: nil,
            onCompletion: { url in
                avatarURL = url
            },
            onCancellation: {
                // user dismissed without choosing
            }
        )
    }
}

Sheet的UX由系统控制。用户看到的是Apple标准的Image Playground界面(提示词、样式选择器、变体网格、”Done”按钮)。应用的角色是提供起始提示词并接收结果。取消会触发专门的onCancellation闭包,而不是在完成时返回nil URL;传给onCompletion的URL是非可选的。

对于希望传入比单个字符串更丰富的起始概念的应用,姊妹重载直接接受[ImagePlaygroundConcept]。多个概念会组合:模型把每一个都用作约束或信号。顺序很重要:文本概念建立提示词;图像概念建立视觉参考;绘画概念建立轮廓。

ImagePlaygroundConcept变体

Apple提供了多个ImagePlaygroundConcept构造器4

.text(_:)简短的文本描述。最常用的起始概念。

.image(_:)源图像(通常是URLUIImage/NSImage)。模型把它用作样式或构图的视觉参考。

.drawing(_:)一幅绘画,通常来自PencilKit或自定义绘画表面。模型把笔触解读为结构性提示。

.extracted(from:title:)从分析过的图像中提取的概念。两参数形式接受一个源URL(或图像类型)和一个描述提取内容的title。框架使用端侧分析从参考中派生出适合生成的概念。

概念可以组合:把[text, image, extracted]传给sheet或ImageCreator,可以让模型同时满足多个约束。正确的模式是”足够具体以产出有用输出,又足够宽松以给模型留出空间”:一两个具体概念加上可选的参考图像。

ImageCreator:程序化路径

ImageCreator是面向想要无UI生成的应用的程序化API3

import ImagePlayground

do {
    let creator = try ImageCreator()

    // Discover the styles the device supports
    guard let style = creator.availableStyles.first else {
        // Apple Intelligence unavailable on this device
        return
    }

    let stream = creator.images(
        for: [.text("a friendly cartoon avatar")],
        style: style,
        limit: 1
    )

    for try await result in stream {
        // result is an ImageCreator.CreatedImage
        await self.save(result)
    }
} catch {
    // ImageCreator() initializer can throw on unsupported devices
    print("Generation failed: \(error)")
}

images(for:style:limit:)方法返回一个ImageCreator.CreatedImage结果的AsyncSequence。异步流式模型让应用既可以呈现部分结果(模型的渐进式精炼),也可以等待最终图像。limit:参数限定请求的图像数量上限;Apple可能会基于策略或设备状态返回更少的图像。

程序化路径要求iOS 18.4+,并且需要支持Apple Intelligence且已启用该功能的设备。可用性检查模式:在try内构造ImageCreator,然后读取availableStyles。空的availableStyles集合(或抛出的初始化器)表明当前设备无法生成;应用应回退到非生成路径(资源库、用户上传的图像等)。

ImagePlaygroundStyle变体

样式参数约束视觉美学5

  • .animationApple的动画角色风格(圆润的形态、粗描边、简化的特征)。适合头像、吉祥物、友好的UI插图。
  • .illustration带矢量风格的扁平插图样式。适合信息图、菜谱卡、概念性图像。
  • .sketch铅笔素描风格(在更晚版本中加入)。适合笔记应用、日志记录、手绘美学。

希望生成图像保持一致美学的应用(每个头像都用.animation样式,每张菜谱卡都用.illustration样式)会在生成调用中锁定样式;希望把选择权暴露给用户的应用则呈现一个映射到可用case的样式选择器。

个性化与策略修饰符

两个SwiftUI修饰符让应用在自身上下文中约束Image Playground的行为6

.imagePlaygroundPersonalizationPolicy(_:)接受一个ImagePlaygroundPersonalizationPolicy值:.automatic(系统默认)、.enabled(显式允许)或.disabled(禁止系统引用联系人/照片等个人内容)。在隐私敏感的场景下使用.disabled(医疗、金融、匿名通讯)。

.imagePlaygroundGenerationStyle(_:in:)接受一种首选样式和一个允许的样式数组。用户的样式选择器(如果可见)会被限定在允许的列表内,而首选样式即为默认值。当应用的美学需要约束或锁定可用样式时使用此修饰符。

两个修饰符都把系统级Apple Intelligence配置作为下限来尊重。应用无法覆盖系统已禁用的功能;只能在其基础上进一步约束。

常见失误

来自Image Playground集成日志的三种模式:

调用ImageCreator()时没有捕获初始化器错误。在不支持Apple Intelligence的设备上,creator在初始化时会抛出。没有try并捕获的应用会向用户呈现令人困惑的错误。修复:把ImageCreator()包在try中,检查availableStyles,并在失败时提供回退路径(显示占位符、提示用户在”设置”中启用Apple Intelligence,或完全隐藏该功能)。

集成路径与用例错配。使用ImageCreator的个人头像生成器产出用户无法调整的一次性头像;使用sheet的一次性头像生成器又增添了摩擦。让路径与用户期望相匹配:想迭代就用sheet;想要结果就用程序化。

忽视系统的策略下限。试图绕过系统Apple Intelligence设置的应用(例如,在用户全局禁用的上下文中生成图像)会触发策略错误。修复:尊重系统配置;在Apple Intelligence被禁用时给出有意义的错误,而不是静默失败。

这一模式对Apple Intelligence应用意味着什么

三个要点。

  1. 按用户心智模型选择集成路径。创作迭代用sheet;非交互流程的一次性生成用程序化。选错的代价是切实的UX摩擦。

  2. 有意识地约束样式与个性化。希望头像样式保持一致的消息应用,会向.imagePlaygroundGenerationStyle(_:in:)传入一个允许的样式。注重隐私的日志应用则设置.imagePlaygroundPersonalizationPolicy(.disabled)。默认值是宽松的(.automatic);刻意的约束让该功能感觉更有意图。

  3. 始终检查ImageCreator()availableStyles(或捕获初始化器错误)并准备好回退。Apple Intelligence需要特定硬件(iPhone 15 Pro及更新机型、M系列Mac)外加用户选择启用。依赖Image Playground却没有可用性检查的应用,会在较旧设备上以及Apple Intelligence被禁用的设备上以令人困惑的方式失败。

完整Apple Ecosystem系列:类型化App IntentsMCP服务器路由问题Foundation Models运行时vs工具LLM之分三个表面单一真相来源模式两台MCP服务器Apple开发的hooksLive ActivitieswatchOS运行时SwiftUI内部机制RealityKit的空间心智模型SwiftData模式纪律Liquid Glass模式多平台发布平台矩阵Vision框架Symbol EffectsCore ML端侧推理Writing Tools APISwift Testing隐私清单作为平台的无障碍性SF Pro字体排印visionOS空间模式Speech框架SwiftData迁移tvOS焦点引擎@Observable内部机制SwiftUI Layout协议自定义SF SymbolsAVFoundation HDRwatchOS锻炼生命周期iOS 26中的App Intents 2.0我拒绝写的内容。中心节点参见Apple Ecosystem系列。关于更广泛的iOS与AI agents结合的上下文,参见iOS Agent开发指南

FAQ

我需要处理Apple Intelligence不可用的情况吗?

需要。Image Playground要求支持Apple Intelligence的设备(iPhone 15 Pro及更新机型、M系列Mac)并已启用该功能。在不支持的设备上,sheet不会呈现,ImageCreator()会在初始化时抛出。检查模式:把ImageCreator()包在try中并检查availableStyles;空集合或抛出的初始化器表明无法生成。请为不受支持的用户提供非生成式回退。

我可以自定义sheet的UI吗?

不能。Sheet由系统控制。应用提供起始概念并接收结果;中间的一切都是Apple的UI。如果需要自定义UI,请使用ImageCreator程序化API并围绕它构建自己的迭代界面。

当用户取消sheet时,已生成的图像会怎样?

5参数的imagePlaygroundSheet重载提供独立的onCompletiononCancellation闭包。当用户选择图像时,onCompletion会以非可选URL触发;当用户不选择就取消时,onCancellation会触发。临时图像数据由系统清理;想要保留图像的应用必须在完成处理器中将其保存到自身存储。

Image Playground如何与照片权限交互?

Sheet本身不要求照片库访问权限。如果用户在sheet内引用其照片库(浏览图像作为概念使用),sheet会在内部处理权限提示。应用无需为Image Playground集成预先请求照片权限。

我可以在后台生成图像吗?

ImageCreator在前台运行;框架管理生成所需的系统资源。希望在后台进行图像生成的应用,需要保持其应用处于前台(或处于允许继续执行的会话类型,例如watchOS锻炼生命周期所涉及的锻炼会话)。

这与Foundation Models LLM有什么关系?

Image Playground的模型与Foundation Models端侧LLM(详见Foundation Models端侧LLM)是分开的。两者共享Apple Intelligence框架基础设施,但使用不同的专用模型。把它们组合起来的应用(由LLM生成的提示词输入到图像生成中)会按顺序串接两个API。

参考资料


  1. Apple Developer Documentation:Image Playground。涵盖SwiftUI sheet集成以及程序化ImageCreator API的框架参考。 

  2. Apple Developer Documentation:imagePlaygroundSheet(isPresented:concept:onCompletion:)。呈现系统Image Playground UI的SwiftUI视图修饰符。 

  3. Apple Developer Documentation:ImageCreator。程序化API(iOS 18.4+),其images(for:style:limit:)方法返回生成结果的异步流。 

  4. Apple Developer Documentation:ImagePlaygroundConcept。可组合进生成请求的概念变体(.text.image.drawing.extracted)。 

  5. Apple Developer Documentation:ImagePlaygroundStyle。用于视觉美学控制的可用样式case(.animation.illustration.sketch)。 

  6. Apple Developer Documentation:imagePlaygroundPersonalizationPolicy(_:)imagePlaygroundGenerationStyle(_:)。用于约束个性化与锁定生成样式的视图修饰符。 

相关文章

Genmoji And NSAdaptiveImageGlyph: How Apps Display User-Generated Inline Emoji

Genmoji ships as NSAdaptiveImageGlyph in attributed text. Apps using UITextView with TextKit 2 enable supportsAdaptiveIm…

10 分钟阅读

Accessibility As Platform: Personal Voice, Live Speech, Eye Tracking, Music Haptics

Personal Voice, Live Speech, Eye Tracking, Music Haptics, Vocal Shortcuts: accessibility as platform features, not app r…

14 分钟阅读

The Cleanup Layer Is the Real AI Agent Market

Charlie Labs pivoted from building agents to cleaning up after them. The AI agent market is moving from generation to pr…

15 分钟阅读