
-
Partagez des expériences visionOS avec des personnes à proximité
Découvrez comment créer des expériences partagées pour les personnes portant le Vision Pro dans la même pièce. Nous allons vous montrer comment intégrer SharePlay et exploiter ARKit dans votre app, présenter les nouveaux flux de partage de fenêtre pour les participants à proximité et connectés via FaceTime, et vous faire découvrir une nouvelle API conçue pour une collaboration fluide. Découvrez les meilleures pratiques pour rendre vos fonctionnalités collaboratives visibles, faciles à localiser et conçues pour captiver les utilisateurs réunis dans un même espace.
Chapitres
- 0:00 - Introduction
- 0:56 - En savoir plus sur le partage à proximité
- 4:21 - Créer des activités à proximité
- 5:35 - Autoriser le partage à partir du menu Partager
- 9:15 - Améliorer pour les personnes à proximité
- 10:37 - Placez le contenu par rapport aux personnes
- 13:20 - Coordonner la lecture multimédia partagée
- 15:38 - Prise en charge de plusieurs fenêtres
- 16:50 - Partager du contenu ancré
Ressources
- AVPlaybackCoordinator
- Building a guessing game for visionOS
- Configure your visionOS app for sharing with people nearby
- groupActivityAssociation(_:)
- init(originFromAnchorTransform:sharedWithNearbyParticipants:)
- worldAnchorSharingAvailability
Vidéos connexes
WWDC25
WWDC24
WWDC23
WWDC21
-
Rechercher dans cette vidéo…
Bonjour, je m’appelle Connor et je suis ingénieur dans l’équipe visionOS FaceTime. Je suis ravi de vous présenter une nouvelle fonctionnalité qui rend le partage et la collaboration plus puissants que jamais. Dans visionOS 26, vous pouvez partager des apps et des expériences avec des personnes proches dans un même espace. Cela vous permet de regarder, d’écouter ou de collaborer dans vos apps préférées sur Vision Pro avec ceux qui vous entourent. Cette vidéo vous apprendra à concevoir et à créer des apps destinées à être partagées avec les personnes autour de vous. Je vais commencer par présenter cette fonctionnalité, puis je vous montrerai comment utiliser SharePlay pour créer des expériences interactives dans un même espace. Enfin, vous découvrirez comment ancrer du contenu partagé dans l’espace physique à l’aide d’ARKit et des ancres spatiales partagées. Je vais d’abord vous montrer comment fonctionne le partage avec des personnes proches dans visionOS 26. Il existe une toute nouvelle façon de partager des apps, plus intuitive et plus facile à découvrir que jamais. Chaque fenêtre comporte un bouton à droite de sa barre, qui ouvre un menu de partage lorsqu’on le touche. Vous pouvez choisir dans une liste de personnes situées à proximité et commencer à partager facilement. Lorsqu’un utilisateur partage, la fenêtre s’affiche pour tous à l’endroit exact où elle a été partagée. La barre de fenêtre devient verte pour indiquer que la fenêtre est partagée avec toutes les personnes présentes. Cette expérience crée un contexte partagé, et c’est ce qui rend le partage dans le même espace si magique. Comme tout le monde voit les fenêtres partagées au même endroit, vous pouvez discuter, pointer et interagir avec l’app comme si elle était vraiment là.
Le système garantit que tout le monde voit l’app au même endroit et avec la même taille.
Une fois la fenêtre partagée affichée, n’importe qui peut la déplacer et elle se déplace pour tous, en s’orientant naturellement vers le groupe.
Vous pouvez même redimensionner l’app ensemble ou l’ajuster à votre environnement commun. Si quelqu’un maintient la Digital Crown pour recentrer, l’app revient à un emplacement adapté à tous. Et si quelqu’un désigne un élément ou passe la main devant la fenêtre, le contenu s’estompe pour que cette personne reste bien visible.
Ce contexte partagé ne se limite pas aux personnes présentes dans la même pièce. Un aspect intéressant du partage en proximité est son étroite intégration avec FaceTime. Lorsque vous partagez une app avec des personnes proches, vous pouvez lancer un appel FaceTime pour inviter, échanger et collaborer avec des personnes éloignées. Si ces dernières rejoignent visionOS, elles apparaîtront dans votre espace sous forme de Persona spatiale. Cela crée un nouveau niveau de présence qui donne l’impression que tout le monde est réuni dans le même espace.
Lorsqu’une personne rejoint le groupe en tant que Persona spatiale, le système lui affecte un emplacement optimal à côté des personnes proches.
L’emplacement choisi dépend du type de fenêtre partagée. Si quelqu’un rejoint pendant le partage d’une fenêtre volumétrique, il comble les espaces libres entourant le volume. Le résultat est une disposition idéale à la fois pour les participants proches et à distance. Les participants peuvent utiliser n’importe quelle autre plate-forme compatible FaceTime, comme iOS ou macOS.
Dans ce cas, leur vidéo s’affiche à côté de la fenêtre partagée. Ils peuvent facilement interagir avec l’app tout en discutant avec les autres. Par défaut, le partage d’une fenêtre lance une expérience en lecture seule, même si les autres ne possèdent pas l’app. Aucune installation de l’app n’est requise. Cependant, pour créer une expérience partageable dans un même espace, adoptez SharePlay. SharePlay est un élément clé de la collaboration via FaceTime sur les plates-formes Apple. Les apps SharePlay prennent en charge les interactions en temps réel, comme regarder des films, écouter de la musique, jouer, collaborer, et bien plus encore. Toute app SharePlay existante sur visionOS peut être partagée avec des personnes proches, sans aucune modification. SharePlay offre de nouvelles fonctionnalités passionnantes pour concevoir et améliorer votre app spécialement pour les utilisateurs proches.
Si vous débutez avec SharePlay, regardez d’abord les vidéos Build custom experiences with Group Activities et Build spatial SharePlay experiences Je vais développer les concepts présentés dans ces vidéos. J’aborderai plusieurs sujets pour vous aider à créer une excellente expérience partagée en proximité. Nous verrons l’importance de rendre une activité SharePlay accessible depuis le nouveau menu Partager, afin d’optimiser son partage. Vous apprendrez à améliorer les expériences en identifiant les participants proches, puis en plaçant le contenu de manière pertinente en utilisant leur position. Nous verrons un exemple de lecture multimédia partagée avec AVPlayer, pour une synchronisation parfaite de la vidéo et de l’audio partagés. Enfin, pour les apps à plusieurs fenêtres, je vous guiderai pour choisir celle qui pourra être associée à SharePlay. Commençons par rendre votre activité SharePlay disponible dans le menu Partager. Avec l’introduction du nouveau menu Partager dans visionOS 26, le partage d’apps n’a jamais été aussi facile. Pour en tirer pleinement parti, vous devez exposer une GroupActivity dans le menu Partager avec l’API SwiftUI ou UIKit. Ainsi, lorsqu’un utilisateur touche le bouton Partager, il peut activer cette GroupActivity et lancer SharePlay. Pour les fenêtres volumétriques, le menu Partager n’est accessible que si l’app a exposé une activité. Supposons que je souhaite créer une expérience SharePlay pour jouer à des jeux de société avec mes amis lorsque je leur rends visite.
J’ai créé une activité de groupe simple pour mon app de jeux de société, appelée BoardGameActivity. GroupActivities est le framework qui alimente SharePlay et définir une GroupActivity est la première étape pour créer une expérience partagée. J’ai également configuré la scène principale de mon jeu avec un WindowGroup volumétrique affichant la vue du plateau de jeu. Comme il s’agit d’une app SwiftUI, je dois ajouter un ShareLink à la hiérarchie de vues pour exposer mon BoardGameActivity dans le menu Partager. Je passe l’activité BoardGameActivity que je souhaite démarrer et je la marque comme cachée pour ne pas que cela affecte l’UI de mon app. Lorsqu’un utilisateur partage une activité exposée dans le menu, celle-ci s’active automatiquement et crée une GroupSession. C’est comme si on appelait manuellement la méthode activate sur une GroupActivity.
Je peux récupérer la GroupSession créée automatiquement en observant les sessions liées à mon BoardGameActivity. Pour démarrer SharePlay, je configure et rejoins la session qui a été créée.
Les utilisateurs peuvent alors commencer à partager mon app directement depuis le menu Partager. Cela s’applique aux apps en fenêtres classiques ou volumétriques. Mais pour partager une expérience en espace immersif, d’autres éléments sont importants pour que le menu Partager reste toujours accessible. Je veux transformer mon expérience de fenêtres en une table de jeu grandeur nature placée sur le sol, avec des objets 3D thématiques autour de moi pour ajouter du réalisme. Pour ce faire, je dois l’intégrer dans un ImmersiveSpace. Mais j’ai un problème : comment les utilisateurs peuvent-ils partager mon app comme il n’y a pas de barre de fenêtre dans un espace immersif ? Pour y remédier, je peux proposer un bouton qui permettra aux utilisateurs de lancer le partage sans passer par une fenêtre ou un volume. Quand on touche ce bouton, mon app appelle la méthode activate sur mon BoardGameActivity. Nouveau dans visionOS 26, l’appel d’activate sur une activité ouvre automatiquement le menu Partager, même hors de FaceTime. Cela fonctionne avec les fenêtres et les espaces immersifs. Vous pouvez alors sélectionner des personnes proches ou créer une session FaceTime pour commencer à partager directement depuis l’app.
Une méthode plus efficace consiste à maintenir un mode non immersif.
Les utilisateurs pourront ainsi initier le partage d’une fenêtre non immersive, puis basculer en mode immersif une fois tout le monde connecté.
Comme précédemment, je dois rejoindre la GroupSession pour lancer SharePlay. Pour rappel, je dois aussi récupérer le coordinateur système depuis la session et définir supportsGroupImmersiveSpace sur true pour m’assurer que mon espace immersif est partagé et identique pour tous les participants. Une fois que votre app peut être partagée, il est temps de réfléchir aux meilleurs moyens d’améliorer ou de personnaliser l’expérience pour les personnes situées dans le même espace. Pour ce faire, vous pouvez utiliser l’API SharePlay pour vérifier explicitement les participants à proximité. Cela est particulièrement important si un appel FaceTime commence pendant un partage en proximité. Pour mon app de jeux de société, je veux permettre aux joueurs présents dans le même espace de jouer contre ceux qui participent via FaceTime. Je vais donc identifier les participants physiquement proches et leur proposer proactivement de faire équipe.
Pour cela, je dois savoir qui est proche et qui est à distance.
Je commence par la GroupSession à laquelle j’ai participé plus tôt. Pour obtenir des informations sur les participants à cette session, j’observe le publisher des participants actifs sur la GroupSession. À partir de leur état, je vérifie la nouvelle propriété isNearbyWithLocalParticipant. Elle renvoie true si le participant se trouve près de moi. J’exclus le participant local de cette vérification, puisque seuls les autres participants m’intéressent.
Cela me permet de regrouper les participants proches dans la même équipe, afin qu’ils affrontent les joueurs à distance. Pour créer une expérience partagée optimale dans le même espace, tenez compte de la position des utilisateurs proches par rapport à votre app pour pouvoir placer du contenu à côté ou face à eux. La nouvelle API SharePlay vous indique avec précision où se trouvent chaque personne lors du partage. Voici un exemple. J’ai supposé jusqu’ici que les utilisateurs proches partageaient l’app lorsqu’ils se trouvent directement en face d’elle. En réalité, ils peuvent se trouver n’importe où dans l’espace lorsqu’une app est partagée. Les apps sont partagées sur place et ne se déplacent donc pas automatiquement entre les participants lorsque le partage commence. C’est particulièrement important pour les apps d’espace immersif, car vous voudrez peut-être placer le contenu près des participants, et pas seulement à l’origine de l’espace immersif. Dans mon app de jeux de société immersive, je veux montrer une carte de score à chaque personne proche.
Pour cela, je dois d’abord connaître la position relative des personnes proches par rapport à ma scène ImmersiveSpace. Vous pouvez obtenir ces informations à partir d’une nouvelle propriété Pose sur ParticipantState.
Je repars donc de la session de groupe déjà rejointe précédemment. Pour obtenir des informations sur le localParticipant, j’accède au coordinateur système de la session, puis j’observe la séquence asynchrone de localParticipantState sur le coordinateur système. Une fois que j’ai récupéré l’état, je peux lire la nouvelle propriété Pose qui m’indique où se trouve le participant local par rapport à la scène ImmersiveSpace.
Cette propriété ne suit pas l’emplacement d’un participant en temps réel, elle se met à jour après des événements clés, comme le début du partage ou le recentrage avec la Digital Crown. Une fois la position du participant local connue, je calcule la position optimale de la carte de score afin qu’elle apparaisse juste à côté de chaque participant.
En plus de la position réelle d’un participant, vous pouvez obtenir la position de son siège, située à un emplacement physique fixe par rapport à l’app. Pour en savoir plus sur les positions de sièges et la personnalisation dispositions de sièges avec des modèles spatiaux, regardez la vidéo « Customize spatial Persona templates in SharePlay ». Cette vidéo explique comment aller encore plus loin avec la position des sièges et inciter les utilisateurs à rejoindre leur siège réel autour de la table. Cela leur indique où se placer pour profiter du contenu de mon app. Si votre app utilise déjà les positions de sièges, envisagez de migrer vers les positions de participants si vous souhaitez placer du contenu là où se trouvent les personnes dans un espace.
Si votre expérience inclut de la vidéo ou de l’audio partagés, AVPlayer a été mis à niveau dans visionOS 26 afin de synchroniser la lecture pour les personnes situées dans le même espace. Utiliser des médias partagés dans un même espace crée des défis spécifiques, notamment en raison de la proximité physique des participants. Lorsque vous partagez du contenu multimédia dans ces conditions, vous risquez d’entendre l’audio provenant des autres appareils. Cela rend les décalages de son, même infimes, perceptibles et gênants pour les utilisateurs proches. C’est pourquoi il est essentiel que tout le monde voie et entende la même chose en même temps. Dans visionOS 26, AVPlayer et AVPlaybackCoordinator synchronisent avec précision la lecture audio et vidéo pour tous les utilisateurs proches.
Pour le démontrer, je souhaite ajouter une nouvelle vidéo explicative à mon app de jeux de société. Les utilisateurs peuvent la regarder à tout moment pour apprendre à jouer. Tout le monde doit voir et entendre cette vidéo de façon simultanée. Une fois la vidéo terminée, les joueurs pourront reprendre leur partie en appliquant ce qu’ils viennent d’apprendre.
Dans mon app, je vais créer un AVPlaybackCoordinator et le configurer avec la GroupSession. Cela garantit que la lecture est synchronisée pour les personnes se trouvant dans le même espace. Dans mon app, cela signifie que tout le monde peut voir et entendre la vidéo explicative en même temps, sans écho ni délai.
Pour savoir comment configurer un AVPlaybackCoordinator pour SharePlay, regardez « Coordonate media experiences with Group Activities ». Si vous débutez dans la création d’apps pour visionOS, regardez aussi « Create a great spatial playback experience ». L’audio et la vidéo sont désormais parfaitement synchronisés dans mon app. Cependant, l’ajout de la fenêtre vidéo a créé un nouveau problème que je dois résoudre. Mon app contient désormais plusieurs WindowGroups ouverts en même temps : la fenêtre volumétrique du jeu de société et la fenêtre de la vidéo explicative. Pour gérer cela, je dois spécifier de façon explicite laquelle des deux fenêtres ouvertes je souhaite partager. La nouvelle API SharePlay de visionOS 26 permet d’utiliser un modificateur de vue pour désigner le WindowGroup à associer à SharePlay à un moment donné. Les apps prenant en charge plusieurs fenêtres bénéficient ainsi d’un niveau de contrôle inédit.
Je retrouve ici le WindowGroup de jeux de société de mon app. Pour ajouter ma nouvelle vidéo explicative, je vais créer un second WindowGroup destiné à son affichage. Je peux ensuite ajouter le nouveau modificateur de vue .groupActivityAssociation à une vue de ce WindowGroup.
Le fait de passer la valeur primary à .groupActivityAssociation permet d’indiquer au système que cette fenêtre est celle à partager lorsqu’elle est ouverte.
Mon app peut désormais passer à une vidéo partagée parfaitement synchronisée, puis revenir au jeu de société dès que tout le monde est prêt à jouer.
J’ai hâte de voir comment vous allez tirer parti de ces améliorations pour créer des expériences sociales incroyables. C’est le moment idéal pour adopter SharePlay. Activités de groupe n’est pas le seul framework à proposer une nouvelle API pour le partage en proximité. ARKit propose aussi des évolutions dans visionOS 26 qui permettent d’ancrer du contenu partagé au même emplacement physique avec des ancres spatiales partagées. Avant cela, revenons sur quelques concepts clés relatifs aux espaces immersifs et aux ancres spatiales classiques. Si votre app utilise un ImmersiveSpace, vous pouvez y placer librement du contenu dans la pièce d’un utilisateur. Cela permet de disposer des éléments autour de lui, mais un ImmersiveSpace ne reste pas toujours à un emplacement fixe. Par exemple, si une personne se déplace et maintient la Digital Crown pour recentrer, tout l’espace immersif se repositionne. Cela fonctionne pour de nombreux cas, sauf si vous voulez que le contenu reste durablement positionné dans l’espace physique. ARKit offre une solution à ce problème grâce aux ancres spatiales qui permettent aux apps de placer du contenu à des emplacements physiques fixes dans l’espace d’un utilisateur. Le système garantit que ces éléments restent précisément ancrés au même endroit, même en cas de recentrage avec la Digital Crown.
Imaginez une app qui permettrait de placer du mobilier virtuel dans un espace réel pour créer un plan d’aménagement ou expérimenter une nouvelle déco. Pour une app comme celle-ci, il est crucial que le mobilier reste au même emplacement physique, sans dériver avec le temps. Pour la concevoir, je dois pouvoir placer du contenu à un endroit spécifique par rapport à l’origine de mon espace immersif et utiliser une ancre spatiale pour m’assurer qu’il y reste. J’effectue d’abord la configuration avec une ARKitSession et un WorldTrackingProvider, puis j’exécute ce dernier sur la session. Quand je veux ajouter une ancre pour mon app de déco, je crée un WorldAnchor à une transformation spécifique du mobilier dans l’ImmersiveSpace, puis je l’ajoute au WorldTrackingProvider. Enfin, j’écoute les mises à jour de la séquence anchorUpdates du WorldTrackingProvider, qui sera appelée une fois ma nouvelle ancre ajoutée. Je peux ensuite placer mon modèle de mobilier sous l’ancre, et le tour est joué !
Le partage d’apps dans un même espace physique rend essentielles les ancres spatiales. Lorsque vous partagez avec une personne proche, la pièce fait partie du contexte partagé. Les ancres spatiales permettent de tirer parti de l’espace en tant que contexte partagé. Pour placer du contenu partagé dans un emplacement physique spécifique pendant le partage, les apps doivent utiliser la nouvelle API pour marquer les ancres comme partagées avec les participants proches. Lors d’une session SharePlay, cette API permet aux apps de créer une ancre spatiale qui est automatiquement et uniquement partagée avec les personnes situées à proximité. Vous ne pouvez créer des ancres partagées que lorsque SharePlay est actif et ces ancres ne persistent pas à la fin du partage, contrairement aux ancres spatiales classiques.
Je vais intégrer cela dans mon app d’aménagement intérieur. Si quelqu’un ajoute du mobilier à la pièce, je veux que tous les participants à proximité le voient aussi apparaître. Cela donnera vraiment l’impression que nous aménageons la pièce ensemble, de façon collaborative. Je dois m’assurer que les ancres spatiales partagées sont disponibles avant d’essayer d’en créer une. J’observe la nouvelle propriété WorldAnchorSharingAvailability sur mon WorldTrackingProvider. Lorsqu’elle devient disponible, je sais que mon app est activement partagée avec les personnes à proximité et je peux créer une ancre spatiale partagée.
La création de ce type d’ancre est très similaire à celle d’une ancre spatiale classique. Pour la personne qui ajoute le mobilier, je passe sharedWithNearbyParticipants défini sur true lors de la création de la WorldAnchor. Ensuite, tous les WorldTrackingProviders des participants à proximité recevront la nouvelle ancre partagée via la séquence anchorUpdates, avec le même identifiant sur tous les appareils. Vous pouvez lire et synchroniser cet identifiant pour vous assurer que l’app sait quel contenu associer à l’ancre sur chaque appareil.
Les ancres spatiales partagées peuvent aussi servir dans des apps d’entreprise, via votre propre couche réseau, indépendamment de SharePlay. Si vous créez une app d’entreprise spatiale pour la partager avec des personnes à proximité, regardez « Explore enhancements to your spatial business app ».
Partager du contenu à proximité permet de partager une même expérience. Avec les ancres spatiales partagées, vous créez des expériences qui exploitent pleinement l’espace partagé par les utilisateurs.
Réfléchissez à la meilleure façon dont votre app pourrait prendre en charge les expériences interactives partagées avec SharePlay. Comment les utilisateurs peuvent-ils interagir ensemble avec le contenu de votre app ? Une fois SharePlay adopté, assurez-vous que chacun peut facilement partager votre app en prenant en charge le nouveau menu Partager. C’est l’occasion de mettre en avant votre expérience partagée, directement accessible depuis l’UI du système. Réfléchissez ensuite à la manière de concevoir votre expérience pour des utilisateurs proches ou distants, sur toutes les plates-formes compatibles. N’oubliez pas que le partage s’adresse à la fois aux participants à proximité et à distance. Votre app peut désormais connecter des personnes réunies dans une pièce à d’autres situées à l’autre bout du monde. Pensez-y ! Enfin, créez des expériences qui tirent pleinement parti de l’espace physique. Utilisez des ancres spatiales pour rendre votre contenu virtuel plus présent et interactif dans l’environnement réel. En combinant tous ces éléments, les possibilités sont infinies. Vous pouvez collaborer à un tableau blanc sur un mur réel, jouer à des jeux immersifs dans votre salon ou transformer un espace en salle de cinéma pour une soirée entre amis. Partager des expériences en proximité offre un puissant moyen de se connecter et de collaborer avec les personnes autour de soi. J’espère que vous créerez des expériences de partage qui renforcent les liens.
-
-
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 - Introduction
Dans visionOS 26, les personnes utilisant FaceTime peuvent partager des apps et des expériences avec des personnes proches portant Apple Vision Pro. En d’autres termes, vous pouvez regarder, écouter et interagir de manière collaborative dans le même espace physique à l’aide de SharePlay et d’ARKit.
- 0:56 - En savoir plus sur le partage à proximité
Une nouvelle fonctionnalité de partage dans visionOS 26 permet de partager facilement des apps avec des personnes se trouvant à proximité en appuyant sur le bouton à droite de la barre de fenêtre. La fenêtre partagée apparaît au même endroit pour toutes les personnes dans la pièce, créant ainsi un contexte commun où chacun peut discuter, interagir avec l’app et s’y référer comme s’il s’agissait d’un véritable interlocuteur. Le système garantit une apparence et une taille uniformes pour tous. N’importe qui peut déplacer ou redimensionner la fenêtre, et ces changements s’appliquent à tous. Les utilisateurs distants peuvent rejoindre la séance de partage via FaceTime sur visionOS, apparaissant sous forme de Persona spatiales dans le Shared Space, ou sous forme de flux vidéo à côté de la fenêtre partagée s’ils rejoignent le groupe depuis iOS ou macOS, ce qui permet une collaboration fluide quel que soit l’endroit où ils se trouvent.
- 4:21 - Créer des activités à proximité
Toute app SharePlay existante sur visionOS peut être partagée avec des personnes se trouvant à proximité, sans aucune modification nécessaire. Cependant, il existe de nouvelles fonctionnalités qui vous permettent d’améliorer les expériences SharePlay spécialement pour les personnes se trouvant dans le même espace. Ces fonctionnalités sont les suivantes : la possibilité de découvrir les activités SharePlay dans le nouveau menu Partager, de détecter des participants proches, de positionner du contenu en fonction des poses et de synchroniser la lecture des fichiers multimédias.
- 5:35 - Autoriser le partage à partir du menu Partager
Dans visionOS 26, vous pouvez activer SharePlay dans vos apps en exposant une GroupActivity à l’aide de l’API SwiftUI ou UIKit. Une fois cette option activée, tout le monde peut lancer SharePlay directement à partir du nouveau menu Partager. Pour les fenêtres volumétriques, une activité doit être exposée pour que le menu Partager soit utilisable. Pour les espaces immersifs, où le menu Partager traditionnel est inaccessible, vous pouvez fournir un bouton intégré pour activer le menu Partager. Une autre solution consiste à proposer un mode non immersif qui permet aux utilisateurs de partager à partir du menu Partager, puis de passer en mode immersif une fois que tout le monde a rejoint la séance.
- 9:15 - Améliorer pour les personnes à proximité
Utilisez l’API SharePlay pour identifier les participants proches d’une GroupSession. En observant l’éditeur des participants actifs et en vérifiant la propriété « isNearbyWithLocalParticipant », vous pouvez différencier les utilisateurs locaux des utilisateurs distants. Cette approche permet d’activer des fonctionnalités telles que le fait de faire automatiquement équipe avec des joueurs à proximité dans le jeu face à des participants situés à distance qui se connectent via FaceTime.
- 10:37 - Placez le contenu par rapport aux personnes
La nouvelle propriété « pose » de « ParticipantState » vous donne l’emplacement spatial des participants lors d’une séance d’app, ce qui vous permet de placer dynamiquement du contenu à côté de chaque personne. L’expérience immersive est ainsi améliorée avec notamment des fonctionnalités plus avancées, comme guider les personnes vers leurs positions assises optimales.
- 13:20 - Coordonner la lecture multimédia partagée
Dans visionOS 26, AVPlayer est amélioré pour synchroniser la lecture audio et vidéo pour les personnes se trouvant dans le même espace physique, ce qui résout les problèmes causés par les retards audio et l’écho. Cette nouvelle fonctionnalité permet de partager des expériences multimédias fluides, où tout le monde voit et entend le contenu simultanément. Vous pouvez utiliser « AVPlaybackCoordinator » pour obtenir cette synchronisation précise.
- 15:38 - Prise en charge de plusieurs fenêtres
À l’aide de la nouvelle API SharePlay de visionOS 26, vous pouvez spécifier quel « WindowGroup » d’une app est associé à SharePlay en utilisant le modificateur de vue « groupActivityAssociation ». Ce modificateur de vue permet de basculer facilement entre les contenus partagés, améliorant ainsi l’expérience au sein des apps multifenêtres.
- 16:50 - Partager du contenu ancré
ARKit introduit des ancres du monde entier partagées dans visionOS 26. Les apps peuvent ainsi placer du contenu virtuel dans des emplacements physiques fixes qui sont conservés d’une séance à l’autre et pour plusieurs utilisateurs. Cette persistance est particulièrement utile pour les apps collaboratives, où les objets virtuels doivent rester ancrés dans le monde réel. Vous pouvez marquer des ancres du monde entier comme étant partagées pendant les séances SharePlay grâce au nouveau paramètre « sharedWithNearbyParticipants ». Les personnes à proximité peuvent ainsi voir le même contenu virtuel et d’interagir avec. Utilisez l’API « worldAnchorSharingAvailability » pour vous assurer que le partage est disponible. Cette fonctionnalité s’étend au-delà de SharePlay, permettant aux apps professionnelles d’utiliser des ancres partagées avec des couches réseau personnalisées. Les ancres partagées du monde entier ouvrent de nouvelles possibilités d’expériences collaboratives, telles que le tableau blanc virtuel, les jeux immersifs et les soirées cinéma partagées, rendant ainsi le contenu virtuel plus présent et interactif dans le monde physique.