← Alle Beitrage

Genmoji und NSAdaptiveImageGlyph: Inline-Emoji unter iOS 18+

Genmoji ist der nach außen sichtbare Name für die benutzerdefinierte Emoji-Funktion von Apple Intelligence: Der Benutzer gibt eine Beschreibung ein, das System generiert ein Inline-Bild im Emoji-Stil, und das Ergebnis erscheint im Text neben Unicode-Emojis. Die für Entwickler relevante Schnittstelle ist NSAdaptiveImageGlyph, eine ab iOS 18 verfügbare Klasse, die adaptive Inline-Bilder in attributiertem Text repräsentiert1. Genmoji ist eine Quelle von NSAdaptiveImageGlyph-Instanzen; Apps, die attributierten Text verarbeiten, müssen diese Klasse unterstützen, um Genmoji (und alle künftigen adaptiven Bildglyphen-Inhalte, die Apple einführt) anzuzeigen.

TL;DR

  • NSAdaptiveImageGlyph (iOS 18+) ist ein Datentyp, der ein adaptives Bild zusammen mit identifizierenden Metadaten kapselt. Genmoji-Eingaben über die System-Tastatur werden als NSAdaptiveImageGlyph-Instanzen eingebettet in attributiertem Text geliefert2.
  • supportsAdaptiveImageGlyph ist im UITextInput-Protokoll deklariert; UITextView erfüllt dieses Protokoll, sodass die Eigenschaft als textView.supportsAdaptiveImageGlyph = true gesetzt werden kann. Apples Erklärung ist eindeutig: Wenn die Eigenschaft false ist, „erlaubt das Eingabesystem nicht, dass die Texteingabe adaptive Bilder enthält.” Apps müssen sich aktiv anmelden, damit Genmoji gerendert werden.
  • Adaptive Bildglyphen erfordern TextKit 2. Apps, die noch TextKit 1 verwenden, rendern NSAdaptiveImageGlyph nicht korrekt. Neue Apps, die auf iOS 18+ ausgerichtet sind, sollten standardmäßig TextKit 2 nutzen.
  • NSAttributedString transportiert adaptive Bildglyphen über das Attribut NSAttributedString.Key.adaptiveImageGlyph. Der Initializer NSAttributedString(adaptiveImageGlyph:attributes:) erstellt einen attributierten String, der eine einzelne Glyphe enthält3.
  • Persistenz und Round-Tripping erfordern Sorgfalt. Reine Textspeicherung entfernt Genmoji vollständig; Rich-Text-Formate (RTFD, Markdown mit Erweiterungen, HTML mit eingebetteten Bilddaten) bewahren sie.

Was NSAdaptiveImageGlyph enthält

Ein NSAdaptiveImageGlyph ist ein Daten-Wrapper mit vier identifizierenden Eigenschaften2:

  • imageContent: Data. Die Bilddaten selbst, in dem von contentType deklarierten Format.
  • contentIdentifier: String. Eine eindeutige Kennung für die Glypheninstanz. Wird zur Deduplikation und für das interne Caching des Systems verwendet.
  • contentDescription: String. Alternativtext, der die Glyphe beschreibt. Apps, die Barrierefreiheits-Labels offenlegen oder Glyphen an Empfänger ohne Glyphen-Unterstützung senden, verwenden ihn.
  • contentType: UTType. Eine Typ-Eigenschaft auf Klassenebene, die das von Apple für adaptive Glyphen verwendete Bildformat (eine HEIC-Variante) offenlegt. Apps, die serialisieren, prüfen diesen Wert, um eine formatabhängige Verarbeitung zu steuern.

Die Datenmenge liegt für ein Standard-Genmoji typischerweise bei einigen Dutzend Kilobyte. Mehrere Größen werden in derselben Bilddatei mithilfe der adaptiven Bildfunktionen von HEIC kodiert; das System wählt die passende Größe je nach Render-Kontext.

Adaptive Bildglyphen in UITextView aktivieren

Die Aktivierung erfolgt über eine einzige Eigenschaft1:

import UIKit

let textView = UITextView()
textView.supportsAdaptiveImageGlyph = true
// TextKit 2 is required; modern UITextView usage gets it by default
// (see: developer.apple.com/documentation/uikit/using-textkit-2-to-interact-with-text)

Ohne supportsAdaptiveImageGlyph = true erscheint vom Benutzer eingegebenes Genmoji als Platzhalterzeichen (das System kann die Glyphe nicht rendern). Setzen Sie die Eigenschaft, dann werden sowohl das Rendern als auch der „Genmoji”-Tab der System-Tastatur aktiviert, sodass der Benutzer innerhalb der Textansicht eigene Genmoji erstellen kann.

Die nativen TextField- und TextEditor-Komponenten von SwiftUI bieten derzeit keinen supportsAdaptiveImageGlyph-Modifier. SwiftUI-Apps, die adaptives Bildglyphen-Rendering benötigen, kapseln UITextView in einer UIViewRepresentable und setzen supportsAdaptiveImageGlyph = true an der zugrunde liegenden View. Community-Wrapper wie GlyphMeThat liefern diese Brücke gebrauchsfertig.

TextKit 2 ist tragend

NSAdaptiveImageGlyph setzt die Layout-Architektur von TextKit 2 voraus4. TextKit 1 (die Legacy-Text-Engine, die mit dem ursprünglichen Modell aus NSTextStorage/NSLayoutManager/NSTextContainer ausgeliefert wurde) rendert adaptive Bildglyphen nicht korrekt; die Glyphe erscheint als generischer Platzhalter oder lässt sich gar nicht layouten.

Apps befinden sich in drei Zuständen:

Neue Apps unter iOS 18+. Standardmäßig TextKit 2. UITextView, das über Interface Builder oder init(frame:textContainer:) initialisiert wird, verwendet ab iOS 16+ standardmäßig TextKit 24. Neuer Code erhält es kostenlos.

Legacy-Apps, die noch TextKit 1 verwenden. Eine Migration ist erforderlich. Die Migration zu TextKit 2 ist nicht trivial für Apps, die NSLayoutManager per Subclassing erweitern, layoutbezogene Delegate-Methoden überschreiben oder das ältere NSTextStorage direkt verwenden. Apples TextKit-2-Dokumentation deckt die moderne Layout-Architektur ab; für Apps mit einfacher UITextView-Nutzung verläuft die Migration weitgehend automatisch.

Hybride Apps. Manche Apps betten WKWebView für die HTML-Bearbeitung neben UITextView für die einfache Bearbeitung ein. WKWebView verarbeitet adaptive Bildglyphen über einen eigenen Render-Pfad (nicht TextKit), sodass eine Hybrid-App eine Oberfläche haben kann, die Genmoji unterstützt, und eine andere, die sie nicht unterstützt. Dokumentieren Sie das Verhalten; Benutzer bemerken es, wenn ein Editor benutzerdefinierte Emojis unterstützt und der andere sie entfernt.

Integration mit NSAttributedString

Adaptive Bildglyphen fließen über das Attribut NSAttributedString.Key.adaptiveImageGlyph durch attributierte Strings3:

import UIKit

// Construct an attributed string containing a single adaptive image glyph
let glyph: NSAdaptiveImageGlyph = ...
let attrString = NSAttributedString(
    adaptiveImageGlyph: glyph,
    attributes: [
        .font: UIFont.systemFont(ofSize: 17)
    ]
)

// Concatenate with surrounding text
let composed = NSMutableAttributedString(string: "Look at this ")
composed.append(attrString)
composed.append(NSAttributedString(string: " I just made!"))

Das Muster lässt sich kombinieren: eine Glyphe innerhalb von Text innerhalb von weiterem Text. Das System übernimmt das Layout (einschließlich der adaptiven Größe der Glyphe an die Schriftgröße des umgebenden Textes) automatisch.

Beim Lesen liefert das Iterieren über das Attribut .adaptiveImageGlyph eines NSAttributedString die NSAdaptiveImageGlyph-Instanzen an den Positionen, an denen sie auftreten:

attributedString.enumerateAttribute(
    .adaptiveImageGlyph,
    in: NSRange(location: 0, length: attributedString.length)
) { value, range, _ in
    if let glyph = value as? NSAdaptiveImageGlyph {
        // process glyph + range
    }
}

Apps, die Text filtern, transformieren oder persistieren, nutzen diese Enumeration, um Glyphen zu finden und zu entscheiden, was mit ihnen geschehen soll.

Persistenz und Serialisierung

Reine Textspeicherung (ein String, eine UTF-8-Datei) bewahrt adaptive Bildglyphen nicht. Das Unicode-Platzhalterzeichen, das die Glyphe in attributiertem Text repräsentiert, wird als U+FFFC (Object Replacement) oder gar nicht serialisiert, und die eigentlichen Glyphendaten gehen verloren.

Für eine round-trip-fähige Persistenz benötigen Apps ein Rich-Text-Format5:

RTFD. Apples Format für Rich Text plus Anhänge. Round-trip-fähig für adaptive Bildglyphen. Wird von Notizen, Mail (beim Senden von Rich-Content) und TextEdit verwendet. Das Format ist umfangreich (ein Verzeichnis-Bundle mit Anhängen), aber verlustfrei.

HTML mit eingebetteten Bildern. Web-freundlich. Glyphen werden als <img>-Tags mit Base64-kodierten Daten-URIs serialisiert. Größere Nutzdaten, funktioniert aber bei den meisten Empfängern, die Rich Text verarbeiten können.

Markdown mit Erweiterungen. Standard-Markdown hat keine Syntax für adaptive Bildglyphen, aber erweiterte Dialekte (CommonMark mit Anhang-Unterstützung, Apples eigenes erweitertes Markdown) können sie transportieren. Dokumentieren Sie die Dialekt-Anforderung für jede Markdown-basierte Persistenz.

Apps, die Text über das Netzwerk senden (Chat, E-Mail, Social Media), müssen entscheiden: Glyphen Ende-zu-Ende erhalten (funktioniert nur, wenn sowohl Sender als auch Empfänger iOS 18+ verwenden und der Transport Rich Text unterstützt), Glyphen entfernen und durch Fallback-Text (contentDescription) ersetzen oder die Glyphe als Systembild rendern und das Bild einbetten. Die richtige Wahl hängt von der Zielgruppe und der Plattform ab.

Häufige Fehler

Drei Fehlermuster treten bei der Einführung von NSAdaptiveImageGlyph immer wieder auf:

supportsAdaptiveImageGlyph = true vergessen. Der häufigste Bug. Die Textansicht rendert Unicode-Emojis problemlos, aber Genmoji erscheint als Platzhalterzeichen. Lösung: Setzen Sie die Eigenschaft auf jedem UITextView (UIKit) oder jedem NSTextInputClient-Konformitätstyp wie NSTextView (AppKit) auf true. Für SwiftUI existiert kein nativer Modifier; kapseln Sie ein UITextView in einer UIViewRepresentable (oder NSViewRepresentable unter macOS) und setzen Sie die Eigenschaft an der zugrunde liegenden View.

Reine Textspeicherung entfernt Glyphen. Wird der Inhalt der Textansicht als text (reiner String) gespeichert, gehen Genmoji verloren. Der Benutzer gibt ein benutzerdefiniertes Emoji ein, sieht es in der Textansicht, speichert das Dokument, öffnet es erneut – und das Emoji ist verschwunden. Lösung: Persistieren Sie als attributedText mit einem Rich-Text-Format, das adaptive Bildglyphen unterstützt (RTFD, HTML, ein eigenes Format mit Anhang-Seitenkanal).

Netzwerkübertragung verwirft Glyphen stillschweigend. Eine Messaging-App, die ausgehende Nachrichten als reinen Text serialisiert, entfernt Genmoji beim Versand. Der Empfänger sieht ein Platzhalterzeichen oder einen leeren Bereich. Lösung: Senden Sie entweder Rich-Content (und stellen Sie sicher, dass der Empfänger ihn unterstützt) oder ersetzen Sie für reine Text-Empfänger den contentDescription und fügen Sie die Bilddaten als separaten Anhang bei.

Was dieses Muster für iOS-18+-Apps bedeutet

Drei Erkenntnisse.

  1. Setzen Sie supportsAdaptiveImageGlyph = true auf jeder Texteingabe. Apps, die vom Benutzer eingegebenen Text akzeptieren, schalten adaptive Bildglyphen standardmäßig per Opt-in frei. Diese eine Eigenschaft entscheidet, ob Genmoji gerendert wird oder nicht funktioniert.

  2. Migrieren Sie zu TextKit 2, wenn Sie noch TextKit 1 verwenden. TextKit 1 befindet sich im Wartungsmodus. Neue Funktionen aus der iOS-26-Ära (adaptive Bildglyphen, Inline-Umschreibung der Writing Tools, Liquid Glass-Textrendering) setzen alle TextKit 2 voraus. Der Migrationsaufwand ist real, aber die Alternative ist, in einer veralteten Text-Engine auszuliefern.

  3. Wählen Sie Ihr Persistenzformat mit Blick auf adaptive Bildglyphen. RTFD für native iOS-Speicherung; HTML mit eingebetteten Bildern für web-kompatible Speicherung; ein eigenes Binärformat mit Anhang-Seitenkanal für Hochleistungs-Apps. Reiner Text ist die falsche Voreinstellung für Apps, in denen Benutzer Genmoji eingeben werden.

Der vollständige Apple-Ecosystem-Cluster: Writing Tools für die parallele Apple-Intelligence-Textoberfläche; Image Playground für die Bildgenerierung; App Intents 2.0 für die Apple-Intelligence-Integration in iOS 26; Foundation Models für das On-Device-LLM. Der Hub befindet sich in der Apple Ecosystem Series. Für einen breiteren Kontext zu iOS mit KI-Agenten siehe den iOS Agent Development Guide.

FAQ

Erhält meine App Genmoji „kostenlos”, wenn ich einfach UITextView verwende?

Nicht ganz. Der Standardwert für UITextView.supportsAdaptiveImageGlyph ist false. Apps müssen sich aktiv anmelden, indem sie die Eigenschaft auf true setzen. Sobald die Funktion aktiviert ist, erscheint der Genmoji-Tab der System-Tastatur für den Benutzer, und eingefügtes Genmoji wird korrekt gerendert. Ohne dieses Opt-in erscheint Genmoji, das anderswo eingegeben und in die Textansicht eingefügt wird, als Platzhalterzeichen.

Muss Apple Intelligence aktiviert sein, um Genmoji zu testen?

Für die vollständige Genmoji-Erstellung ja. Der vom Benutzer sichtbare Genmoji-Erstellungsfluss erfordert Apple-Intelligence-fähige Hardware (iPhone 15 Pro und neuer, Macs mit M-Chip) mit iOS 18+ und aktiviertem Apple Intelligence. Für Entwicklungstests des NSAdaptiveImageGlyph-Renderings können Sie Test-Glypheninstanzen programmatisch mit Beispiel-Bilddaten erzeugen und das Rendering der Textansicht auf jedem iOS-18+-Gerät oder Simulator überprüfen.

Was passiert mit einem Genmoji, wenn ich es an jemanden mit iOS 17 sende?

Ohne einen Rich-Text-Transport, der die Glyphe bewahrt, sieht der Empfänger den contentDescription (Alternativtext) oder ein Platzhalterzeichen. Moderne Messaging-Frameworks (Apples Nachrichten-App, aktuelle Versionen von Mail-Clients) handhaben den Fallback automatisch; eigene Protokolle benötigen eine explizite Behandlung.

Kann ich NSAdaptiveImageGlyph-Instanzen programmatisch erstellen?

Ja. Der öffentliche Initializer ist init(imageContent: Data), der vorab kodierte HEIC-Daten für adaptive Bilder entgegennimmt. contentIdentifier und contentDescription sind Instanzeigenschaften, die aus der kodierten Nutzlast gelesen werden; contentType ist ein UTType auf Klassenebene, der das von Apple für adaptive Glyphen verwendete Format (eine HEIC-Variante) beschreibt und nicht pro Instanz gilt. Apps, die eigene adaptive Bildglyphen erstellen, bereiten die HEIC-Nutzlast mit der pro Glyphe eingebetteten Kennung und Beschreibung vor und erstellen die Glyphe dann aus diesen Daten. Die WWDC-2024-Session 10220 („Bring expression to your app with Genmoji”) behandelt den vollständigen Erstellungsablauf.

Wie interagiert das mit Writing Tools?

Writing Tools (behandelt in Writing Tools API) bewahrt adaptive Bildglyphen in seinen Umschreibungs-Ergebnissen. Ein Benutzer, der Text mit Genmoji auswählt und Writing Tools um eine Umschreibung bittet, erhält ein Ergebnis, das die Genmoji an semantisch passenden Positionen bewahrt. Apps, die über UIWritingToolsCoordinator an Writing Tools teilnehmen, müssen die NSAdaptiveImageGlyph-Instanzen korrekt durch ihren eigenen Textspeicher round-trippen.

Was ist der Unterschied zwischen NSAdaptiveImageGlyph und NSTextAttachment?

NSTextAttachment ist das ältere, allgemeinere Anhang-System für Inline-Inhalte ohne Text (Bilder, Dateien, eigene Zeichnungen) in attributiertem Text. NSAdaptiveImageGlyph ist die iOS-18-Spezialisierung für emoji-ähnliche Inline-Bilder, die sich an die Eigenschaften der umgebenden Schrift anpassen. Beide werden über Attribute attributierter Strings angehängt, verwenden aber unterschiedliche Schlüssel (.attachment vs. .adaptiveImageGlyph) und unterschiedliche Render-Pfade (TextKit 1+TextKit 2 vs. ausschließlich TextKit 2). Neuer Code, der auf Genmoji-artige Inhalte abzielt, verwendet NSAdaptiveImageGlyph.

Quellen


  1. Apple Developer Documentation: supportsAdaptiveImageGlyph. Die Opt-in-Eigenschaft, die im UITextInput-Protokoll deklariert ist, dem UITextView entspricht; dieselbe Eigenschaft ist daher als textView.supportsAdaptiveImageGlyph zugänglich. 

  2. Apple Developer Documentation: NSAdaptiveImageGlyph. Der Datentyp, der den Bildinhalt, die Kennung, die Beschreibung und den Inhaltstyp kapselt. 

  3. Apple Developer Documentation: NSAttributedString.Key.adaptiveImageGlyph und NSAttributedString(adaptiveImageGlyph:attributes:). Die Integrationsschnittstelle für adaptive Bildglyphen in attributierten Strings. 

  4. Apple Developer Documentation: TextKit und Using TextKit 2 to interact with text. Die aktuellen TextKit-2-Einstiegspunkte; das Rendern adaptiver Bildglyphen hängt von der Layout-Architektur von TextKit 2 ab. 

  5. Apple Developer Documentation: NSAttributedString.DocumentType. Die unterstützten Rich-Text-Formate (RTFD, HTML usw.) für das Round-Tripping adaptiver Bildglyphen durch Persistenz. 

Verwandte Beiträge

Image Playground API: SwiftUI Sheet, programmatischer Image Creator und Stilsteuerung

Image Playground bietet Apps zwei Wege: den SwiftUI-Modifier imagePlaygroundSheet und die programmatische ImageCreator-A…

9 Min. Lesezeit

Apples Translation Framework: kostenlos, On-Device und schärfer, als es aussieht

Apples Translation Framework: kostenlose On-Device-Übersetzung über translationPresentation und TranslationSession – sam…

7 Min. Lesezeit

Loop Engineering: Schleifen gewinnen dort, wo Verifikation billig ist

Loop Engineering, geprüft an Boris Chernys vollständigen Transkripten: Jede Schleife, die er nennt, hat billige Verifika…

15 Min. Lesezeit