-
Explore as melhorias em seu app espacial de negócios
Saiba como as melhorias mais recentes e as APIs no visionOS 26 expandiram o acesso e ampliaram os recursos empresariais anunciadas no ano passado. Saiba como esses novos recursos facilitam a criação de fluxos de trabalho de treinamento de modelos, aprimoram feeds de vídeo e permitem alinhar sistemas de coordenadas em uma rede local para desenvolver experiências colaborativas em seu app interno.
Capítulos
- 0:04 - Introdução
- 1:37 - Simplificar o desenvolvimento
- 4:54 - Melhorar a experiência de usuário
- 13:37 - Visualizar o ambiente
- 24:01 - Próximas etapas
Recursos
- Implementing object tracking in your visionOS app
- Building spatial experiences for business apps with enterprise APIs for visionOS
Vídeos relacionados
WWDC25
WWDC24
-
Buscar neste vídeo...
-
-
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 - Introdução
No ano passado, a Apple lançou as APIs Empresariais, e neste ano há uma série de novos recursos e melhorias. Essas APIs, projetadas para apps internos proprietários, exigem direitos gerenciados e arquivos de licença. As atualizações visam simplificar o desenvolvimento, melhorar a experiência e possibilitar novas funcionalidades de visualização de ambientes.
- 1:37 - Simplificar o desenvolvimento
O visionOS mais recente aprimora os recursos de desenvolvedor expandindo o acesso à API. Melhorias incluem maior disponibilidade da API, aprimoramentos no rastreamento de objetos e gestão simplificada de licenças. Várias APIs lançadas no ano passado, como as de acesso a webcams UVC e ao Neural Engine, agora estão abertas a todos os desenvolvedores, sem licenças empresariais. Você pode treinar modelos de rastreamento de objetos pela linha de comando, automatizando o processo e integrando-o a pipelines existentes. Arquivos de licença estão acessíveis dentro da conta do Apple Developer, as renovações são automáticas e um novo framework permite verificar o status das licenças e as aprovações de apps para recursos específicos.
- 4:54 - Melhorar a experiência de usuário
Vários novos recursos no visionOS 26 aprimoram a experiência em apps espaciais. Um desses recursos é o Modo de Acompanhamento de Janela, que permite ativar uma janela para ela se mover durante a navegação por um ambiente espacial. Isso é útil para tarefas que exigem referência frequente a informações durante o movimento. Para ativar esse modo, é necessário solicitar e gerenciar um direito licenciado específico. A computação espacial foi aprimorada para colaboração. Espaços de coordenadas compartilhados permitem que pessoas fisicamente próximas compartilhem experiências espaciais. Todas as pessoas podem interagir e discutir o conteúdo do app como se ele estivesse presente. Utilize o SharePlay para configuração simples ou, para ter mais controle, uma nova API do ARKit chamada 'SharedCoordinateSpaceProvider' está disponível para clientes empresariais. Essa API permite que várias pessoas sincronizem seus sistemas de coordenadas e compartilhem dados por uma rede local, criando um sistema de coordenadas para usar âncoras de mundo compartilhado. A privacidade e a segurança dos dados também são importantes, em especial em apps empresariais que lidam com informações confidenciais. Uma nova API contentCaptureProtected permite marcar elementos específicos da interface ou cenas inteiras como protegidos. O sistema oculta esse conteúdo protegido em capturas de tela, gravações, visualizações espelhadas ou sessões compartilhadas, garantindo que os dados confidenciais permaneçam visíveis apenas para o usuário do dispositivo.
- 13:37 - Visualizar o ambiente
O mais recente visionOS aprimora os recursos do Apple Vision Pro para conectar os mundos físico e digital. O sistema de câmeras foi expandido, oferecendo maior acesso às câmeras do dispositivo por meio da API 'CameraFrameProvider' do ARKit. Esse recurso permite que os apps usem feeds da câmera em ambientes imersivos e em espaços compartilhados. Um novo recurso permite ampliar e melhorar áreas específicas da visão do mundo real. Usando o 'CameraRegionView' do VisionKit, os desenvolvedores podem criar janelas que exibem feeds de vídeo dedicados a regiões, deixando detalhes críticos mais claros. Esse recurso é útil para profissionais, como técnicos e inspetores, que monitoram pequenos medidores ou componentes em áreas de pouca luz. Implemente esse recurso com poucas linhas de código SwiftUI, usando as APIs 'CameraRegionView' e 'CameraRegionProvider'. As APIs oferecem opções de processamento, como aprimoramento de contraste e vibração, análise e modificação de imagens, oferecendo flexibilidade para vários apps. O recurso Camera Regions do ARKit aprimora o feed da câmera pass-through no Apple Vision Pro, podendo ser aplicado a áreas definidas por janelas virtuais chamadas 'CameraRegionAnchors'. Você pode criar essas âncoras especificando sua posição, orientação e tamanho no mundo real. O ARKit fornece buffers de pixels estabilizados e aprimorados para essas regiões. O recurso permite zoom e panorâmica, ajustando a taxa de quadros com base no algoritmo de aprimoramento escolhido. Considere o uso de recursos, pois regiões de câmera maiores afetam a memória e o processamento.
- 24:01 - Próximas etapas
Para apps empresariais no Apple Vision Pro, priorize a segurança, respeite a privacidade coletando dados essenciais, siga os requisitos de elegibilidade (internos ou personalizados B2B) e solicite apenas os direitos necessários para funcionalidades específicas.