View in English

  • Global Nav Open Menu Global Nav Close Menu
  • Apple Developer
Search
Cancel
  • Apple Developer
  • News
  • Discover
  • Design
  • Develop
  • Distribute
  • Support
  • Account
Only search within “”

Quick Links

5 Quick Links

Vídeos

Abrir menu Fechar menu
  • Coleções
  • Tópicos
  • Todos os vídeos
  • Sobre

Voltar para WWDC25

  • Sobre
  • Resumo
  • Transcrição
  • Código
  • Saiba mais sobre as Ferramentas de Escrita

    Com as Ferramentas de Escrita, as pessoas podem revisar, reescrever e transformar textos diretamente do seu app. Aprenda técnicas avançadas para personalizar as Ferramentas de Escrita para o seu app. Explore as opções de formatação e como elas funcionam com a edição de texto avançado. Se você tiver um mecanismo de texto personalizado, saiba como integrar perfeitamente toda a experiência das Ferramentas de Escrita, permitindo edições diretamente na visualização do texto.

    Capítulos

    • 0:00 - Introdução
    • 0:46 - Novidades
    • 2:21 - Personalizar visualizações de texto nativas
    • 4:00 - Formatação de texto avançado
    • 7:41 - Mecanismos de texto personalizados
    • 16:58 - Próximas etapas

    Recursos

    • Enhancing your custom text engine with Writing Tools
    • Writing Tools
      • Vídeo HD
      • Vídeo SD

    Vídeos relacionados

    WWDC24

    • Get started with Writing Tools
  • Buscar neste vídeo...

    Olá! Esta é a sessão Saber mais sobre as Ferramentas de Escrita. Meu nome é Dongyuan. Trabalho com entrada de texto e internacionalização. Ano passado, lançamos as Ferramentas de Escrita e mostramos como integrá-las ao seu app.

    Hoje, vamos explorar alguns tópicos mais avançados. Vou mostrar as novidades nas Ferramentas de Escrita,

    como personalizar a experiência em visualizações de texto nativas,

    usar o recurso com texto formatado

    e integrar a experiência completa se o app tiver um mecanismo de texto personalizado. Vamos começar! Com as Ferramentas de Escrita, as pessoas podem reescrever, revisar e resumir textos diretamente nas visualizações de texto. Este ano, adicionamos muitos recursos novos às Ferramentas de Escrita. Com a integração com o ChatGPT, você também pode gerar conteúdo sobre qualquer tópico ou criar imagens com prompts simples.

    As Ferramentas de Escrita agora estão disponíveis no visionOS. Elas funcionam em quase todos os lugares, incluindo Mail, Notas e apps que você cria.

    Novidade no iOS, iPadOS e macOS 26: após pedir alterações para reescrever o texto, você pode inserir uma solicitação de acompanhamento.

    Por exemplo, você pode pedir para deixar o texto mais amigável, conversacional ou encorajador.

    Além disso, as Ferramentas de Escrita estão disponíveis como Atalhos para agilizar os fluxos de trabalho com a Apple Intelligence. Ferramentas como revisar, reescrever e resumir agora podem ser usadas de forma automatizada.

    Também incluímos várias APIs para facilitar o uso das Ferramentas de Escrita no seu app. Agora você pode incluir o botão de banco de dados e itens de menu padrão, pedir para retornar os intents de apresentação para texto com formatação ou integrar o coordenador das Ferramentas de Escrita ao seu mecanismo de texto personalizado. Depois mostraremos as novas opções de resultados e a API do coordenador.

    Vamos mostrar como personalizar as Ferramentas de Escrita em visualizações de texto nativas do sistema.

    O vídeo do ano passado aborda as noções básicas. Para visualizações de texto nativas, você pode ter suporte gratuito às Ferramentas de Escrita. Use os métodos para lidar com as operações das Ferramentas de Escrita, como pausar sincronização, personalizar visualização de texto para comportamento limitado ou completo do recurso, especificar intervalos não alteráveis ou usar opções de resultados para gerenciar a compatibilidade com texto com formatação, listas ou tabelas. No ano passado, as opções de resultado eram chamadas de "Opções de entrada permitidas, mas foram renomeadas para "Opções de resultados das Ferramentas de Escrita".

    As Ferramentas de Escrita aparecem quando você seleciona texto. Se o seu app tiver muito texto, considere adicionar um botão na barra de ferramentas, como no Notas e o Mail.

    Para fazer isso, use UIBarButtonItem no UIKit ou NSToolbarItem no AppKit.

    No menu de contexto, os itens das Ferramentas de Escrita são inseridos automaticamente. No caso de uma implementação de menu personalizada ou se quiser mover os itens das Ferramentas de Escrita, poderá definir automaticallyInsertsWritingToolsItems como false e usar a API writingToolsItems para obter os itens padrão. Este ano, atualizamos as opções Revisar, Reescrever e Resumir no menu. Usando a API, você pode obter todas as atualizações gratuitamente.

    Agora, vamos falar sobre formatação.

    Os apps têm vários tipos de visualizações de texto. Algumas não são compatíveis com texto com formatação, como o campo de busca no Finder. Outras são compatíveis com texto com formatação, como TextEdit.

    Outras aceitam estilos semânticos, como Notas. Aqui você pode especificar parágrafos com diferentes estilos semânticos, como título, subtítulo ou citação em bloco. Por exemplo, no Notas, o resultado das Ferramentas de Escrita pode utilizar cabeçalhos, tabelas e listas nativos. Para dizer às Ferramentas de Escrita que tipo de texto sua visualização aceita, utilize as opções de resultado. Para visualizações de texto sem formatação, use a opção correspondente. As Ferramentas de Escrita ainda usarão NSAttributedString para se comunicar com a visualização de texto, mas os atributos internos podem ser ignorados. Para visualizações de texto com formatação, como o do TextEdit, use a opção de resultado richText, com ou sem as opções de lista e tabela, dependendo se a exibição aceita listas e tabelas. As Ferramentas de Escrita podem ter atributos como negrito ou itálico à cadeia de caracteres atribuída.

    Os apps com compreensão especializada de formatos semânticos, como o Notas, podem usar a opção richText com a nova opção presentationIntent. As Ferramentas de Escrita usarão NSAttributedString com intents de apresentação para se comunicar com sua visualização de texto.

    Você pode se perguntar qual é a diferença entre atributos de exibição e intents de apresentação.

    No exemplo do TextEdit, texto com formatação é produzido com atributos de exibição, como negrito ou itálico, e a cadeia de caracteres atribuída é enviada para a visualização. Esses atributos carregam apenas informações estilísticas, como tamanhos de fonte, mas não de estilo semântico. O Notas tenta utilizar totalmente estilos semânticos nativos, como cabeçalhos. Embora as Ferramentas de Escrita tenham gerado o mesmo texto subjacente, adicionamos intents de apresentação à cadeia de caracteres. Então o Notas pode converter intents de apresentação nos estilos semânticos internos. Neste exemplo, a parte de cabeçalhos é apenas um intent de cabeçalho sem atributos de fonte concretos.

    Mesmo que .presentationIntent seja definido nas opções de resultado, as Ferramentas de Escrita podem adicionar atributos de exibição à cadeia, pois alguns estilos não podem ser representados por intents. Neste exemplo, elas usam um intent de apresentação destacado e um atributo de exibição tachado para representar o texto crucial e apagado na captura de tela.

    Para resumir, no modo de intent de apresentação, especificamos os estilos no formulário de intent de apresentação. Isso inclui elementos como listas, tabelas e blocos de código.

    Os atributos de exibição ainda podem ser usados para atributos como sublinhados, subscritos e sobrescritos. E, por último, os intents de apresentação não têm um estilo padrão. Seu app é responsável por converter intents de apresentação em atributos de exibição ou estilos internos próprios.

    Para que as Ferramentas de Escrita entendam melhor a semântica do seu texto, depois de adotar o intent de apresentação, pode substituir o método requestContexts para sua visualização e fornecer um contexto com intents de apresentação sempre que possível.

    Mesmo que você use um mecanismo de texto personalizado, podemos ajudar.

    Você pode ter a experiência básica das Ferramentas de Escrita gratuitamente se seu mecanismo de texto tiver protocolos comuns de edição de texto. No iOS, é UITextInteraction ou UITextSelectionDisplayInteraction com UIEditMenuInteraction. No macOS, sua visualização precisa adotar NSServicesMenuRequestor para ativar as Ferramentas de Escrita na visualização de texto e permitir os recursos do menu Serviços. Para obter detalhes sobre a adoção básica, confira a sessão da WWDC24.

    Se quiser ir além, você pode implementar a experiência completa das Ferramentas de Escrita. Isso permite às Ferramentas de Escrita reescrever o texto no local, incluir animação e mostrar as alterações de revisão de texto na linha. Este ano, adicionamos APIs do coordenador para mecanismos de texto personalizados.

    Ele gerencia as interações entre a visualização e as Ferramentas de Escrita.

    Anexe um coordenador à sua visualização e crie um delegado para implementar os métodos WritingToolsCoordinatorDelegate. O delegado prepara o contexto para as Ferramentas de Escrita, incorpora alterações, fornece objetos de visualização para usar em animações e coordenadas para criação de marcas de revisão e responde a alterações de estado. Vamos ver como fazer isso com uma rápida demonstração.

    Aqui tenho um mecanismo de texto personalizado, criado com o TextKit 2. Como você pode ver, já implementamos protocolos comuns de edição de texto, como NSTextInputClient e NSServicesMenuRequestor.

    Se compilar e executar o app, posso usar o básico das Ferramentas de Escrita gratuitamente. Todos os resultados serão mostrados em um painel. Posso fazer uma reescrita, por exemplo.

    E substituir ou copiar o resultado.

    Agora vamos implementar o suporte completo.

    Na DocumentView, vou adicionar propriedades de instância necessárias para uma sessão de Ferramentas de Escrita, inicializar um objeto NSWritingToolsCoordinator, definir o delegado como self

    e atribuí-lo a uma NSView. Preciso chamar configureWritingTools em init.

    Aqui diz que a DocumentView não está em conformidade com NSWritingToolsCoordinator.Delegate.

    Vamos arrastar um arquivo que implementa todos os métodos delegados, em uma extensão DocumentView. Aqui ele prepara o contexto,

    faz a substituição e a seleção de texto, retorna caixas delimitadoras para revisão,

    gera visualizações para animações, etc.

    Vamos compilar e executar o app.

    Se eu reescrever o texto,

    você poderá ver a animação, e a alteração acontecerá diretamente na visualização.

    E se eu revisar, você pode ver os sublinhados adicionados.

    Também posso clicar nas sugestões individuais para mostrar o que mudou.

    Agora vamos falar sobre cada uma dessas etapas.

    Primeiro vamos criar um coordenador e anexá-lo a uma exibição. O coordenador é uma UIInteraction no UIKit, que deve ser anexado à UIView assim como outras UIInteractions. No AppKit, é uma propriedade de instância na NSView. Depois de adicionar o coordenador, você pode definir o comportamento e as opções de resultado preferidas.

    Agora, vamos aos métodos delegados. Primeiro, as Ferramentas de Escrita precisam de um contexto para o texto atual. Um contexto consiste em uma parte do texto como NSAttributedString e um intervalo de seleção. Inclua no mínimo a seleção de texto atual na cadeia de caracteres atribuída. Você também pode incluir o parágrafo antes e depois da seleção para esclarecer o contexto ao redor do texto para as Ferramentas de Escrita. Defina o intervalo de seleção com base em context.attributedString. Se nada estiver selecionado, retorne todo o documento como contexto e defina o intervalo para o local do cursor. Isso dá às Ferramentas de Escrita a oportunidade de trabalhar em todo o documento, quando nada for selecionado.

    É assim que você dá mais contexto. Aqui vemos o AppKit, mas a menos que eu aponte especificamente, você pode presumir que UIWritingToolsCoordinator e NSWritingToolsCoordinator se comportam igual. Os métodos delegados são assíncronos devido ao tempo de processamento do armazenamento de texto em exibições grandes. No corpo da função, prepare o texto e o intervalo dependendo do parâmetro "scope". Na maioria das vezes, você só precisa retornar um contexto. Para exibições de texto avançadas com seleção em vários armazenamentos, o coordenador também oferece suporte a múltiplos contextos.

    Depois de avaliar o texto na visualização, as Ferramentas de Escrita fornecem sugestões de alterações para o objeto delegado. Neste método, aplique a alteração diretamente ao armazenamento de texto da visualização. As Ferramentas de Escrita chamam esse método a cada alteração, possivelmente várias vezes com intervalos diferentes para o mesmo contexto. Depois, as Ferramentas de Escrita podem solicitar a atualização do texto selecionado pelo delegado.

    Para animar o texto durante o trabalho das Ferramentas de Escrita, o coordenador solicita prévias para determinados intervalos de texto.

    A visualização deve retornar prévias renderizando o texto em um plano de fundo claro. Enquanto isso, as Ferramentas de Escrita aplicam os efeitos visuais às prévias fornecidas em vez de ao próprio texto. No macOS, isso é feito com dois métodos delegados. O primeiro usa uma matriz. Você deve retornar pelo menos uma visualização para todo o intervalo. Ou então retornar uma visualização por linha para uma animação mais suave.

    No iOS, o UIKit usa UITargetedPreview em vez de NSTextPreview, e apenas um método delegado é utilizado.

    Antes e depois da animação real, as Ferramentas de Escrita chamam os métodos prepareFor e finish. Para se preparar para a animação de texto, oculte o intervalo específico de texto da visualização. Quando terminar, mostre o intervalo específico do texto novamente.

    Para revisão, as Ferramentas de Escrita mostram um sublinhado no texto que foi alterado. Elas também respondem a eventos de clique no texto para mostrar a janela de revisão integrada.

    Para mostrar as marcas de revisão, o coordenador pede ao delegado que devolva os caminhos sublinhados para intervalos individuais. Também é preciso ter um caminho delimitador para responder a eventos de clique ou toque.

    Por fim, você pode implementar o método opcional writingToolsCoordinator:willChangeToState:completion: para responder a alterações de estado. Dependendo da sua implementação de visualização, você pode agrupar operações de desfazer, interromper a sincronização ou impedir a edição. Mas você deve informar o coordenador sobre alterações externas com updateRange:withText para garantir que as operações estejam sincronizadas com o texto mais recente. Use updateForReflowedText para informar sobre alterações de layout na visualização. Quando você chama esse método, as ferramentas solicitam novas visualizações, marcas de revisão e outras informações dependentes do layout.

    Vimos como integrar toda a experiência das Ferramentas de Escrita ao mecanismo de texto personalizado. Também lançamos o projeto que mostrei antes como código de exemplo. Para saber mais, consulte o código de exemplo e a documentação sobre o coordenador das Ferramentas de Escrita.

    Isso encerra a sessão. O que vem por aí? Teste os novos recursos das Ferramentas de Escrita, como ajustes de acompanhamento depois de descrever alterações. Ou as Ferramentas de Escrita no Vision Pro e o app Atalhos.

    Adicione um botão na barra de ferramentas se houver muito texto.

    Explore as opções de formatação para permitir a leitura e escrita de estilos semânticos, como títulos, subtítulos e blocos de código.

    Aprimore ainda mais seu mecanismo de texto com a experiência completa das Ferramentas de Escrita.

    Confira também a sessão "Introdução às Ferramentas de Escrita" do ano passado e o código de exemplo abaixo para ver o coordenador das Ferramentas de Escrita em ação. Agradeço sua participação.

    • 11:46 - Attach a coordinator to the view (UIKit)

      // Attach a coordinator to the view
      // UIKit
      
      func configureWritingTools() {
          guard UIWritingToolsCoordinator.isWritingToolsAvailable else { return }
      
          let coordinator = UIWritingToolsCoordinator(delegate: self)
          addInteraction(coordinator)
      }
    • 12:02 - Attach a coordinator to the view (AppKit)

      // Attach a coordinator to the view
      // AppKit
      
      func configureWritingTools() {
          guard NSWritingToolsCoordinator.isWritingToolsAvailable else { return }
             
          let coordinator = NSWritingToolsCoordinator(delegate: self)
      
          coordinator.preferredBehavior = .complete
          coordinator.preferredResultOptions = [.richText, .list]
          writingToolsCoordinator = coordinator
      }
    • 13:06 - Prepare the context

      // Prepare the context
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsContextsFor scope: NSWritingToolsCoordinator.ContextScope,
              completion: @escaping ([NSWritingToolsCoordinator.Context]) -> Void) {
      
          var contexts = [NSWritingToolsCoordinator.Context]()
                      
          switch scope {
          case .userSelection:
              let context = getContextObjectForSelection()
              contexts.append(context)
              break
              // other cases…
          }
              
          // Save references to the contexts for later delegate calls.
          storeContexts(contexts)
          completion(contexts)
      }
    • 13:48 - Respond to text changes from Writing Tools and update selected range

      // Respond to text changes from Writing Tools
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              replace range: NSRange,
              in context: NSWritingToolsCoordinator.Context,
              proposedText replacementText: NSAttributedString,
              reason: NSWritingToolsCoordinator.TextReplacementReason,
              animationParameters: NSWritingToolsCoordinator.AnimationParameters?,
              completion: @escaping (NSAttributedString?) -> Void) {
      }
      
      // Update selected range
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              select ranges: [NSValue],
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping () -> Void) {
      }
    • 14:41 - Generate preview for animation (AppKit)

      // Generate preview for animation (macOS)
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsPreviewFor textAnimation: NSWritingToolsCoordinator.TextAnimation,
              of range: NSRange,
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping ([NSTextPreview]?) -> Void) {
      }
          
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsPreviewFor rect: NSRect,
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping (NSTextPreview?) -> Void) {
      }
    • 14:58 - Generate preview for animation (UIKit)

      // Generate preview for animation (iOS)
      
      func writingToolsCoordinator(_ writingToolsCoordinator: UIWritingToolsCoordinator,
              requestsPreviewFor textAnimation: UIWritingToolsCoordinator.TextAnimation,
              of range: NSRange,
              in context: UIWritingToolsCoordinator.Context,
              completion: @escaping (UITargetedPreview?) -> Void) {
      }
    • 15:08 - Delegate callbacks before and after animation

      // Generate preview for animation
      
      func writingToolsCoordinator(
          _ writingToolsCoordinator: NSWritingToolsCoordinator,
          prepareFor textAnimation: NSWritingToolsCoordinator.TextAnimation,
          for range: NSRange,
          in context: NSWritingToolsCoordinator.Context,
          completion: @escaping () -> Void) {
      
          // Hide the specific range of text from the text view
      }
      
      func writingToolsCoordinator(
          _ writingToolsCoordinator: NSWritingToolsCoordinator,
          finish textAnimation: NSWritingToolsCoordinator.TextAnimation,
          for range: NSRange,
          in context: NSWritingToolsCoordinator.Context,
          completion: @escaping () -> Void) {
      
          // Show the specific range of text again
      }
    • 15:39 - Delegate callbacks to show proofreading marks

      // Create proofreading marks
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsUnderlinePathsFor range: NSRange,
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping ([NSBezierPath]) -> Void) {
      }
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsBoundingBezierPathsFor range: NSRange,
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping ([NSBezierPath]) -> Void) {
      }
    • 0:00 - Introdução
    • Neste vídeo, analisaremos as novidades das Ferramentas de Escrita, como personalizar a experiência do seu app, oferecer suporte a rich text e integrar em mecanismos de texto personalizados.

    • 0:46 - Novidades
    • Agora, as Ferramentas de Escrita oferecem suporte à integração com ChatGPT, visionOS, solicitações de acompanhamento para ajustes de tom e automação usando Atalhos. As Ferramentas de Escrita também fornecem novas APIs para ajudar você a integrar no seu app.

    • 2:21 - Personalizar visualizações de texto nativas
    • Se seu app usa visualizações de texto nativas, você pode ter suporte gratuito às Ferramentas de Escrita. Você pode personalizar mais a experiência, adotando métodos de ciclo de vida para reagir a operações, como pausar a sincronização, especificar intervalos ignorados no texto, fornecer um botão na barra de ferramentas ou personalizar menus de contexto.

    • 4:00 - Formatação de texto avançado
    • As Ferramentas de Escrita agora aceitam rich text com estilos semânticos. Se o seu app aceita intents de apresentação, como títulos, subtítulos, citações, tabelas e listas, você poderá comunicar essas informações às Ferramentas de Escrita. As Ferramentas de Escrita fornecerão resultados usando estilos no intent de apresentação aceito pelo seu app sempre que possível.

    • 7:41 - Mecanismos de texto personalizados
    • Se o seu app usa um mecanismo de texto personalizado, agora é possível ativar uma experiência integrada com as Ferramentas de Escrita. A experiência básica das Ferramentas de Escrita funciona automaticamente, desde que você adote protocolos comuns de edição de texto. A experiência completa das Ferramentas de Escrita permite que elas reescrevam o texto diretamente no local, forneçam animações e mostrem alterações de revisão embutidas. Para ter a experiência completa, use a nova API do coordenador das Ferramentas de Escrita para integrá-las ao seu mecanismo de texto personalizado.

    • 16:58 - Próximas etapas
    • Explore os novos recursos das Ferramentas de Escrita e aproveite a personalização e o suporte a rich text no seu app. Se você tiver um mecanismo de texto personalizado, habilite a experiência completa das Ferramentas de Escrita adotando a API do coordenador.

Developer Footer

  • Vídeos
  • WWDC25
  • Saiba mais sobre as Ferramentas de Escrita
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • App Store
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Fonts
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Open Source
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Sample Code
    • Tutorials
    • Downloads
    • Forums
    • Videos
    Open Menu Close Menu
    • Support Articles
    • Contact Us
    • Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Get the Apple Developer app.
    Copyright © 2025 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines