-
Comparte experiencias de visionOS con personas cercanas
Aprende a crear experiencias compartidas para personas que usan Vision Pro en la misma habitación. Te mostraremos cómo integrar SharePlay y aprovechar ARKit en tu app, presentaremos los flujos de uso compartido de ventanas para participantes cercanos y de FaceTime, y abarcaremos una nueva API diseñada para una colaboración fluida. Descubre las recomendaciones para hacer que tus funcionalidades colaborativas se destaquen, sean detectables y atractivas para los que se encuentran cerca.
Capítulos
- 0:00 - Introducción
- 0:56 - Más información sobre compartir con participantes cercanos
- 4:21 - Desarrolla actividades cercanas
- 5:35 - Permite compartir desde el menú Compartir
- 9:15 - Mejora para los participantes cercanos
- 10:37 - Coloca el contenido en relación con las personas
- 13:20 - Coordina la reproducción de medios compartidos
- 15:38 - Admite múltiples ventanas
- 16:50 - Comparte contenido anclado
Recursos
- worldAnchorSharingAvailability
- groupActivityAssociation(_:)
- init(originFromAnchorTransform:sharedWithNearbyParticipants:)
- Configure your visionOS app for sharing with people nearby
- AVPlaybackCoordinator
- Building a guessing game for visionOS
Videos relacionados
WWDC25
WWDC24
WWDC23
WWDC21
-
Buscar este video…
-
-
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 - Introducción
En visionOS 26, las personas que usan FaceTime pueden compartir apps y experiencias con personas cercanas que usen Apple Vision Pro. Esto significa que puedes ver, escuchar e interactuar de forma colaborativa en el mismo espacio físico utilizando SharePlay y ARKit.
- 0:56 - Más información sobre compartir con participantes cercanos
Una nueva función para compartir en visionOS 26 permite a las personas compartir apps fácilmente con personas cercanas tocando el botón a la derecha de la barra de la ventana. La ventana compartida aparece en la misma ubicación física para todos en la sala, lo que crea un contexto compartido donde las personas pueden discutir, señalar e interactuar con la app como si fuera tangible. El sistema garantiza una apariencia y tamaño consistentes para todos. Cualquiera puede mover o cambiar el tamaño de la ventana y estos cambios se reflejan para todos. Los usuarios remotos pueden unirse a la sesión compartida a través de FaceTime en visionOS, apareciendo como Personas espaciales dentro del espacio compartido, o como transmisiones de video junto a la ventana compartida si se unen desde iOS o macOS, lo que permite una colaboración fluida independientemente de la ubicación.
- 4:21 - Desarrolla actividades cercanas
Cualquier app SharePlay en visionOS se puede compartir con personas cercanas, sin realizar cambios. Sin embargo, hay nuevas funciones que puedes usar para mejorar las experiencias de SharePlay específicamente para las personas en el mismo espacio. Incluyen lo siguientes: hacer que las actividades de SharePlay sean detectables en el nuevo menú Compartir, detectar participantes cercanos, posicionar contenido según sus poses y sincronizar la reproducción de medios.
- 5:35 - Permite compartir desde el menú Compartir
En visionOS 26, puedes habilitar SharePlay en tus apps exponiendo una GroupActivity usando SwiftUI o API UIKit. Cuando está habilitado, las personas pueden iniciar SharePlay directamente desde el nuevo menú Compartir. Para las ventanas volumétricas, se debe exponer una actividad para que se pueda utilizar el menú Compartir. Para espacios inmersivos, donde el menú Compartir tradicional es inaccesible, puedes proporcionar un botón en la app para activar el menú Compartir. Como alternativa, ofrecer un modo no inmersivo permite a las personas compartir desde el menú Compartir y luego pasar al modo inmersivo una vez que todos se hayan unido a la sesión.
- 9:15 - Mejora para los participantes cercanos
Utilice la API SharePlay para identificar a los participantes cercanos en una sesión grupal. Al observar al publicador de participantes activos y verificar la propiedad 'isNearbyWithLocalParticipant', puede diferenciar entre usuarios locales y remotos. Este enfoque permite funciones como la formación automática de equipos de jugadores cercanos en juegos para jugar en persona contra participantes remotos que se unen a través de FaceTime.
- 10:37 - Coloca el contenido en relación con las personas
La nueva propiedad 'pose' en 'ParticipantState' le proporciona la ubicación espacial de los participantes en una sesión de app, lo que le permite colocar contenido de forma dinámica junto a cada persona. Esto mejora la experiencia de inmersión y permite funciones más avanzadas, como guiar a las personas a sus posiciones de asiento óptimas.
- 13:20 - Coordina la reproducción de medios compartidos
En visionOS 26, AVPlayer se mejoró para sincronizar la reproducción de audio y video para personas en el mismo espacio físico, solucionando problemas causados por retrasos en el audio y eco. Esta nueva función permite experiencias multimedia compartidas sin interrupciones, donde todos ven y escuchan el contenido simultáneamente. Puede utilizar 'AVPlaybackCoordinator' para lograr esta sincronización precisa.
- 15:38 - Admite múltiples ventanas
Al utilizar la nueva API SharePlay en visionOS 26, puede especificar qué 'WindowGroup' dentro de una app está asociado con SharePlay usando el modificador de vista 'groupActivityAssociation'. Este modificador de vista permite cambiar sin problemas entre contenidos compartidos, mejorando las experiencias dentro de apps de múltiples ventanas.
- 16:50 - Comparte contenido anclado
ARKit presenta anclajes mundiales compartidos en visionOS 26, lo que permite que las apps coloquen contenido virtual en ubicaciones físicas fijas que permanecen persistentes en todas las sesiones y para múltiples usuarios. Esta persistencia es particularmente útil para apps colaborativas, donde los objetos virtuales necesitan permanecer anclados en el mundo real. Puedes marcar los anclajes mundiales como compartidos durante las sesiones de SharePlay con el nuevo parámetro 'sharedWithNearbyParticipants', lo que permite que los participantes cercanos vean e interactúen con el mismo contenido virtual. Utilice la API 'worldAnchorSharingAvailability' para garantizar que el uso compartido esté disponible. Esta función se extiende más allá de SharePlay y permite que las apps comerciales utilicen anclajes compartidos con capas de red personalizadas. Los anclajes de mundos compartidos abren nuevas posibilidades para experiencias colaborativas, como pizarrones virtuales, juegos inmersivos y noches de películas compartidas, lo que hace que el contenido virtual se sienta más presente e interactivo en el mundo físico.