View in English

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

Quick Links

5 Quick Links

Vidéos

Ouvrir le menu Fermer le menu
  • Collections
  • Sujets
  • Toutes les vidéos
  • À propos

Retour à WWDC25

  • À propos
  • Résumé
  • Transcription
  • Code
  • Découvrez les améliorations de votre app d’entreprise spatiale

    Découvrez comment les dernières améliorations et API de visionOS 26 élargissent l'accès et étendent les capacités d'entreprise annoncées l'année dernière. Apprenez comment ces nouvelles fonctionnalités facilitent la création de workflows d'entraînement de modèles, améliorent les flux vidéo et vous permettent d'aligner les systèmes de coordonnées sur un réseau local afin de développer des expériences collaboratives dans votre app interne.

    Chapitres

    • 0:04 - Introduction
    • 1:37 - Simplifier le développement
    • 4:54 - Améliorer l’expérience utilisateur
    • 13:37 - Visualiser l’environnement
    • 24:01 - Étapes suivantes

    Ressources

    • Building spatial experiences for business apps with enterprise APIs for visionOS
    • Implementing object tracking in your visionOS app
      • Vidéo HD
      • Vidéo SD

    Vidéos connexes

    WWDC25

    • Partagez des expériences visionOS avec des personnes à proximité

    WWDC24

    • Create enhanced spatial computing experiences with ARKit
    • Explore object tracking for visionOS
    • Introducing enterprise APIs for visionOS
  • Rechercher dans cette vidéo…

    Bonjour, je m’appelle Alex Powers, ingénieur au sein de l’équipe Enterprise pour visionOS. Je suis ravi d’être de retour à la WWDC.

    L’an dernier, nous avons lancé le premier ensemble d’API Enterprise pour visionOS. Depuis, nous avons travaillé dur pour vous offrir encore plus de fonctionnalités professionnelles.

    Avant d’explorer les nouvelles fonctionnalités, voyons les exigences fondamentale des API Enterprise.

    Comme elles offrent un vaste champ d’action et un accès plus approfondi aux appareils, l’accès à ces API nécessite un droit géré et un fichier de licence lié à votre compte de développeur. Elles sont conçues pour les apps propriétaires en interne, développées par votre organisation pour vos employés, ou pour les apps personnalisées que vous créez pour une autre entreprise afin de les distribuer en interne.

    En gardant cela en tête, nous allons voir les nouvelles API Enterprise et certaines améliorations majeures apportées aux API existantes.

    Je commencerai par les changements qui rationalisent le développement et facilitent l’accès aux fonctionnalités d’entreprise. Je montrerai comment améliorer l’expérience utilisateur avec de nouveaux moyens d’interagir avec les fenêtres, de partager du contenu avec les utilisateurs à proximité et de protéger les informations sensibles. Enfin, j’explorerai de nouvelles fonctionnalités pour visualiser votre environnement.

    Voyons d’abord comment nous facilitons l’accès aux fonctionnalités d’entreprise et rationalisons le développement.

    Nous avons apporté des changements pour vous donner accès plus largement à plusieurs API ajoutées l’année dernière.

    Nous permettions déjà aux apps d’accéder à la vidéo externe à partir de périphériques USB Video Class via le bandeau de développement Vision Pro. L’API permet aux apps d’exploiter des webcams compatibles UVC pour améliorer les visioconférences, des appareils d’imagerie spécialisés pour les diagnostics à distance ou des caméras d’inspection industrielle pour le contrôle qualité.

    L’accès au Neural Engine a aussi été ouvert pour permettre l’apprentissage automatique avancé sur l’appareil. Avec la dernière version de visionOS, ces API sont désormais disponibles pour tous les développeurs. Vous pouvez accéder à la vidéo UVC et au Neural Engine sans licence ni droit d’entreprise.

    L’année dernière, nous avons lancé le suivi d’objet visionOS, qui permet à votre app de reconnaître et de suivre des objets spécifiques du monde réel. Cette année, l’entraînement est possible directement en ligne de commande.

    Vous pouvez donc automatiser le processus d’entraînement du modèle, l’intégrer dans vos pipelines et mieux gérer vos ressources de suivi d’objet, sans devoir utiliser manuellement l’app CreateML pour chaque objet. Cet outil vous offre les mêmes contrôles que l’app CreateML. Cela vous permettra de créer de nouveaux processus et rendra l’itération des fonctionnalités de suivi d’objet plus rapide et évolutive.

    Nous simplifions aussi la gestion des licences d’entreprise.

    Vous pouvez désormais accéder à vos fichiers de licence dans votre compte Apple Developer. Les renouvellements sont automatiquement transmis à vos apps, et nous avons créé le framework Vision Entitlement Services. Il permet de vérifier facilement si votre app a la bonne licence et si elle est approuvée pour des fonctionnalités spécifiques. Vision Entitlement Services permet de déterminer si l’app peut accéder à une API d’entreprise donnée, comme mainCameraAccess. Consultez l’état de la licence et sa date d’expiration. Pour les apps utilisant le droit Marge de performance accrue, vous pouvez vérifier cette option avant les tâches intensives afin d’optimiser les performances.

    À titre d’exemple, voyons comment déterminer si votre app est configurée correctement pour accéder à la caméra principale.

    D’abord, importez le framework. Utilisez ensuite le singleton partagé des détails de licence d’entreprise pour confirmer que la licence est valide et qu’elle est approuvée pour mainCameraAccess.

    C’est ainsi que le dernier visionOS étend l’accès aux API et facilite le développement de modèles et la gestion de vos apps d’entreprise.

    Découvrons maintenant de nouvelles façons d’améliorer l’expérience utilisateur en créant des apps spatiales plus intuitives, collaboratives et sécurisées. D’abord, un nouveau mode permet de rendre plus naturelles les interactions avec les fenêtres dans les environnements spatiaux, notamment lorsque vous vous déplacez avec Vision Pro.

    Il s’agit du mode Suivi de fenêtre.

    Lorsqu’il est activé, le contenu reste accessible et relatif à votre position. Pour activer ce comportement, vous avez besoin du droit window-body-follow. Ce droit est demandé et géré comme un droit sous licence. Une fois le droit accordé et inclus dans l’app, ce comportement est activé pour toutes les fenêtres de l’appareil dans toutes les apps.

    Dans visionOS, les fenêtres standard restent fixes là où vous les placez. Mais imaginez que vous ayez à consulter fréquemment un tableau de bord, des instructions ou des documents de référence lors de l’exécution d’une tâche qui vous oblige à vous déplacer.

    Le mode Suivi de fenêtre vous permet de choisir une fenêtre qui vous suit lorsque vous allez d’un endroit à l’autre.

    Voyons le mode Suivi de fenêtre en action.

    Ici, je suis concentré sur un projet à mon établi. En même temps, mon bras manipulateur exécute une tâche. Je veux surveiller l’état du manipulateur sans interrompre constamment ma tâche principale. Je clique donc de façon prolongée sur le contrôle de fermeture de la fenêtre. Je choisis Démarrer le mode Suivi.

    Et voilà. La fenêtre d’état me suivra lorsque je retournerai à ma zone de travail.

    Le mode Suivi de fenêtre est activé. Un excellent moyen d’améliorer l’expérience utilisateur. Mais l’Informatique spatiale prend tout son sens dans les expériences collaboratives partagées. C’est justement l’objectif des espaces de coordonnées partagés. Ils permettent à des gens qui sont physiquement ensemble de partager leur expérience spatiale les uns avec les autres.

    Chacun peut naturellement interagir avec le contenu de l’app et en discuter comme s’il était physiquement présent. Nous fournissons des API de haut niveau utilisant SharePlay pour gérer automatiquement la détection, la connexion et la gestion des sessions pour les espaces de coordonnées partagés.

    La session « Share visionOS experiences with nearby people » traite ce sujet. Bien que SharePlay soit facile à utiliser dès le départ, certains scénarios nécessitent plus de contrôle. Vous avez peut-être besoin d’intégrer votre propre infrastructure réseau personnalisée ou de gérer directement la communication des appareils en raison des exigences de votre entreprise.

    Dans ce cas, nous avons créé une API ARKit pour établir des espaces de coordonnées partagés spécifiquement pour les entreprises clientes. Elle s’appelle SharedCoordinateSpaceProvider. Elle permet à plusieurs participants d’aligner leurs systèmes de coordonnées. Cela est possible grâce à l’échange de données spécifiques générées par ARKit via le transport réseau local de votre choix. Chaque participant partage continuellement ces données avec les autres. Ce partage continu crée un système de coordonnées commun, affichant des ancres mondiales partagées de manière cohérente pour tout le monde.

    Voyons donc comment utiliser cette API pour créer une expérience partagée personnalisée.

    SharedCoordinateSpaceProvider est simple à utiliser si vous avez déjà travaillé avec des fournisseurs de données ARKit.

    Comme World Tracking ou Hand Tracking, vous l’instanciez et l’exécutez sur l’ARKitSession active. Une fois exécutée, SharedCoordinateSpaceProvider génère les informations d’alignement nécessaires encapsulées dans les objets CoordinateSpaceData. Vous récupérez ces données avec une API basée sur pull, la fonction nextCoordinateSpaceData du fournisseur. Mon app est chargée de transmettre ces CoordinateSpaceData aux autres participants pour établir un espace de coordonnées partagé. Cela vous donne un contrôle total. Vous pouvez utiliser la couche réseau de votre choix.

    Inversement, lorsque votre app reçoit des CoordinateSpaceData d’un autre participant sur le réseau, vous les fournissez au SharedCoordinateSpaceProvider local en appelant sa méthode push. Chaque donnée entrante est associée à l’ID de participant unique de l’expéditeur. Enfin, le fournisseur vous aide à gérer le cycle de vie de la session. Il propose une séquence asynchrone eventUpdates pour vous informer des changements clés, notamment lorsqu’un participant quitte l’espace partagé.

    Voyons comment cela fonctionne dans le code.

    D’abord, je crée un SharedCoordinateSpaceProvider et l’exécute sur mon ARKitSession. À l’arrivée des données d’un autre participant sur mon réseau, j’informe le fournisseur local à l’aide de données push. Pour obtenir les données que mon appareil doit partager, j’appelle la fonction nextCoordinateSpaceData(). Cela génère l’objet CoordinateSpaceData représentant mon état local, prêt à être diffusé sur mon réseau.

    Cette logique est au cœur de ma gestion personnalisée de l’espace partagé, reliant ma couche réseau à l’alignement des coordonnées d’ARKit.

    Cet API d’ARKit pour les développeurs est donc un bon moyen d’enrichir les apps internes avec plus de collaboration. La dernière amélioration de l’expérience utilisateur concerne la confidentialité et la sécurité des données. De nombreuses apps traitent des informations sensibles, des données financières, des dossiers de patients, des conceptions propriétaires ou des communications confidentielles. Bien qu’utiles, des fonctionnalités comme SharePlay, les captures et enregistrements d’écran, voire la recopie d’écran peuvent exposer ces données par inadvertance. C’est pourquoi une nouvelle API permet de contrôler ce qui peut être capturé et partagé avec d’autres.

    Il s’agit du nouveau modificateur de vue contentCaptureProtected pour SwiftUI. Il est pris en charge dans les apps disposant du droit de contenu protégé. Il suffit de l’ajouter aux éléments d’UI, voire à des scènes RealityKit entières. Tout contenu marqué comme protégé est masqué automatiquement dans les captures d’écran, les enregistrements, les recopies ou partages de vues. Cependant, il reste parfaitement visible pour l’utilisateur qui porte l’appareil. Voici un exemple de cas d’utilisation courant en entreprise.

    J’ai une app qui centralise les documents de mon entreprise et qui est accessible à tous les employés. Mais certains documents contiennent des informations sensibles et ne doivent pas être partagés avec tout le monde. Je partage ces documents avec mon équipe dans l’autre bureau. Ici, l’équipe peut voir les notes de réunion et le plan pour l’année prochaine. Je peux voir ces deux documents, qui sont aussi partagés avec l’équipe. Comme vous le voyez ici, le rapport trimestriel a une icône de verrouillage.

    Il ne doit pas être partagé, et mon équipe ne le voit donc pas sur l’écran distant.

    Voyons maintenant comment protéger du contenu. Dans cet exemple, une vue de document contient une vue enfant appelée SensitiveDataView. Ses informations ne doivent être vues que sur Vision Pro. Pour les protéger, j’ajoute le modificateur de vue contentCaptureProtected, et le tour est joué. Le système masquera désormais le flux chaque fois qu’on tentera de partager ce contenu. La protection du contenu peut aussi intégrer des flux d’authentification tels qu’Optic ID ou l’authentification unique d’entreprise.

    Voilà donc comment protéger le contenu 2D et 3D de l’app. Il peut être protégé avec un seul et même modificateur.

    Ces fonctionnalités améliorent l’expérience dans l’espace numérique. Voyons maintenant certaines fonctionnalités qui aident à visualiser l’environnement et à relier les mondes physique et numérique.

    D’abord, l’accès aux caméras sur Vision Pro a été élargi.

    Vision Pro utilise son système de caméra sophistiqué pour capturer l’environnement de l’usager avec les caméras avant offrant l’expérience de passthrough.

    L’année dernière, une nouvelle API permettait d’accéder au flux vidéo de la caméra principale gauche de l’appareil. Cette année, cette API offre un accès direct à la caméra gauche ou droite, ou aux deux caméras pour le traitement stéréo et l’analyse. Il s’agit de l’API CameraFrameProvider, que vous connaissez peut-être déjà, dans ARKit.

    Désormais, le flux de caméra est disponible dans les environnements Espace immersif et Espace partagé. Votre app peut ainsi fonctionner en parallèle avec d’autres apps et fenêtres.

    C’est ainsi que le dernier visionOS rend l’accès aux caméras encore plus flexible.

    Voyons maintenant une nouvelle façon de visualiser les détails qui vous entourent.

    Les professionnels doivent souvent surveiller des détails spécifiques là où ils travaillent. Par exemple, les techniciens doivent lire de petites jauges sur des machines complexes, ou les inspecteurs peuvent avoir à examiner des composants dans des zones mal éclairées.

    Pour ce faire, une nouvelle fonctionnalité puissantes permet aux usagers de Vision Pro de sélectionner une zone spécifique dans leur vue du monde réel et d’en fournir un flux vidéo dédié dans sa propre fenêtre.

    Ce flux peut être agrandi ou amélioré pour que les détails clés soient nets.

    VisionKit propose une nouvelle vue SwiftUI appelée CameraRegionView. Il suffit de positionner cette fenêtre visuellement sur la zone que vous souhaitez améliorer. Puis, CameraRegionView utilise sa propre position pour fournir la zone et l’espace appropriés pour la caméra virtuelle.

    Si vous avez besoin d’un contrôle plus précis, utilisez la nouvelle API CameraRegionProvider d’ARKit.

    Elle donne un accès direct et est utile si vous utilisez déjà ARKit ou les ancres ou pour des besoins plus spécifiques en matière d’UI.

    Voici une démonstration de son fonctionnement avec un exemple d’app d’état que j’ai créée.

    Comme vous le voyez ici, je suis de retour dans mon projet. Cette fois, j’aimerais surveiller la pression du système pendant que je travaille.

    J’ouvre la fenêtre d’inspecteur de mon app d’état et la place devant la jauge.

    Comme vous le voyez, le flux vidéo de la jauge s’affiche dans mon app d’état. Je peux donc me remettre au travail et examiner la pression pendant que je travaille.

    Voyons comment j’ai ajouté une zone caméra à mon app en quelques lignes de code avec SwiftUI et l’API VisionKit.

    D’abord, j’importe VisionKit.

    Je définis une vue SwiftUI standard. Je l’ai appelée InspectorView. Elle contiendra la zone caméra. Le cœur de cette vue est CameraRegionView. Je l’initialise avec le paramètre IsContrastAndVibrancyEnhancementEnabled, en transmettant true pour activer la stabilisation avec l’amélioration du contraste et de l’éclat. Cette vue doit avoir sa propre fenêtre, car elle utilise la position de la fenêtre pour déterminer quelle partie du passthrough est traitée. Pour cela, voyons la structure de l’app.

    Voici la structure de mon app. J’ai un WindowGroup principal pour le contenu principal de l’app. Je crée un deuxième WindowGroup pour InspectorView.

    Cela suffit pour ajouter une zone caméra à mon app. Pour les apps plus complexes, CameraRegionView prend en charge une closure. Je vais modifier le code pour utiliser cette closure et analyser les images de la caméra. Plus tard, j’ajouterai peut-être une fonctionnalité pour les enregistrer dans un fichier.

    Je modifie CameraRegionView pour accepter une closure, ce qui me permet de traiter chaque image à mesure qu’elle arrive.

    D’abord, j’ajoute la classe cameraFeedDelivery que j’ai créée pour capturer les images de la caméra et les envoyer au reste de mon app.

    Ma closure utilise le pixelBuffer de CameraRegionView. Ici, je vérifie les erreurs et transmets le pixelBuffer à ma classe cameraFeedDelivery. Ma closure renvoie nil, ce qui indique que je n’ai pas modifié le pixelBuffer. Je pourrais aussi utiliser cette closure pour un traitement personnalisé. Si je modifie le pixelBuffer et que je le renvoie, CameraRegionView affichera l’image de la caméra ajustée.

    En quelques lignes de code, j’ai donc ajouté des zones caméra à mon app. Dans mon exemple, j’ai activé l’amélioration du contraste et de l’éclat. Les API CameraRegion offrent deux fonctionnalités de traitement intégrées. La première est la stabilisation d’image. Elle garantit que le contenu reste ancré et stable pendant les mouvements naturels de la tête. La deuxième est l’amélioration du contraste et de l’éclat, qui inclut la stabilisation et optimise la luminosité et la représentation des couleurs.

    Voyons maintenant l’API d’ARKit pour les zones caméra. Souhaitez-vous une zone caméra associée à un objet 3D particulier ? Ou placer une zone caméra lorsqu’un objet spécifique est reconnu dans l’environnement. Si votre app a besoin de ce niveau de contrôle précis sur les ancres et les objets 3D, cette API fournit les primitives de bas niveau et vous devrez définir les ancres.

    Dans ARKit, l’ancre définit une fenêtre virtuelle sur le monde réel en spécifiant sa transformation et sa taille physique en mètres. Cette fenêtre définit une zone où vous voyez la vue directe et stabilisée du flux de la caméra passthrough.

    Cela s’apparente au placement d’une caméra virtuelle dans votre espace physique. Cette caméra virtuelle n’a pas besoin d’être reliée à une fenêtre visionOS. Elle peut générer un flux de tout endroit situé dans le champ de vision des caméras du Vision Pro.

    Examinons maintenant de plus près l’API.

    ARKit propose un nouveau type de fournisseur de données appelé CameraRegionProvider. L’intégration des zones caméra suit un modèle ARKit familier. Je commence par exécuter un fournisseur de données sur mon ARKitSession, comme je le ferais pour les autres fonctionnalités d’ARKit. Une fois le fournisseur opérationnel, ma prochaine étape consiste à localiser l’emplacement d’une zone caméra. Pour ce faire, je crée une CameraRegionAnchor et je l’ajoute au fournisseur. Ces ancres permettent de spécifier les zones exactes du monde réel que je veux pour la caméra virtuelle. Pendant l’exécution d’ARKit, le fournisseur envoie les mises à jour à ces ancres. Chaque mise à jour s’accompagne d’un nouveau pixelBuffer. Ce tampon contient la vue stabilisée pour cette zone spatiale spécifique.

    Voyons donc comment créer l’une de ces ancres.

    La création d’une CameraRegionAnchor est simple. Je définis sa position et son orientation dans le monde à l’aide d’une transformation standard à six degrés de liberté. Puis, je spécifie sa taille physique, sa largeur et sa hauteur en mètres. Ensemble, ces paramètres définissent la fenêtre sur le monde réel pour la zone caméra. Je dois indiquer à ARKit si je veux améliorer ou stabiliser le contraste de la fenêtre. Ensuite, je l’ajoute au CameraRegionProvider. Après avoir ajouté l’ancre, j’appelle anchorUpdates(forID:) et je transmets l’ID d’ancre de newAnchor. Le flux de la caméra apparaît maintenant exactement à l’emplacement spécifié par l’ancre, et mon code peut gérer les pixelBuffers fournis à chaque mise à jour.

    Voilà pour les zones caméra dans ARKit, un outil très utile pour localiser des emplacements spécifiques dans votre environnement. Avant de conclure, j’aimerais vous rappeler certains points. Comme toute vue SwiftUI, le contenu de passthrough de CameraRegionView peut faire l’objet d’un zoom ou d’un panoramique avec les techniques standard. Si vous implémentez ces transformations, vérifiez qu’elles sont aussi appliquées aux images de caméra que vous enregistrez ou transmettez à distance. Il est important de savoir que l’algorithme d’amélioration ajuste dynamiquement sa fréquence d’images pour offrir la meilleure qualité d’image possible. Choisir la stabilisation plutôt que l’amélioration du contraste se traduit par une fréquence d’images supérieure, car cela nécessite moins de puissance de traitement. Bien que les zones caméra d’ARKit soient puissantes et permettent des zones de toute taille, vous devez faire attention à l’utilisation des ressources. Les grandes zones caméra ont naturellement un impact plus important sur la mémoire et le traitement.

    Enfin, je vous recommande vivement d’évaluer l’utilisation globale des ressources lorsque vous concevez votre expérience. Surtout lorsque vous travaillez avec de grandes zones améliorées. À titre indicatif, CameraRegionAnchors devrait afficher le contenu passthrough en utilisant environ un sixième ou moins de la zone visible globale.

    Ce sont donc les fonctionnalités conçues pour relier les mondes physique et numérique, et les dernières d’une longue liste d’améliorations avancées que nous avons ajoutées cette année. Des fonctionnalités de base comme l’accès UVC et le suivi d’objet plus flexibles, à l’ajout du mode Suivi de fenêtre, du contenu protégé par l’app et des zones caméra, je suis sûr que vous saurez exploiter ces nouvelles fonctionnalités dans votre app.

    Pour conclure, voici quelques conseils utiles.

    Soyez conscient de la sécurité environnementale. Les utilisateurs de Vision Pro doivent être dans un endroit approprié pour effectuer des tâches en toute sécurité, notamment lorsqu’ils interagissent avec des équipements réels. Notez qu’un meilleur accès, en particulier aux caméras et aux capteurs, s’accompagne de plus de responsabilités. Informez les utilisateurs des données consultées et des raisons pour lesquelles elles le sont. Concevez vos apps pour ne collecter que les informations nécessaires à la tâche à accomplir, en respectant la confidentialité des utilisateurs sur le lieu de travail. Assurez-vous que votre app et votre cas d’utilisation répondent aux critères d’éligibilité. Ils concernent les apps internes propriétaires développés pour vos propres employés, ou les apps B2B personnalisées conçues pour une autre entreprise et distribuées de manière privée. Si vous êtes éligible, ne demandez que les droits d’entreprise dont vous avez besoin pour les fonctionnalités spécifiques de votre app.

    Enfin, n’hésitez pas à nous faire part de votre avis. Dites-nous ce que vous pensez non seulement de ces API spécifiques, mais aussi des fonctionnalités futures dont vous avez besoin pour créer des apps utiles sur visionOS.

    Merci de votre attention.

    • 3:00 - createml on the Mac command line

      xcrun createml objecttracker -s my.usdz -o my.referenceobject
    • 4:28 - VisionEntitlementServices

      import VisionEntitlementServices
      
      func checkLicenseStatus() {
          // Get the shared license details instance
          let license = EnterpriseLicenseDetails.shared
      
          // First, you might check the overall license status
          guard license.licenseStatus == .valid else {
              print("Enterprise license is not valid: \(license.licenseStatus)")
              // Optionally disable enterprise features or alert the user
              return
          }
      
          // Then, check for a specific entitlement before using the feature
          if license.isApproved(for: .mainCameraAccess) {
              // Safe to proceed with using the main camera API
              print("Main Camera Access approved. Enabling feature...")
              // ... enable camera functionality ...
          } else {
              // Feature not approved for this license
              print("Main Camera Access not approved.")
              // ... keep feature disabled, potentially inform user ...
          }
      }
    • 10:04 - SharedCoordinateSpaceModel

      //
      //  SharedCoordinateSpaceModel.swift
      //
      
      import ARKit
      
      class SharedCoordinateSpaceModel {
          let arkitSession = ARKitSession()
          let sharedCoordinateSpace = SharedCoordinateSpaceProvider()
          let worldTracking = WorldTrackingProvider()
      
          func runARKitSession() async {
              do {
                  try await arkitSession.run([sharedCoordinateSpace, worldTracking])
              } catch {
                  reportError("Error: running session: \(error)")
              }
          }
      
          // Push data received from other participants
          func pushCoordinateSpaceData(_ data: Data) {
              if let coordinateSpaceData = SharedCoordinateSpaceProvider.CoordinateSpaceData(data: data) {
                  sharedCoordinateSpace.push(data: coordinateSpaceData)
              }
          }
      
          // Poll data to be sent to other participants
          func pollCoordinateSpaceData() async {
              if let coordinateSpaceData = sharedCoordinateSpace.nextCoordinateSpaceData {
                  // Send my coordinate space data
              }
          }
      
          // Be notified when participants connect or disconnect from the shared coordinate space
          func processEventUpdates() async {
              let participants = [UUID]()
              for await event in sharedCoordinateSpace.eventUpdates {
                  switch event {
                      // Participants changed
                  case .connectedParticipantIdentifiers(participants: participants):
                      // handle change
                      print("Handle change in participants")
                  case .sharingEnabled:
                      print("sharing enabled")
                  case .sharingDisabled:
                      print("sharing disabled")
                  @unknown default:
                      print("handle future events")
                  }
              }
          }
      
          // Be notified when able to add shared world anchors
          func processSharingAvailabilityUpdates() async {
              for await sharingAvailability in worldTracking.worldAnchorSharingAvailability
                  where sharingAvailability == .available {
                  // Able to add anchor
              }
          }
          // Add shared world anchor
          func addWorldAnchor(at transform: simd_float4x4) async throws {
              let anchor = WorldAnchor(originFromAnchorTransform: transform, sharedWithNearbyParticipants: true)
              try await worldTracking.addAnchor(anchor)
          }
      
          // Process shared anchor updates from local session and from other participants
          func processWorldTrackingUpdates() async {
              for await update in worldTracking.anchorUpdates {
                  switch update.event {
                  case .added, .updated, .removed:
                      // Handle anchor updates
                      print("Handle updates to shared world anchors")
                  }
              }
          }
      }
    • 12:50 - contentCaptureProtected

      // Example implementing contentCaptureProtected
      
      struct SecretDocumentView: View {
          var body: some View {
              VStack {
                  Text("Secrets")
                      .font(.largeTitle)
                      .padding()
      
                  SensitiveDataView()
                      .contentCaptureProtected()
              }
              .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
          }
      }
    • 16:48 - CameraRegionView

      //
      //  InspectorView.swift
      //
      
      import SwiftUI
      import VisionKit
      
      struct InspectorView: View {
          @Environment(CameraFeedDelivery.self) private var cameraFeedDelivery: CameraFeedDelivery
      
          var body: some View {
              CameraRegionView(isContrastAndVibrancyEnhancementEnabled: true) { result in
                  var pixelBuffer: CVReadOnlyPixelBuffer?
                  switch result {
                  case .success(let value):
                      pixelBuffer = value.pixelBuffer
                  case .failure(let error):
                      reportError("Failure: \(error.localizedDescription)")
                      cameraFeedDelivery.stopFeed()
                      return nil
                  }
      
                  cameraFeedDelivery.frameUpdate(pixelBuffer: pixelBuffer!)
                  return nil
              }
          }
      }
      
      @main
      struct EnterpriseAssistApp: App {
          var body: some Scene {
              WindowGroup {
                  ContentView()
              }
      
              WindowGroup(id: "InspectorView") {
                  InspectorView()
              }
              .windowResizability(.contentSize)
          }
      }
    • 21:15 - CameraRegionAnchor

      class CameraRegionHandler {
          let arkitSession = ARKitSession()
          var cameraRegionProvider: CameraRegionProvider?
          var cameraRegionAnchor: CameraRegionAnchor?
      
          func setUpNewAnchor(anchor: simd_float4x4, width: Float, height: Float) async {
              let anchor = CameraRegionAnchor(originFromAnchorTransform: anchor,
                                              width: width,
                                              height: height,
                                              cameraEnhancement: .stabilization)
      
              guard let cameraRegionProvider = self.cameraRegionProvider else {
                  reportError("Missing CameraRegionProvider")
                  return
              }
      
              do {
                  try await cameraRegionProvider.addAnchor(anchor)
              } catch {
                  reportError("Error adding anchor: \(error)")
              }
              cameraRegionAnchor = anchor
      
              Task {
                  let updates = cameraRegionProvider.anchorUpdates(forID: anchor.id)
                  for await update in updates {
                      let pixelBuffer = update.anchor.pixelBuffer
                      // handle pixelBuffer
                  }
              }
          }
      
          func removeAnchor() async {
              guard let cameraRegionProvider = self.cameraRegionProvider else {
                  reportError("Missing CameraRegionProvider")
                  return
              }
      
              if let cameraRegionAnchor = self.cameraRegionAnchor {
                  do {
                      try await cameraRegionProvider.removeAnchor(cameraRegionAnchor)
                  } catch {
                      reportError("Error removing anchor: \(error.localizedDescription)")
                      return
                  }
                  self.cameraRegionAnchor = nil
              }
          }
      }
    • 0:04 - Introduction
    • L’année dernière, Apple a introduit les API d’entreprise, et cette année, il y a une foule de nouvelles fonctionnalités et d’améliorations. Ces API, conçues pour les apps internes propriétaires, nécessitent des droits gérés et des fichiers de licence. Les mises à jour visent à simplifier le développement, améliorer l’expérience utilisateur et permettre de nouvelles visualisations d’environnement.

    • 1:37 - Simplifier le développement
    • visionOS évolue et donne aux développeurs un accès élargi aux API. Les nouveautés majeures incluent un meilleur accès aux API, un suivi d’objets optimisé et une gestion des licences d’entreprise simplifiée. Plusieurs API introduites l’an dernier, comme celles dédiées à l’accès aux webcams UVC et au Neural Engine, sont désormais accessibles à tous les développeurs, sans licence d’entreprise. Vous pouvez maintenant entraîner vos modèles de suivi d’objet en ligne de commande, avec intégration directe aux pipelines existants. Les fichiers de licence sont accessibles depuis le compte Apple Developer, les renouvellements sont automatiques, et un nouveau framework permet aux développeurs de vérifier le statut des licences et les autorisations d’app pour certaines fonctionnalités.

    • 4:54 - Améliorer l’expérience utilisateur
    • Plusieurs nouveautés de visionOS 26 enrichissent l’expérience utilisateur dans les apps spatiales. Parmi elles, le mode Suivi de fenêtre, qui permet à une fenêtre de suivre l’utilisateur dans son environnement spatial. Idéal pour les tâches où l’on doit consulter souvent des infos tout en se déplaçant. Pour activer ce mode, vous devez demander et gérer un droit de licence spécifique. L’informatique spatiale s’améliore aussi côté collaboration. Les espaces de coordonnées partagés offrent une expérience spatiale commune aux personnes réunies physiquement. Chacun peut interagir avec le contenu de l’app comme s’il était réellement présent. Vous pouvez utiliser SharePlay pour une configuration simple, ou opter pour un contrôle avancé grâce à la nouvelle API ARKit SharedCoordinateSpaceProvider, réservée aux clients entreprise. Cette API permet à plusieurs participants d’aligner leurs systèmes de coordonnées et de partager des données via un réseau local choisi, afin de créer un système commun pour les ancres partagées. La confidentialité et la sécurité des données restent une priorité absolue, en particulier pour les applications d’entreprise traitant des informations sensibles. Une nouvelle API appelée contentCaptureProtected permet de marquer des éléments d’interface ou des scènes entières comme protégés. Le système masque alors automatiquement ce contenu protégé dans les captures d’écran, enregistrements, vues en miroir ou sessions partagées, garantissant que les données sensibles ne soient visibles que par l’utilisateur portant l’appareil.

    • 13:37 - Visualiser l’environnement
    • Le nouveau visionOS rapproche encore plus les mondes physique et numérique avec l’Apple Vision Pro. Le système de caméra a été étendu, vous offrant un accès plus large aux caméras de l’appareil via l’API CameraFrameProvider d’ARKit. Cette fonctionnalité permet aux apps d’exploiter les flux de caméra aussi bien dans des environnements immersifs que partagés. Une nouvelle fonctionnalité permet aux utilisateurs d’agrandir et d’améliorer certaines zones de leur vue réelle. Avec CameraRegionView de VisionKit, les développeurs peuvent créer des fenêtres pour afficher des zones ciblées afin de mieux voir les détails importants. Cette fonctionnalité est particulièrement utile pour les professionnels, comme les techniciens ou les inspecteurs, qui doivent surveiller de petits éléments dans des zones faiblement éclairées. Vous pouvez implémenter cette fonctionnalité en quelques lignes de code SwiftUI seulement, en utilisant les API CameraRegionView et CameraRegionProvider. Ces API proposent des options de traitement intégrées, comme l’amélioration du contraste et de l’éclat, et permettent une analyse et une modification d’image sur mesure, offrant ainsi une grande flexibilité pour divers cas d’usage. La fonctionnalité Camera Regions d’ARKit améliore le flux de caméra pass-through sur Apple Vision Pro, en l’appliquant à des zones spécifiques définies par des fenêtres virtuelles appelées CameraRegionAnchors. Vous pouvez créer ces ancres en spécifiant leur position, leur orientation et leur taille dans le monde réel. ARKit fournit ensuite des tampons de pixels stabilisés et améliorés pour ces zones. Cette fonctionnalité permet de zoomer et de déplacer l’image, et ajuste dynamiquement la fréquence d’image en fonction de l’algorithme d’amélioration sélectionné. Tenez compte de l’utilisation des ressources, car des zones de caméra plus grandes peuvent affecter la mémoire et les performances de traitement.

    • 24:01 - Étapes suivantes
    • Pour des résultats optimaux dans les apps professionnelles sur Apple Vision Pro, privilégiez la sécurité, respectez la vie privée en ne collectant que les données nécessaires, assurez-vous que les apps répondent aux critères d’éligibilité (usage interne ou B2B personnalisé) et ne demandez que les droits d’accès strictement requis pour les fonctionnalités ciblées.

Developer Footer

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