
-
Prepare o ambiente com o SwiftUI no visionOS
Descubra novas APIs para melhorar janelas, volumes e espaços imersivos em seu app para visionOS. Aprimore o comportamento de suas cenas quando forem reativadas ou ancoradas no lugar. Faça com que os volumes se adaptem ao ambiente ao seu redor com margens de corte e ajustes. Reproduza conteúdo imersivo do Mac no Vision Pro. Aprimore seus apps do UIKit com volumes e espaços imersivos.
Capítulos
- 0:00 - Introdução
- 2:11 - Abertura e fixação
- 8:15 - Aprimoramentos para volumes
- 15:58 - Espaço imersivo
- 22:16 - Ponte de cena
- 24:01 - Próximas etapas
Recursos
- Adopting best practices for persistent UI
- Canyon Crosser: Building a volumetric hike-planning app
- Petite Asteroids: Building a volumetric visionOS game
- Tracking accessories in volumetric windows
Vídeos relacionados
WWDC25
-
Buscar neste vídeo...
Olá! Sou Miguel, engineer na equipe SwiftUI. Vamos explorar algumas das novas funcionalidades incríveis adicionadas às cenas no visionOS 26. E vamos aprender como preparar algumas das nossas.
O visionOS tem três tipos de cenas: janelas, volumes e espaços imersivos. Apps podem combinar esses tipos para criar experiências únicas e envolventes.
Veremos novas APIs que se aplicam aos três tipos, além de algumas mais específicas para volumes e espaços imersivos. Meus amigos Maks, Amanda e Trevor estão trabalhando em melhorias empolgantes para o BOTanist, um jogo sobre ajudar um robô a cultivar plantas em um jardim flutuante.
Tenho trabalhado no meu próprio app, criando cenas e decorações para ajudar nossos amigos robôs a dar vida aos personagens de Shakespeare e encarar o mundo da atuação.
Ao abrir meu app, é aberta uma tela de seleção de palco. Vamos criar outra.
Agora posso definir a cena movendo o BOTanist por todo o palco.
Com isso, posso fazer meu amigo robô recriar minhas peças favoritas, como Robô e Julieta.
Vamos ver como aprimorar meu app com as novas APIs de cena do visionOS 26.
Vamos analisar as novas APIs de ciclo de vida para definir comportamentos ao abrir e fixar janelas em salas.
Vou apresentar novos aprimoramentos volumétricos que se adaptam ao ambiente ao redor das pessoas.
Vou adicionar um RemoteImmersiveSpace para ver uma prévia da minha cena no Apple Vision Pro usando um app para macOS.
Para apps do UIKit existentes, vamos finalizar adicionando essas incríveis experiências volumétricas e imersivas com as novas APIs de ponte de cena.
Vamos começar com abertura e fixação.
O visionOS 26 traz algumas APIs de ciclo de vida do macOS que serão úteis. Vamos abordar APIs para gerenciar a restauração de cenas e a abertura do app, além de uma API para criar janelas exclusivas.
No visionOS 26, agora é possível fixar janelas, volumes e até os novos widgets a salas específicas no ambiente físico do usuário.
Isso ajuda o conteúdo virtual a parecer mais presente no espaço. Essas janelas fixadas estão vinculadas à sala em que foram usadas.
Ao retornar a essa sala em outro momento, as janelas ganham vida novamente.
A restauração de cenas com fixação é incrível. Posso manter todas as minhas janelas abertas e acessá-las sempre que desejar.
Os usuários querem fixar todas as suas janelas em posições específicas e que o sistema as restaure. Portanto, prefira a restauração para a maioria das cenas. O sistema fará isso automaticamente para você.
Para algumas janelas, pode não fazer sentido fixar dessa forma.
Considere desativar a restauração de cena para elementos transitórios, como uma tela boas-vindas, interfaces contextuais, como uma janela associada ao estado de um app, ou ações únicas já concluídas, como uma solicitação de início de sessão.
Adicionei um modo imersivo ao app para as pessoas apreciarem nosso robô favorito em ação. A barra de ferramentas se destaca em uma janela separada, proporcionando acesso fácil aos controles do palco enquanto está imerso.
Os espaços imersivos não são restaurados.
Assim, ao retornar a essa sala, o espaço imersivo não será restaurado.
No entanto, se alguém tivesse fixado a janela de ferramentas no espaço, ela apareceria sozinha, sem nada para modificar.
Posso evitar esse estado inesperado adicionando o modificador restorationBehavior(.disabled) ao WindowGroup para desativar a restauração e a fixação da janela de ferramentas no espaço.
Agora, ao retornar a essa sala em um momento posterior, a janela extra não será restaurada.
Abrir o app exibe a primeira janela para um novo início.
No UIKit, você pode desativar a restauração para cenas da interface usando a nova API destructionConditions com a propriedade .systemDisconnection. Leia a documentação para saber mais.
Em alguns casos, seu app pode se beneficiar ao alterar dinamicamente em qual cena será iniciado.
Quero adicionar uma janela de boas-vindas na primeira vez que o app for aberto para receber os usuários antes da seleção do palco.
Para personalizar qual janela será exibida na abertura, baseado no estado do app, posso usar o modificador defaultLaunchBehavior.
Vou priorizar a janela de boas-vindas marcando-a como presented caso seja a primeira vez que o app é aberto.
Posso desativar esse valor assim que a janela aparecer, pois não será mais necessário exibi-la.
A função da janela de inicialização escolhida deve corresponder à propriedade preferred default scene session role no Application Scene Manifest do seu arquivo Info.plist.
Se eu definir a função padrão da sessão de cena como Window, somente cenas de janela regulares serão consideradas pelo sistema durante a inicialização do app.
Nesse caso, volumes serão ignorados, mesmo que eu tente priorizá-los usando o defaultLaunchBehavior. A cena desejada deve corresponder à função da sessão.
O modificador defaultLaunchBehavior tem mais um recurso que pode ser útil.
Falei que não quero que o painel de ferramentas retorne quando eu voltar para uma sala e como posso usar o restorationBehavior para resolver isso. Tenho um problema semelhante aqui.
Se eu sair do espaço imersivo pressionando a coroa e fechar a janela de ferramentas, essa janela reaparecerá ao iniciar o app novamente.
Isso nos deixa naquele mesmo estado inesperado que a restauração teria.
Em vez disso, quero retomar o app de um estado seguro, iniciando com uma janela de criação de palco.
Posso fazer isso adicionando o modificador defaultLaunchBehavior(.suppressed) à janela de ferramentas. Isso informa ao sistema para não restaurar essa janela ao reiniciar o app pela tela inicial.
Você deve preferir o uso do .suppressed defaultLaunchBehavior para cenas secundárias, evitando que os usuários fiquem presos em estados inesperados.
No UIKit, você pode obter o mesmo comportamento adicionando a opção userInitiatedDismissal às destructionConditions da UIScene.
O visionOS 26 também permite a criação de janelas únicas.
São janelas que não podem ser duplicadas. Apenas uma instância pode existir por vez.
Assim como no Mac, você declara essas janelas usando a API Window em vez de WindowGroup.
Use-as para evitar a duplicação de interfaces importantes, como uma janela de jogo ou de chamada de vídeo.
Ou use-as para fornecer funcionalidades suplementares que não requerem mais de uma instância.
Não preciso de mais de uma instância da janela de boas-vindas. Vou substituí-la por uma janela única.
Manterei o volume principal do palco como um WindowGroup para permitir a criação de múltiplos palcos simultaneamente.
Incrível. O ciclo de vida do meu app está mais eficiente. Personalizamos quais janelas devem ser exibidas ao serem fixadas no ambiente e durante a abertura do app. E garantimos que nossas janelas sejam únicas, quando necessário.
Há uma série de novos aprimoramentos para volumes no visionOS 26 que podem levar os volumes a profundidades ainda maiores.
Vou falar do novo recurso de encaixe de superfícies, os avanços em apresentações e a API Clipping Margins.
Vamos lá.
Novidade no visionOS 26: Agora é possível encaixar janelas e volumes ao ambiente físico do usuário. É só mover com cuidado a janela para perto da superfície. Para janelas restauráveis, é isso que as fixa no lugar para que sejam persistentes.
Encaixe a parte de trás das janelas em superfícies verticais, como uma parede. Também é possível encaixar a base dos volumes em superfícies horizontais, como o chão ou uma mesa.
E os widgets, que são novidade no visionOS 26, podem ser encaixados nos dois tipos.
Saiba como adicionar widgets ao app para visionOS em “Novidades em widgets”. Para janelas e volumes, obtenha informações sobre o evento de encaixe.
No meu app, posso encaixar o volume em uma mesa e ancorá-lo horizontalmente.
É um começo. Eu gostaria de fazer o palco parecer mais presente no meu espaço. Quero que o robô fique embaixo da mesa quando o volume estiver encaixado nela.
Podemos obter informações sobre o estado do encaixe usando a nova API SurfaceSnappingInfo.
A API fornece uma propriedade simples isSnapped para determinar o status geral de encaixe da nossa janela.
Para casos de uso mais avançados, podemos obter a classificação da superfície encaixada pelo ARKit. Esse nível de detalhamento requer permissão do usuário. Vou mostrar como.
Para ativar informações sobre a superfície encaixada, preciso definir a chave Application Wants Detailed Surface Info como YES, além de adicionar Privacy - World-Sensing Usage Description com uma descrição para que seja exibida ao solicitar permissão.
Essas duas chaves podem ser definidas no Info.plist do app.
Uma vez feito isso, posso partir para o código.
Aqui, obtenho a surfaceSnappingInfo do ambiente.
No onChange, verifico se a cena está encaixada. E verifico se tenho autorização para acessar a classificação da superfície de encaixe.
Verificar o authorizationStatus solicitará automaticamente permissão ao usuário, se necessário.
Quando estiver encaixado na mesa, quero ocultar a plataforma sob o palco. Estou usando uma variável de estado para acompanhar isso.
Com essas alterações, posso encaixar meu volume em uma mesa e o robô pode atuar com toda a emoção no meu ambiente. Ótimo!
Configurei para que, ao caminhar ao redor da mesa, as paredes no caminho sumam, permitindo que eu veja dentro do volume.
Fiz isso reagindo às mudanças no ponto de vista da cena usando o modificador onVolumeViewpointChange.
Saiba como o Owen adicionou isso ao BOTanist em “Detalhes sobre volumes e espaços imersivos” da WWDC24.
Quero que as pessoas possam posicionar novos adereços por todo o palco. Vou adicionar um popover na barra de ferramentas do volume com diferentes adereços para adicionar. Ótimo! Posso recriar A Tragédia do Rei Gear.
Antes, apresentações tinham suporte apenas em janelas.
No visionOS 2.4, foi adicionado suporte a apresentações aninhadas, possibilitando recursos como popovers exibidos em páginas ou menus de contexto exibidos em ornamentos.
Com o visionOS 26, as apresentações ganharam um conjunto novo de fontes. Você pode apresentar a partir de volumes, ornamentos dos volumes, anexos às RealityViews ou diretamente no RealityKit usando o PresentationComponent.
Para saber como usar apresentações no RealityKit com anexos e o PresentationComponent, confira “Melhores juntos: SwiftUI e RealityKit”. Isso não se limita a um subconjunto pequeno. Todos os tipos de apresentação estão disponíveis: menus, dicas de ferramentas, popovers, páginas, alertas e caixas de diálogo de confirmação.
Confira a documentação para aprender como criar essas apresentações com a SwiftUI.
Essas apresentações têm tratamentos visuais especiais para mantê-las visíveis mesmo quando ocultadas por conteúdo 3D.
Por padrão, a apresentação se mistura sutilmente com o conteúdo que a oculta.
Personalize isso para se destacar sobre o conteúdo que a oculta ou ficar oculto atrás dele.
Use as opções subtle, prominent ou none para personalizar isso.
Essas opções podem ser aplicadas às apresentações utilizando o modificador presentationBreakthroughEffect.
Para elementos que não são apresentações, obtenha o mesmo efeito usando o modificador breakthroughEffect.
Com as apresentações, posso adicionar a interface personalizada onde quiser. Vamos tentar adicionar mais.
Adicionei outro menu popover para alterar a decoração do palco. Com isso, posso transportar nosso amigo robô do antigo teatro para uma ilha tropical. Perfeito para A Tempestade!
Este cenário tem muito potencial. Acho que poderia ter um pouco mais de charme. Que tal uma cachoeira? E algumas nuvens tempestuosas.
Quero garantir que esses elementos não atrapalhem o centro da ação. Posso usar as novas Clipping Margins para isso.
Com Volumes, a nova API preferredWindowClippingMargins permite renderizar conteúdo fora dos limites da cena.
Este conteúdo não é interativo. Você deve usá-lo apenas para efeitos visuais decorativos.
Observe que esses limites podem não ser concedidos pelo sistema. Para levar isso em conta, leia as margens concedidas usando a variável de ambiente windowClippingMargins.
Vamos ver na prática.
Posso especificar as margens de recorte desejadas usando a API preferredWindowClippingMargins. Aqui, quero margens na parte inferior.
Converterei minha maxWaterfallHeight, que está em metros, para pontos multiplicando pelo fator pointsPerMeter que obtive do PhysicalMetric.
Leia as margens concedidas usando a variável de ambiente windowClippingMargins.
Com isso, posso dimensionar a cachoeira para renderizar dentro das margens.
Pegue o valor mínimo das margens e a altura da cachoeira para garantir a renderização do modelo completo da cachoeira, independentemente do que foi concedido.
E pronto. Ficou muito melhor. As nuvens adicionam uma atmosfera de tempestade, e a cachoeira é renderizada abaixo da base, sem deslocar o conteúdo para cima, mantendo o foco na ilha e no robô.
Espero que o BOTanist esteja bem lubrificado.
Com isso, nossa mais recente produção teatral parece ainda mais real. Com o encaixe na superfície e as margens de recorte, o conteúdo se adapta ao espaço físico. Com as apresentações, posso criar interfaces avançadas para montar a cena perfeita.
Vamos ver o que posso fazer para melhorar a experiência imersiva do meu app.
Espaços imersivos trazem as experiências espaciais ao seu redor. E o visionOS 26 traz ótimas novidades para fazer ainda mais com os espaços imersivos.
Vou mostrar um evento de recentralização do mundo, novas funcionalidades com estilos de imersão, o espaço imersivo remoto no macOS e avanços nos espaços imersivos baseados em Compositor para renderização com o Metal. Ao navegar no espaço, as pessoas podem pressionar a Digital Crown para recentralizar a experiência do app ao seu redor.
Se o app usa dados do ARKit, isso pode invalidar posições que você tenha armazenado para uso posterior.
Você pode escutar o evento de recentralização do mundo com o novo modificador de visualização onWorldRecenter para receber alertas.
Isso é muito útil para recalcular e armazenar posições com base no novo sistema de coordenadas.
O visionOS 26 também traz novas personalizações para os diferentes estilos de imersão disponíveis nos espaços imersivos.
O estilo de imersão progressiva é um ótimo jeito de apresentar parcialmente um espaço imersivo, mantendo as pessoas ancoradas no mundo real.
O conteúdo imersivo é apresentado dentro de um portal que pode ser redimensionado girando a Digital Crown.
Essa faixa de imersão pode ser personalizada no estilo de imersão progressiva.
No visionOS 26, você pode personalizar a proporção desse portal. Use a proporção paisagem existente ou a nova proporção retrato.
Considere usar a proporção retrato para experiências verticais, como ao levar seus jogos para iPhone para o Apple Vision Pro, ou para experiências com muito movimento, pois ter um ambiente estável em volta pode ajudar as pessoas a se sentirem mais confortáveis.
Especifique essa proporção como um parâmetro do estilo progressivo, assim como faz com o alcance de imersão.
Além do estilo progressivo, também há novas opções de personalização para espaços imersivos no estilo de imersão mista.
Ao definir o estilo de imersão como misto, o conteúdo do espaço imersivo se integra ao ambiente das pessoas.
Este é o estilo padrão no meu app.
No visionOS 26, o conteúdo do espaço imersivo pode se misturar com os ambientes do sistema. Isso significa que posso assistir à última produção do meu robô na lua.
Use o modificador de cena immersiveEnvironmentBehavior com o comportamento coexist para permitir isso.
Faça isso se o seu espaço imersivo misto não exigir que os usuários prestem atenção no ambiente real ao redor deles.
Adoro os objetos que adicionei ao app, mas eu sei que as pessoas vão querer importar seus próprios modelos ao criar cenas. Elas podem criar esses modelos em seus apps favoritos do macOS.
Para possibilitar o uso desses modelos no Mac, trouxe meu app para o macOS com as mesmas funcionalidades de criação de palco.
Para acelerar as iterações, seria incrível se as pessoas pudessem ver prévias de suas cenas como um espaço imersivo, sem precisar transferir o palco do macOS para o visionOS.
O visionOS 26 e o macOS Tahoe adicionaram o RemoteImmersiveSpaces para me ajudar a fazer isso. Com espaços imersivos remotos, use o CompositorLayer para renderizar conteúdo com o Metal usando o código e recursos do seu app no Mac, exibindo tudo como uma experiência imersiva no Vision Pro. Vamos ver isso funcionando no meu app.
No meu app para Mac, criei um espaço imersivo usando o Metal e adicionei um botão para ver a prévia no Apple Vision Pro. Ao clicar nele, devo selecionar um dispositivo Vision Pro de destino.
No meu Vision Pro, vou aceitar a solicitação de conexão.
Dessa forma, meu ImmersiveSpace é aberto e consigo ver os novos adereços que adicionei no último espectáculo do meu robô.
Fiz isso adicionando uma cena RemoteImmersiveSpace que contém minha CompositorLayer.
Isso será apresentado no visionOS, enquanto o restante das minhas cenas, como o palco principal, continuará sendo exibido no Mac.
Para saber como adaptar seu CompositorLayer e ARKitSession para um dispositivo Vision Pro remoto, confira “Novidades na renderização do Metal para apps imersivos”. Usar CompositorLayer no espaço imersivo remoto possibilita a criação de experiências imersivas com o Metal.
O CompositorLayer não é uma View, então não pode ser usado em contextos que exigem Views, como no meu ImmersiveContent.
Isso significa que variáveis de ambiente e modificadores de View não estavam disponíveis para o CompositorLayer.
O visionOS 26 adiciona um novo tipo de construtor CompositorContent, que permite usar todo o poder da SwiftUI com o CompositorLayer.
Agora você pode acessar variáveis de ambiente, adicionar modificadores ou usar variáveis de estado como faz com as views da SwiftUI.
O CompositorContent traz diversas variáveis de ambiente úteis, como scenePhase e openWindow, além de modificadores como onImmersionChange e onWorldRecenter.
Tudo isso torna o CompositorLayer mais robusto para uso em espaços imersivos remotos e em espaços imersivos locais executados no visionOS.
Atualizar meu app para usar CompositorContent foi uma ótima chance para revisitar alguns dos modificadores de Immersive Space disponíveis e ver como eles podem ser aplicados ao app.
Essas são as novidades sobre os espaços imersivos. Temos um evento de recentralização do mundo, novas personalizações para os estilos de imersão, espaços imersivos no Mac com o RemoteImmersiveSpace e o CompositorContent.
Meu app está incrível com todas essas funcionalidades. Quero adicionar algumas dessas experiências volumétricas incríveis a mais apps.
Alguns dos meus apps foram criados com o UIKit, que não oferece suporte nativo a volumes e espaços imersivos. Mas agora oferece, graças à ponte de cena.
A ponte de cena permite aprimorar os apps do UIKit, adicionando volumes e espaços imersivos criados com a SwiftUI.
Considere o Safari. Ele usa views da SwiftUI, mas é criado com o ciclo de vida do UIKit.
O Safari está fazendo um ótimo uso da ponte de cena para o novo recurso navegação espacial.
Vamos ver como podemos fazer isso também.
Para integrar uma cena da SwiftUI no meu app do UIKit, começo criando um tipo class que herda de UIHostingSceneDelegate.
Com esse tipo, posso declarar minhas cenas da SwiftUI na propriedade rootScene, usando a sintaxe conhecida do corpo da cena.
Posso solicitar essa cena como qualquer outra cena do UIKit, criando uma UISceneSessionActivationRequest.
Nesse caso, passo minha hostingDelegateClass, que declara minhas cenas e o ID da cena que quero abrir.
O que resta fazer é enviar essa solicitação com activateSceneSession.
Responda a eventos externos configurando sua hostingDelegateClass em configurationForConnecting.
Essa API vem com uma API correspondente do AppKit para integrar cenas da SwiftUI aos seus apps do AppKit para macOS.
Meu app está aproveitando ao máximo as novas funcionalidades do visionOS 26, como fixar no lugar, encaixar em superfícies e abrir remotamente usando um Mac. Estou animado para mostrar isso aos meus amigos.
Dê uma olhada nos seus apps. Audite suas cenas e garanta que elas aproveitam ao máximo o recurso de fixação no lugar e a restauração.
Adapte suas cenas ao ambiente das pessoas usando os recursos de encaixe e margens de recorte. E deixe o conteúdo do seu app para macOS imersivo no Vision Pro com espaços imersivos remotos.
A cortina se fecha, mas no nosso app, o show continua, uma cena de cada vez. Agradeço por assistir.
-
-
4:10 - Disabling restoration
// Disabling restoration WindowGroup("Tools", id: "tools") { ToolsView() } .restorationBehavior(.disabled)
-
4:36 - Disabling restoration in UIKit
// Disabling restoration windowScene.destructionConditions = [ .systemDisconnection ]
-
5:02 - Specifying launch window
// Specifying launch window @AppStorage("isFirstLaunch") private var isFirstLaunch = true var body: some Scene { WindowGroup("Stage Selection", id: "selection") { SelectionView() } WindowGroup("Welcome", id: "welcome") { WelcomeView() .onAppear { isFirstLaunch = false } } .defaultLaunchBehavior(isFirstLaunch ? .presented : .automatic) // ... }
-
6:39 - "suppressed" behavior
// "suppressed" behavior WindowGroup("Tools", id: "tools") { ToolsView() } .restorationBehavior(.disabled) .defaultLaunchBehavior(.suppressed)
-
7:44 - Unique window
// Unique window @AppStorage("isFirstLaunch") private var isFirstLaunch = true var body: some Scene { // ... Window("Welcome", id: "welcome") { WelcomeView() .onAppear { isFirstLaunch = false } } .defaultLaunchBehavior(isFirstLaunch ? .presented : .automatic) WindowGroup("Main Stage", id: "main") { StageView() } // ... }
-
10:24 - Surface snapping
// Surface snapping @Environment(\.surfaceSnappingInfo) private var snappingInfo @State private var hidePlatform = false var body: some View { RealityView { /* ... */ } .onChange(of: snappingInfo) { if snappingInfo.isSnapped && SurfaceSnappingInfo.authorizationStatus == .authorized { switch snappingInfo.classification { case .table: hidePlatform = true default: hidePlatform = false } } } }
-
14:41 - Clipping margins
// Clipping margins @Environment(\.windowClippingMargins) private var windowMargins @PhysicalMetric(from: .meters) private var pointsPerMeter = 1 var body: some View { RealityView { content in // ... waterfall = createWaterfallEntity() content.add(waterfall) } update: { content in waterfall.scale.y = Float(min( windowMargins.bottom / pointsPerMeter, maxWaterfallHeight)) // ... } .preferredWindowClippingMargins(.bottom, maxWaterfallHeight * pointsPerMeter) }
-
16:44 - World recenter
// World recenter var body: some View { RealityView { content in // ... } .onWorldRecenter { recomputePositions() } }
-
17:58 - Progressive immersion style
// Progressive immersion style @State private var selectedStyle: ImmersionStyle = .progressive var body: some Scene { ImmersiveSpace(id: "space") { ImmersiveView() } .immersionStyle( selection: $selectedStyle, in: .progressive(aspectRatio: .portrait)) }
-
18:37 - Mixed immersion style
// Mixed immersion style @State private var selectedStyle: ImmersionStyle = .progressive var body: some Scene { ImmersiveSpace(id: "space") { ImmersiveView() } .immersionStyle(selection: $selectedStyle, in: .mixed) .immersiveEnvironmentBehavior(.coexist) }
-
20:14 - Remote immersive space
// Remote immersive space // Presented on visionOS RemoteImmersiveSpace(id: "preview-space") { CompositorLayer(configuration: config) { /* ... */ } } // Presented on macOS WindowGroup("Main Stage", id: "main") { StageView() }
-
20:48 - 'CompositorLayer' is a 'CompositorContent'
// 'CompositorLayer' is a 'CompositorContent' struct ImmersiveContent: CompositorContent { @Environment(\.scenePhase) private var scenePhase var body: some CompositorContent { CompositorLayer { renderer in // ... } .onImmersionChange { oldImmersion, newImmersion in // ... } } }
-
23:00 - Scene bridging
// Scene bridging import UIKit import SwiftUI // Declare the scenes class MyHostingSceneDelegate: NSObject, UIHostingSceneDelegate { static var rootScene: some Scene { WindowGroup(id: "my-volume") { ContentView() } .windowStyle(.volumetric) } } // Create a request for the scene let requestWithId = UISceneSessionActivationRequest( hostingDelegateClass: MyHostingSceneDelegate.self, id: "my-volume")! // Send a request UIApplication.shared.activateSceneSession(for: requestWithId)
-
-
- 0:00 - Introdução
No visionOS 26, é possível usar as novas APIs para cenas, janelas, volumes e espaços imersivos, para criar apps mais dinâmicos e interativos. Os novos recursos incluem APIs de ciclo de vida, aprimoramentos volumétricos, "RemoteImmersiveSpace" para pré-visualização no Apple Vision Pro e APIs de ponte de cenas para apps do UIKit.
- 2:11 - Abertura e fixação
As novas APIs do visionOS 26 ajudam a gerenciar a abertura do app e a restauração de cenas, além de permitir a criação de experiências mais imersivas. As pessoas agora podem fixar janelas, volumes e widgets em espaços específicos, para que o conteúdo virtual se mantenha no ambiente físico. O sistema restaura automaticamente as janelas fixadas quando alguém retorna ao espaço associado. No entanto, você pode desativar a restauração para elementos transitórios, como as telas de boas-vindas ou uma interface dependente do contexto, usando o modificador "restorationBehavior(.disabled)". Você também pode personalizar o comportamento de abertura do app. Basta escolher dinamicamente a janela a ser exibida com base no estado do app com o modificador "defaultLaunchBehavior". Agora há suporte para janelas únicas, que não podem ser duplicadas, por meio da API Window para evitar a duplicação de interfaces importantes, como janelas de jogos ou chamadas de vídeo.
- 8:15 - Aprimoramentos para volumes
Os volumes também ganharam aprimoramentos importantes. Você pode utilizar a API "SurfaceSnappingInfo" para monitorar o momento em que as janelas e os volumes se encaixam em superfícies físicas, como paredes e mesas. Esse recurso oferece experiências mais imersivas, pois você pode ajustar a cena com base no estado do encaixe, como ocultar plataformas ou ajustar elementos de cena. Com a permissão do usuário, o ARKit pode fornecer ao app detalhes sobre a superfície ajustada. A atualização também expande os recursos de apresentação, permitindo que eles se originem de várias fontes dentro dos volumes, dos ornamentos e do RealityKit, com tratamentos visuais especiais para assegurar que permaneçam visíveis por trás do conteúdo 3D. Personalize o tratamento visual usando o modificador "presentationBreakthroughEffect". Além disso, use a nova API Clipping Margins para renderizar o conteúdo que não é interativo fora dos limites dos volumes das cenas, o que aprimorar os efeitos visuais, como cascatas ou nuvens, e assegura que o conteúdo principal permaneça focado e desobstruído. Leia sobre a variável de ambiente "windowClippingMargins" para saber se o sistema concedeu as margens.
- 15:58 - Espaço imersivo
Agora, você pode responder a um evento de recentralização do mundo, permitindo que as pessoas recalibrem a experiência do app em seu ambiente. Use o modificador de view "onWorldRecent" para observar esse evento e recalcular e armazenar as posições com base no novo sistema de coordenadas. O visionOS 26 também apresenta novas personalizações para os estilos de imersão. O estilo de imersão progressiva inclui proporção de retrato, o que permite experiências verticais e aumenta o conforto em conteúdo com movimentos intensos. O estilo de imersão mista agora permite que o conteúdo se integre perfeitamente aos ambientes do sistema, criando cenários ainda mais imersivos. Use o modificador de cena "immersiveEnvironmentBehavior" com o comportamento "coexist" para permitir a mesclagem. Você pode trazer seus apps para o macOS e pré-visualizar as cenas diretamente como espaços imersivos no Apple Vision Pro usando cenas "RemoteImmersiveSpace". Esse recurso permite iterações mais rápidas e facilita a colaboração. Use "CompositorLayer" para renderizar conteúdo com o Metal no Mac e exibi-lo no Apple Vision Pro. A apresentação do tipo de construtor "CompositorContent" permite que você use todo o poder do SwiftUI com "CompositorLayer", o que facilita a criação e o gerenciamento de experiências imersivas, tanto remotas quanto locais, o acesso às variáveis de ambiente, a adição de modificadores e o uso de variáveis de estado.
- 22:16 - Ponte de cena
A ponte de cenas no visionOS 26 permite adicionar volumes e espaços imersivos do SwiftUI a apps do UIKit. Ao estender o protocolo "UIHostingSceneDelegate", você pode criar cenas do SwiftUI e solicitá-las usando "UISceneSessionActivationRequest", o que permite que apps como o Safari implementem a Navegação Espacial e outros apps usem os novos recursos do visionOS.
- 24:01 - Próximas etapas
No app de exemplo, é possível criar cenas que são fixadas no local, encaixam-se nas superfícies e são abertas remotamente de um Mac. Analise seus próprios apps e garanta que eles aproveitem ao máximo esses novos recursos.