-
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
- Implementing object tracking in your visionOS app
- Building spatial experiences for business apps with enterprise APIs for visionOS
Vidéos connexes
WWDC25
WWDC24
-
Rechercher dans cette vidéo…
-
-
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.