
-
Compartilhe experiências do visionOS com pessoas próximas
Saiba como criar experiências compartilhadas para pessoas que usam o Vision Pro no mesmo ambiente. Mostraremos como integrar o SharePlay e aproveitar o ARKit em seu app, apresentaremos os fluxos atualizados de compartilhamento de janelas para participantes próximos e via FaceTime e abordaremos a nova API projetada para colaboração contínua. Descubra as melhores práticas para fazer seus recursos colaborativos se destacarem, serem facilmente descobertos e promoverem o engajamento entre pessoas no mesmo espaço.
Capítulos
- 0:00 - Introdução
- 0:56 - Saber mais sobre o compartilhamento nas proximidades
- 4:21 - Criar atividades para pessoas próximas
- 5:35 - Permitir o compartilhamento pelo menu Share
- 9:15 - Melhorias para usuários próximos
- 10:37 - Posicionar o conteúdo em relação às pessoas
- 13:20 - Coordenar a reprodução de mídia compartilhada
- 15:38 - Compatibilidade com várias janelas
- 16:50 - Compartilhar conteúdo ancorado
Recursos
- AVPlaybackCoordinator
- Building a guessing game for visionOS
- Configure your visionOS app for sharing with people nearby
- groupActivityAssociation(_:)
- init(originFromAnchorTransform:sharedWithNearbyParticipants:)
- worldAnchorSharingAvailability
Vídeos relacionados
WWDC25
WWDC24
WWDC23
WWDC21
-
Buscar neste vídeo...
Olá! Meu nome é Connor, e sou engineer na equipe visionOS FaceTime. Vou apresentar um novo recurso que melhora o compartilhamento e a colaboração. No visionOS 26, você pode compartilhar apps e experiências com pessoas próximas. Você pode assistir, ouvir ou colaborar em seus apps favoritos no Vision Pro com outras pessoas ao seu redor. Neste vídeo, você vai aprender a projetar e criar apps para que sejam compartilhados com pessoas próximas. Vou começar com uma visão geral do recurso. Depois, vou mostrar como usar o SharePlay para criar experiências interativas para pessoas próximas. E você saberá como ancorar o conteúdo compartilhado ao espaço físico usando o ARKit e âncoras de mundo compartilhado. Primeiro, vou mostrar como funciona o compartilhamento com pessoas próximas no visionOS 26. Existe uma nova forma de compartilhar apps que é mais intuitiva e detectável. Cada janela tem um botão à direita da barra de janelas que abre um menu de compartilhamento. Lá, você pode selecionar pessoas próximas em uma lista e começar a compartilhar com elas. Quando alguém compartilha, a janela aparece para todos exatamente no ponto em que aquela pessoa a colocou na sala. A barra da janela fica verde, informando que a janela é compartilhada com todos no mesmo lugar. Essa experiência cria um contexto compartilhado, e é isso que torna esse recurso tão mágico. Como as janelas compartilhadas estão no mesmo lugar para todos, é possível conversar, apontar e interagir com o app como se estivesse fisicamente no ambiente.
O sistema garante que todos vejam que o app aparece no mesmo lugar com o mesmo tamanho.
Assim que aparece, qualquer um pode mover a janela compartilhada, e ela se move para todos, ajustando-se à direção do grupo.
Você pode redimensionar o app em conjunto ou encaixá-lo no ambiente compartilhado. Se alguém pressionar a Digital Crown para centralizar, o app volta para um bom lugar para todos. E, se alguém apontar para algo ou mover o cursor pela janela, o conteúdo desaparece para garantir que a pessoa permaneça visível.
Esse contexto compartilhado não é apenas para pessoas na mesma sala. O mais interessante do compartilhamento com pessoas próximas é a integração com o FaceTime. Ao compartilhar um app com pessoas próximas, você pode iniciar o FaceTime para convidar, interagir e colaborar com pessoas que estão longe.
Se elas entrarem no visionOS, aparecerão no espaço como uma Persona espacial. Isso aumenta a sensação de presença e faz parecer que todos estão no mesmo espaço juntos.
Quando alguém entra como uma Persona espacial, o sistema encontra o local ideal para colocá-lo junto das pessoas próximas.
O local em que o sistema decide colocar Personas espaciais depende do tipo de janela compartilhada. Por exemplo, se alguém entrar durante o compartilhamento de janela volumétrica, será posicionado nos espaços ao redor do volume. Isso gera um layout ideal tanto para participantes próximos quanto remotos. As pessoas também podem entrar em outra plataforma compatível com FaceTime, como iOS ou macOS.
Quando entram, o vídeo é mostrado ao lado da janela compartilhada. Assim, é fácil interagir com o app e conversar com outras pessoas. Por padrão, compartilhar uma janela inicia uma experiência somente de visualização que funciona mesmo sem o app. Não é necessária a adoção de apps. Para criar uma experiência interativa para compartilhamento no mesmo espaço, adote o SharePlay. Ele é parte fundamental da colaboração no FaceTime entre plataformas da Apple. Os apps com SharePlay permitem interação em tempo real para que as pessoas assistam a filmes, ouçam músicas, joguem, colaborem e mais. Apps com SharePlay no visionOS podem ser compartilhados com pessoas próximas, sem precisar de alterações. Há novos recursos interessantes no SharePlay que permitem que você projete e aprimore seu app especificamente para pessoas no mesmo espaço.
Se você nunca usou o SharePlay, assista aos vídeos “Criar experiências personalizadas com atividades em grupo” e “Criar experiências espaciais do SharePlay”. Vou expandir os conceitos apresentados nestes vídeos. Vou abordar tópicos nesta seção que ajudarão você a criar uma ótima experiência compartilhada. Primeiro, vou explicar como facilitar o início do compartilhamento expondo uma atividade do SharePlay no menu Share. Depois, você aprenderá a melhorar a experiência para pessoas nas redondezas, detectando participantes próximos e posicionando o conteúdo em relação a elas. Em seguida, vou mostrar um exemplo de reprodução de mídia compartilhada usando o AVPlayer para sincronizar vídeo e áudio. Por fim, para apps com várias janelas, vou orientar na escolha de qual associar ao SharePlay. Para começar, disponibilize sua atividade do SharePlay no menu Share. Com o novo menu Share no visionOS 26, ficou mais fácil compartilhar apps. Para isso, exponha uma GroupActivity ao menu Share com a API SwiftUI ou UIKit. Quando as pessoas tocam no botão Share, podem ativar essa GroupActivity e iniciar o SharePlay.
Para janelas volumétricas, o menu Share só funciona se oapp expor uma atividade. Por exemplo, quero criar uma experiência com o SharePlay para jogar jogos de tabuleiro com os amigos quando os visito pessoalmente.
Para começar, criei uma atividade em grupo para meu app de jogo de tabuleiro, chamada BoardGameActivity. GroupActivities é o framework que viabiliza o SharePlay, e definir uma GroupActivity é o primeiro passo para criar uma experiência compartilhada. Também configurei a cena principal do jogo com um WindowGroup volumétrico que mostra a visualização do jogo. É um app da SwiftUI, então para expor a BoardGameActivity ao menu Share, preciso adicionar um ShareLink à hierarquia da view. Passo a BoardGameActivity para começar e a marco como oculta porque não quero que ela afete a interface do meu app. Quando alguém compartilha uma atividade exposta pelo menu Share, ela é ativada e cria uma GroupSession. Isso funciona da mesma forma que chamar o método activate() manualmente em uma GroupActivity.
Posso recuperar a GroupSession criado automaticamente observando as sessões na BoardGameActivity. Então, para realmente iniciar o SharePlay, configuro e entro na sessão criada.
Agora as pessoas podem compartilhar meu app direto pelo menu. Isso abrange apps volumétricos ou com janelas, mas, se a sua experiência compartilhada usar um espaço imersivo, você precisará garantir que o menu Share esteja sempre disponível. Por exemplo, quero transformar minha experiência com janelas em uma mesa de jogo de tabuleiro em tamanho real colocada no chão da minha sala, com objetos 3D temáticos ao meu redor.
Para isso, preciso colocá-lo em um ImmersiveSpace. Mas agora tenho um problema. Como as pessoas compartilham meu app se não há barra de janela em espaço imersivo? Para resolver isso, vou mostrar meu próprio botão para que possam compartilhar sem precisar usar uma janela ou volume. Quando alguém pressiona esse botão, meu app chama o método activate na BoardGameActivity. Novidade no visionOS 26, ativar uma atividade aciona automaticamente o menu Share, mesmo fora do FaceTime. Isso funciona com janelas e espaços imersivos. Assim, você pode selecionar pessoas próximas ou criar uma sessão do Facetime para compartilhar direto do app.
Uma forma ainda melhor de resolver isso é continuar oferecendo um modo não imersivo.
Assim, as pessoas podem compartilhar usando o menu na janela não imersiva e depois mudar para imersiva quando todos tiverem entrado.
Assim como antes, preciso entrar na GroupSession para iniciar o SharePlay. Lembrando, é preciso o coordenador do sistema na sessão e definir e definir supportsGroupImmersiveSpace como true para compartilhar o espaço imersivo no mesmo local para todos. Depois de garantir que seu app possa ser compartilhado, pense nas melhores formas de melhorar ou personalizar a experiência para pessoas no mesmo espaço. Para isso, verifique se há participantes próximos com a nova API SharePlay. Isso é muito útil se as pessoas iniciarem o FaceTime enquanto compartilham por perto. No meu app, quero permitir que pessoas no mesmo espaço disputem com qualquer pessoa que entrar pelo FaceTime. Vou verificar quais participantes estão fisicamente juntos e sugerir as pessoas próximas como colegas de equipe.
Para isso, preciso saber quais participantes estão próximos e quais estão remotos.
Começo com a GroupSession na qual entrei mais cedo. Para obter informações sobre os participantes da sessão, observo o editor activeParticipants na GroupSession. Nesse estado, verifico a nova propriedade isNearbyWithLocalParticipant. Ela será true se o participante estiver perto. Excluo o participante local desta verificação, pois só quero saber quais outros estão por perto.
Com isso, posso fazer com que os participantes próximos estejam no mesmo time e possam jogar contra as pessoas distantes. Para criar uma boa experiência para as pessoas no mesmo espaço, considere também onde as pessoas próximas estão localizadas em relação ao app caso queira colocar o conteúdo ao lado ou voltado para elas. A nova API SharePlay informa onde as pessoas estão quando o compartilhamento começa. Aqui está um exemplo. Presumi até agora que as pessoas próximas compartilham o app quando estão na frente dele. Mas elas podem estar em qualquer lugar do espaço quando o app é compartilhado. Apps compartilham no local e não se movem entre as pessoas ao compartilhar. É importante saber isso para apps de espaço imersivo, pois você pode querer colocar o conteúdo perto de onde os participantes estão, não apenas na origem do espaço imersivo. Neste exemplo, quero mostrar um placar para cada pessoa próxima no meu app de jogo de tabuleiro imersivo.
Para isso, primeiro teria que saber onde os participantes estão em relação à minha cena do ImmersiveSpace. Você pode obter essas informações na propriedade Pose em ParticipantState.
Novamente, começo com a sessão em grupo na qual entrei antes. Para obter informações sobre o localParticipant, acesso systemCoordinator na sessão e observo a sequência assíncrona do localParticipantState no systemCoordinator. Em seguida, posso ler a nova propriedade Pose nesse estado, que diz onde o participante local está em relação à cena do ImmersiveSpace.
Pose não rastreia a localização de um participante em tempo real, mas atualiza após eventos importantes, como quando o compartilhamento começa ou alguém pressiona a Digital Crown para centralizar. Depois de entender a posição do participante local, calculo onde colocar o placar relativo a cada participante para que apareça bem ao lado deles.
Além da posição real de um participante, você pode obter sua posição de assento, um local físico fixo em relação ao app. Para saber mais sobre posição de assento e personalização de arranjos de assentos com modelos espaciais, confira “Personalizar modelos de Persona espacial no SharePlay”.
Nesse vídeo, posso ver como usar as posições de assento para aprimorar ainda mais o app e solicitar que as pessoas se movam para seus assentos reais ao redor da mesa. Isso informa a elas o melhor lugar para aproveitar o conteúdo do app. Se o seu app já usa posições de assento, considere migrar para posições de participante se quiser colocar o conteúdo onde as pessoas já estão no espaço.
Se a experiência envolver vídeo ou áudio compartilhado, o AVPlayer foi atualizado no visionOS 26 para coordenar a reprodução para pessoas no mesmo espaço. Trazer mídia compartilhada para o mesmo espaço cria complexidades, especificamente porque as pessoas estão fisicamente próximas. Ao compartilhar mídia com pessoas próximas, você pode ouvir o áudio vindo dos dispositivos de outros participantes. Isso torna até mesmo pequenos atrasos de áudio perceptíveis e inconvenientes para eles. Por isso, é fundamental que todos vejam e ouçam a mesma coisa ao mesmo tempo. Novidade no visionOS 26, o AVPlayer e AVPlaybackCoordinator sincronizam a reprodução de áudio e vídeo para pessoas no mesmo espaço.
Para demonstrar isso, quero adicionar um novo recurso de vídeo instrutivo. ao meu app. As pessoas podem abrir um vídeo compartilhado para aprender a jogar. Todos devem ver e ouvir esse vídeo sendo reproduzido ao mesmo tempo. Quando o vídeo terminar, os jogadores podem voltar e aplicar o que aprenderam para jogar.
No meu app, vou criar um AVPlaybackCoordinator e configurar com a GroupSession. Assim, a reprodução será sincronizada com precisão para pessoas no mesmo espaço. Isso significa que todos podem ver e ouvir a reprodução do vídeo instrucional ao mesmo tempo, sem eco ou atraso.
Para saber como configurar um AVPlaybackCoordinator para o SharePlay, confira “Coordenar experiências de mídia com atividades em grupo”. Se estiver começando a criar apps de mídia para visionOS, confira também “Criar uma ótima experiência de reprodução espacial”. Agora o áudio e o vídeo estão sincronizados no meu app. Mas a adição da janela de vídeo instrucional criou outro problema que preciso resolver. Meu app agora tem vários WindowGroups abertos ao mesmo tempo: a janela volumétrica do jogo de tabuleiro e a janela do vídeo instrucional. Para resolver isso, tenho que definir qual delas será compartilhada enquanto ambas estiverem abertas. Com a nova API SharePlay no visionOS 26, posso usar um modificador de view para escolher qual WindowGroup associar ao SharePlay. Isso permite um novo nível de controle para apps que permitem várias janelas.
Aqui tenho o WindowGroup do jogo de tabuleiro do meu app. Para adicionar o vídeo de instrução, criarei outro WindowGroup para hospedar a view do vídeo. Depois adiciono o novo modificador .groupActivityAssociation a uma view no WindowGroup.
Ao passar primary para .groupActivityAssociation, estou dizendo ao sistema que essa janela deve ser compartilhada enquanto estiver aberta.
Agora, o app pode mudar para um vídeo compartilhado perfeitamente sincronizado e voltar para o jogo quando todos estiverem prontos.
Quero muito ver como você vai usar essas melhorias para criar experiências em grupo incríveis. Este é o melhor momento para adotar o SharePlay. Group Activities não é o único framework com novas APIs para compartilhamento nas proximidades. O ARKit também tem novidades no visionOS 26: É possível ancorar conteúdo compartilhado no mesmo local físico usando âncoras de mundo compartilhado. Antes disso, vou rever alguns conceitos importantes para espaços imersivos e âncoras padrão de mundo. Se o app usar ImmersiveSpace, você poderá posicionar conteúdo em qualquer lugar do ambiente da pessoa. Isso é ótimo para apresentar algo ao redor de alguém, mas um ImmersiveSpace não fica necessariamente no mesmo local físico. Por exemplo, se alguém se move e pressiona a Digital Crown para recentralizar, todo o espaço imersivo se ajusta. Isso funciona para muitos casos de uso, mas pode ser um problema se quiser fixar o conteúdo no espaço físico ao longo do tempo. Com as âncoras de mundo, o ARKit oferece uma solução para esse problema. Com as âncoras de mundo, os apps podem colocar conteúdo em locais físicos fixos. O sistema garante que esse conteúdo permaneça sempre ancorado no mesmo local ao longo do tempo, mesmo ao pressionar a Digital Crown para centralizar.
Imagine um app em que as pessoas podem colocar móveis virtuais no mundo real para ajudá-las a criar uma planta baixa ou experimentar novos designs. Nesse app, é importante que os móveis permaneçam no mesmo local físico e não se desloquem. Para isso, preciso colocar o conteúdo em um local específico em relação à origem do espaço imersivo e depois usar uma âncora de mundo para garantir que ele permaneça. Configurei com ARKitSession e WorldTrackingProvider e executei o WorldTrackingProvider. Para adicionar uma nova âncora ao app, vou criar uma WorldAnchor em uma transformação para os móveis no ImmersiveSpace e vou adicioná-la ao WorldTrackingProvider. E vejo se há atualizações na sequência anchorUpdates do WorldTrackingProvider, que será chamada quando minha nova âncora for adicionada. Então posso colocar meu modelo de móveis sob a âncora, e pronto!
Com apps compartilhados no mesmo espaço físico, as âncoras de mundo ganham ainda mais importância. Ao compartilhar com alguém próximo, o ambiente faz parte do contexto compartilhado. As âncoras de mundo possibilitam aproveitar o espaço como contexto compartilhado. Para fixar o conteúdo em um local físico durante o compartilhamento, os apps devem usar a nova API para marcar âncoras como compartilhadas. Durante uma sessão do SharePlay, essa API permite criar uma âncora de mundo, que é compartilhada automaticamente apenas com participantes próximos. As âncoras compartilhadas só podem ser criadas com o SharePlay ativo e não são mantidas após o fim da sessão, diferentemente das âncoras comuns.
Vou adotar isso no meu app de planejamento de móveis. Se alguém adicionar um móvel ao ambiente, quero que todos os participantes próximos vejam esses móveis. Assim, vai parecer que estamos projetando um ambiente de forma colaborativa. Antes vou ver se âncoras de mundo compartilhado estão disponíveis antes de tentar criar uma. Vou observar o newWorldAnchorSharingAvailability no WorldTrackingProvider. Quando está disponível, o app é compartilhado ativamente com as pessoas próximas e posso criar uma âncora de mundo compartilhado.
Agora, criar uma âncora de mundo compartilhado será semelhante a criar uma âncora comum. Para a pessoa adicionando móveis, passo sharedWithNearbyParticipants como true ao criar o WorldAnchor. Todos os WorldTrackingProviders dos participantes próximos recebem a nova âncora compartilhada em anchorUpdates, com o mesmo identificador em todos os dispositivos. Você pode ler e sincronizar esse identificador para garantir que o app saiba qual conteúdo associar à âncora em cada dispositivo.
As âncoras de mundo compartilhado podem ser usadas em apps corporativos via rede própria, sem depender do SharePlay. Ao criar um app espacial corporativo que deseja compartilhar com pessoas próximas, confira “Explorar as melhorias no seu app espacial corporativo”.
Ao compartilhar com pessoas próximas, todos desfrutam do mesmo conteúdo. Com as âncoras de mundo compartilhado, você cria experiências que aproveitam o espaço comum.
Após assistir a este vídeo, pense em como oferecer experiências interativas compartilhadas em seu app com o SharePlay. Como as pessoas podem interagir com o conteúdo juntas? Depois de adotar o SharePlay, garanta que as pessoas possam compartilhar o app facilmente implementando o menu Share. Esta é a sua chance de destacar sua experiência compartilhada para que seja detectável na interface do sistema. Depois pense em como projetar sua experiência para pessoas próximas e distantes em qualquer plataforma compatível. Lembre-se, é possível compartilhar com pessoas próximas e distantes. Agora seu app pode conectar pessoas na mesma sala com outras em todo o mundo, então pense em todas essas possibilidades. Por fim, crie experiências que aproveitem o espaço físico. Use âncoras de mundo para tornar seu conteúdo virtual mais presente e interativo dentro do ambiente real de alguém. As possibilidades são infinitas para combinar tudo isso. Faça sessões colaborativas em um quadro branco na sua parede real, jogue games imersivos ou transforme seu espaço em um cinema para uma noite de filme com amigos. Poder compartilhar experiências com quem está perto é um modo poderoso de interagir e colaborar com as pessoas. Crie experiências que façam as pessoas se sentirem mais conectadas quando estiverem juntas.
-
-
6:21 - Expose an activity with GroupActivities and SwiftUI
// Expose an activity with GroupActivities and SwiftUI import SwiftUI import GroupActivities struct BoardGameActivity: GroupActivity, Transferable { var metadata: GroupActivityMetadata = { var metadata = GroupActivityMetadata() metadata.title = "Play Together" return metadata }() } struct BoardGameApp: App { var body: some Scene { WindowGroup { BoardGameView() ShareLink(item: BoardGameActivity(), preview: SharePreview("Play Together")) .hidden() } .windowStyle(.volumetric) } } struct BoardGameView: View { var body: some View { // Board game content } }
-
7:14 - Join a GroupSession with GroupActivities
// Join a GroupSession with GroupActivities func observeSessions() async { // Sessions are created automatically when the activity is activated for await session in BoardGameActivity.sessions() { // Additional configuration and setup // Join SharePlay session.join() } }
-
8:57 - Join and configure a GroupSession with GroupActivities
// Join a GroupSession with GroupActivities func observeSessions() async { // Sessions are created automatically when the activity is activated for await session in BoardGameActivity.sessions() { // Additional configuration and setup guard let systemCoordinator = await session.systemCoordinator else { continue } systemCoordinator.configuration.supportsGroupImmersiveSpace = true // Join SharePlay session.join() } }
-
9:59 - Check for nearby participants with GroupActivities
// Check for nearby participants with GroupActivities func observeParticipants(session: GroupSession<BoardGameActivity>) async { for await activeParticipants in session.$activeParticipants.values { let nearbyParticipants = activeParticipants.filter { $0.isNearbyWithLocalParticipant && $0 != session.localParticipant } } }
-
11:42 - Observe local participant pose with GroupActivities
// Observe local participant pose with GroupActivities func observeLocalParticipantState(session: GroupSession<BoardGameActivity>) async { guard let systemCoordinator = await session.systemCoordinator else { return } for await localParticipantState in systemCoordinator.localParticipantStates { let localParticipantPose = localParticipantState.pose // Place presented content relative to the local participant pose } }
-
15:54 - Associate a specific window with GroupActivities and SwiftUI
// Associate a specific window with GroupActivities and SwiftUI import SwiftUI import GroupActivities struct BoardGameApp: App { var body: some Scene { WindowGroup { BoardGameView() ShareLink(item: BoardGameActivity(), preview: SharePreview("Play Together")) .hidden() } .windowStyle(.volumetric) WindowGroup(id: "InstructionalVideo") { InstructionalVideoView() .groupActivityAssociation(.primary("InstructionalVideo")) } } } struct BoardGameView: View { var body: some View { // Board game content } } struct InstructionalVideoView: View { var body: some View { // Video content } }
-
18:27 - Create a world anchor with ARKit
// Create a world anchor with ARKit import ARKit class AnchorController { func setUp(session: ARKitSession, provider: WorldTrackingProvider) async throws { try await session.run([provider]) } func createAnchor(at transform: simd_float4x4, provider: WorldTrackingProvider) async throws { let anchor = WorldAnchor(originFromAnchorTransform: transform) try await provider.addAnchor(anchor) } func observeWorldTracking(provider: WorldTrackingProvider) async { for await update in provider.anchorUpdates { switch update.event { case .added, .updated, .removed: // Add, update, or remove furniture break } } } }
-
20:02 - Observe sharing availability with ARKit
// Observe sharing availability with ARKit func observeSharingAvailability(provider: WorldTrackingProvider) async { for await sharingAvailability in provider.worldAnchorSharingAvailability { if sharingAvailability == .available { // Store availability to check when creating a new shared world anchor } } }
-
20:24 - Create a shared world anchor with ARKit
// Create a shared world anchor with ARKit import ARKit class SharedAnchorController { func setUp(session: ARKitSession, provider: WorldTrackingProvider) async throws { try await session.run([provider]) } func createAnchor(at transform: simd_float4x4, provider: WorldTrackingProvider) async throws { let anchor = WorldAnchor(originFromAnchorTransform: transform, sharedWithNearbyParticipants: true) try await provider.addAnchor(anchor) } func observeWorldTracking(provider: WorldTrackingProvider) async { for await update in provider.anchorUpdates { switch update.event { case .added, .updated, .removed: // Add, update, or remove furniture. Updates with shared anchors from others! let anchorIdentifier = update.anchor.id } } } }
-
-
- 0:00 - Introdução
No visionOS 26, as pessoas que usam o FaceTime podem compartilhar apps e experiências com pessoas próximas usando Apple Vision Pro. Isso significa que você pode visualizar, ouvir e interagir de forma colaborativa no mesmo espaço físico usando SharePlay e ARKit.
- 0:56 - Saber mais sobre o compartilhamento nas proximidades
Um novo recurso de compartilhamento no visionOS 26 permite que as pessoas compartilhem facilmente apps com pessoas próximas tocando no botão à direita da barra de janelas. A janela compartilhada aparece no mesmo local físico para todos na sala, criando um contexto compartilhado onde as pessoas podem discutir, apontar e interagir com o app como se fosse tangível. O sistema garante aparência e tamanho consistentes para todos. Qualquer pessoa pode mover ou redimensionar a janela, e essas alterações são refletidas para todos. Usuários remotos entram na sessão de compartilhamento via FaceTime no visionOS como Personas espaciais no espaço compartilhado ou feeds de vídeo ao lado da janela compartilhada se entrarem pelo iOS ou macOS, permitindo colaboração integrada em qualquer lugar.
- 4:21 - Criar atividades para pessoas próximas
Apps SharePlay no visionOS existentes podem ser compartilhados com pessoas próximas, sem precisar de alterações. No entanto, existem novos recursos que podem ser usados para aprimorar as experiências no SharePlay para pessoas que estão no mesmo espaço. Isso inclui: tornar atividades do SharePlay detectáveis no novo menu Compartilhar, detectar participantes próximos, posicionar o conteúdo com base nas posições e sincronizar a reprodução de mídia.
- 5:35 - Permitir o compartilhamento pelo menu Share
No visionOS 26, você pode ativar o SharePlay nos seus apps expondo um GroupActivity usando SwiftUI ou UIKit API. Quando ativado, as pessoas podem iniciar o SharePlay diretamente pelo novo menu Compartilhar. Para janelas volumétricas, uma atividade deve ser exposta para que o menu Compartilhar seja utilizável. Para espaços imersivos, onde o menu tradicional Compartilhar está inacessível, você pode fornecer um botão no app para ativar o menu Compartilhar. Como alternativa, oferecer um modo não imersivo permite que as pessoas compartilhem pelo menu Compartilhar e façam a transição para o modo imersivo assim que todos entrarem na sessão.
- 9:15 - Melhorias para usuários próximos
Use a API SharePlay para identificar participantes próximos em um GroupSession. Observando o editor de participantes ativos e verificando a propriedade "isNearbyWithLocalParticipant", você pode diferenciar entre usuários locais e remotos. Essa abordagem permite recursos como a união automática de jogadores próximos em jogos para jogar presencialmente contra participantes remotos que entram pelo FaceTime.
- 10:37 - Posicionar o conteúdo em relação às pessoas
A nova propriedade "pose" em "ParticipantState" fornece a localização espacial dos participantes em uma sessão de app, permitindo que você coloque conteúdo dinamicamente ao lado de cada pessoa. Isso aprimora a experiência imersiva e permite recursos mais avançados, como orientar as pessoas para suas posições ideais de assento.
- 13:20 - Coordenar a reprodução de mídia compartilhada
No visionOS 26, o AVPlayer foi aprimorado para sincronizar a reprodução de áudio e vídeo para pessoas no mesmo espaço físico, resolvendo problemas causados por atrasos e eco de áudio. Esse novo recurso permite experiências perfeitas de mídia compartilhadas, onde todos veem e ouvem o conteúdo simultaneamente. Você pode utilizar "AVPlaybackCoordinator" para alcançar essa sincronização precisa.
- 15:38 - Compatibilidade com várias janelas
Usando a nova API SharePlay no visionOS 26, você pode especificar qual "WindowGroup" em um app está associado ao SharePlay usando o modificador de visualização "groupActivityAssociation". Esse modificador de visualização permite alternar automaticamente entre conteúdos compartilhados, melhorando as experiências em apps com várias janelas.
- 16:50 - Compartilhar conteúdo ancorado
O ARKit apresenta âncoras de mundo compartilhado no visionOS 26, permitindo que os apps coloquem conteúdo virtual em locais físicos fixos que permanecem persistentes em sessões e para vários usuários. Essa persistência é particularmente útil para apps colaborativos, onde objetos virtuais precisam permanecer ancorados no mundo real. Você pode marcar âncoras de mundo como compartilhadas durante sessões do SharePlay com o novo parâmetro "sharedWithNearbyParticipants", permitindo que participantes próximos vejam e interajam com o mesmo conteúdo virtual. Use a API "worldAnchorSharingAvailability" para garantir que o compartilhamento esteja disponível. Esse recurso vai além do SharePlay, permitindo que os apps de negócios utilizem âncoras compartilhadas com camadas de rede personalizadas. As âncoras de mundo compartilhado abrem novas possibilidades para experiências colaborativas, como quadros brancos virtuais, jogos imersivos e noites de cinema compartilhadas, tornando o conteúdo virtual mais presente e interativo no mundo físico.