
-
Explorar las mejoras de la app empresarial espacial
Descubre cómo las últimas mejoras y API de visionOS 26 amplían el acceso y las capacidades empresariales anunciadas el año pasado. Descubre cómo estas nuevas funcionalidades facilitan la creación de flujos de trabajo de entrenamiento de modelos, mejoran las transmisiones de video y te permiten alinear sistemas de coordenadas en una red local para desarrollar experiencias colaborativas en tu app interna.
Capítulos
- 0:04 - Introducción
- 1:37 - Agilizar el desarrollo
- 4:54 - Mejorar la experiencia de usuario
- 13:37 - Visualizar el entorno
- 24:01 - Próximos pasos
Recursos
- Building spatial experiences for business apps with enterprise APIs for visionOS
- Implementing object tracking in your visionOS app
Videos relacionados
WWDC25
WWDC24
-
Buscar este video…
Hola, soy Alex Powers y soy ingeniero del equipo empresarial de visionOS. Es genial estar de vuelta en la WWDC.
El año pasado, presentamos el primer conjunto de API de empresas para visionOS. Desde entonces, trabajamos para brindarte más capacidades empresariales.
Antes de explorar las nuevas características, revisemos los requisitos fundamentales para las API empresariales.
Como ofrecen una amplia utilidad y un acceso más profundo a los dispositivos, acceder a ellas requiere derecho administrado y una licencia vinculada a tu cuenta de desarrollador. Y diseñado para apps internas patentadas, desarrolladas por tu organización para tus empleados, o para apps personalizadas para que otra empresa distribuya internamente.
Con esto en mente, me complace mostrarte las nuevas API empresariales y algunas mejoras importantes en las API existentes.
Comenzaré con cambios que agilizarán tu desarrollo y te facilitarán el acceso a las capacidades empresariales. Luego, te mostraré cómo mejorar la experiencia del usuario con nuevas formas de interactuar con las ventanas, compartir contenido con personas cercanas y proteger información confidencial. Finalmente, exploraré nuevas capacidades para visualizar tu entorno.
Comenzaré mostrando algunas formas en las que facilitamos el acceso a las capacidades empresariales y agilizamos tu desarrollo.
En primer lugar, realizamos algunos cambios este año para brindarte un acceso más amplio a varias API que presentamos el año pasado.
Anteriormente presentamos la capacidad para que las apps accedan a video externo desde dispositivos USB de clase de video con la Vision Pro Developer Strap. La API permite aprovechar cámaras web compatibles con UVC para videoconferencias mejoradas, dispositivos de imágenes especializados para diagnósticos remotos o cámaras de inspección industrial para control de calidad.
También te dimos acceso a Neural Engine para el aprendizaje automático avanzado en el dispositivo. Con la última versión de visionOS, estas API ahora están disponibles para todos los desarrolladores. Podrás acceder al video UVC y a Neural Engine sin una licencia empresarial o sin derecho.
El año pasado, presentamos el seguimiento de objetos para visionOS, el cual permite a tu app reconocer y rastrear objetos específicos del mundo real. Este año, agregamos la capacidad de entrenamiento desde la línea de comando.
Así que ahora puedes automatizar el proceso de entrenamiento del modelo, integrarlo en tus canales existentes y administrar tus activos de seguimiento de objetos con más eficiencia sin usar manualmente la app CreateML para cada objeto individual. Esta herramienta te brinda los mismos controles que la app CreateML. Esto desbloqueará nuevos flujos de trabajo y hará que la iteración en tus funciones de seguimiento de objetos sea más rápida y escalable.
También estamos simplificando la gestión de licencias empresariales.
Ahora puedes acceder a tus archivos de licencia directamente desde tu cuenta de Apple Developer. Las renovaciones se envían en automático a tus apps de manera inalámbrica y creamos la estructura Vision Entitlement Services. Esta estructura hace más fácil comprobar si tu app cuenta con la licencia adecuada y si está aprobada para funciones específicas. Con los servicios de autorización de Vision puedes determinar si tu app tiene acceso a una API empresarial específica, como a la cámara principal. Consultar el estado de tu licencia y su fecha de vencimiento y, para las apps con el derecho de margen de rendimiento superior, verificar este movimiento antes de realizar tareas intensivas para mejorar el rendimiento.
A modo de ejemplo, veamos cómo determinar si tu app está configurada correctamente para acceder a la cámara principal.
Primero, importa la estructura. Luego, utiliza la instancia única Detalles de la licencia empresarial compartida para confirmar que la licencia sea válida y que la esté aprobada para mainCameraAccess.
Así es como la última versión de visionOS amplía el acceso a la API y facilita el desarrollo de modelos y la gestión de apps empresariales.
Ahora veamos algunas nuevas formas de mejorar las experiencias de los usuarios con la creación de apps espaciales más intuitivas, colaborativas y seguras. Primero, presentamos una forma de que las interacciones con las ventanas en entornos espaciales sean más naturales, especialmente al moverse usando Vision Pro.
Le pusimos modo de seguimiento de ventana.
Cuando está habilitado, garantiza que el contenido permanezca accesible con relación a tu posición. Para habilitar este comportamiento, necesitas el derecho window-body-follow. Este derecho se solicita y se gestiona como un derecho con licencia. Una vez que se otorga el derecho y se incluye en tu app, este comportamiento se habilitará para cualquier ventana del dispositivo en todas las apps.
Las ventanas estándar en visionOS permanecen fijas en el espacio donde las colocas. Pero imagina que tienes un dashboard, un conjunto de instrucciones o material de referencia que necesitas revisar con frecuencia al realizar tareas que requieren moverse.
El modo de seguimiento de ventana te permite elegir una ventana y hacer que se mueva a medida que te desplazas.
Veamos el modo de seguimiento de ventana en acción.
Aquí estoy concentrado en un proyecto en mi área de trabajo. Al mismo tiempo, mi brazo manipulador está ejecutando una tarea. Quiero monitorear el estado del manipulador, pero sin interrumpir constantemente mi tarea principal. Para habilitar el modo de seguimiento de ventana para la ventana de estado, hago clic y mantengo presionado el control de cierre de ventana. Toco Iniciar modo de seguimiento.
Y así comienza. La ventana de estado me seguirá mientras regreso a mi área de trabajo.
Este es el modo de seguimiento de ventana. Una excelente forma de mejorar la experiencia de usuario. Pero la computación espacial realmente funciona mejor cuando permite experiencias compartidas y colaborativas. Y eso es precisamente lo que permiten los espacios de coordenadas compartidas. Esta función permite que las personas físicamente en el mismo lugar, compartan sus experiencias espaciales.
Todos pueden interactuar naturalmente con el contenido de la app y discutirlo como si estuviera físicamente presente. Proporcionamos API de alto nivel con SharePlay que manejan en automático el descubrimiento, la conexión y la gestión de sesiones para espacios de coordenadas compartidas.
Tenemos una sesión dedicada a esto llamada "Share visionOS experiences with nearby people". Si bien SharePlay ofrece una fantástica facilidad de uso desde el primer momento, algunas situaciones requieren mayor control. Puede que necesites integrarlo con tu infraestructura de red personalizada. O los requisitos de tu empresa implican que debes gestionar la comunicación del dispositivo directamente. Para estos casos de uso, presentamos una nueva API de ARKit para establecer espacios de coordenadas compartidas específica para clientes empresariales. Se llama SharedCoordinateSpaceProvider. Esta API permite que varios participantes alineen sus sistemas de coordenadas. Esto se logra intercambiando datos específicos generados por ARKit a través del transporte de red local elegido. Cada participante comparte continuamente estos datos con los demás. Este intercambio continuo crea un sistema de coordenadas común, lo que permite que los anclajes mundiales compartidos sean consistentes para todos.
Con esto en mente, veremos cómo usar esta API para crear una experiencia compartida personalizada.
Usar SharedCoordinateSpaceProvider es sencillo si trabajaste anteriormente con proveedores de datos ARKit.
Similar al Seguimiento mundial o al Seguimiento manual, lo ejemplificas y lo ejecutas en tu ARKitSession activa. Una vez en ejecución, SharedCoordinateSpaceProvider genera la información de alineación necesaria encapsulada en objetos CoordinateSpaceData. Puedes recuperar estos datos con una API basada en extracción, la función nextCoordinateSpaceData() del proveedor. Mi app es responsable de transmitir este CoordinateSpaceData a los demás participantes para establecer un espacio de coordenadas compartido. Esto te proporciona control total. Puedes usar la capa de red que desees.
Por el contrario, cuando tu app recibe CoordinateSpaceData de otro participante a través de la red, lo proporciona al SharedCoordinateSpaceProvider local llamando a tu método push(). Cada pieza de datos entrantes está etiquetada con el participantID único del remitente. Por último, el proveedor ayuda a gestionar el ciclo de vida de la sesión. Ofrece una secuencia asincróna de eventUpdates para informarte sobre cambios importantes, como que un participante abandone el espacio compartido.
Te mostraré un ejemplo de cómo funciona esto en código.
Comienzo creando un SharedCoordinateSpaceProvider y ejecutándolo en mi ARKitSession. Cuando llegan datos de otro participante a mi red, actualizo la comprensión del proveedor local utilizando datos push. Para obtener los datos que mi dispositivo necesita compartir, llamo a la función nextCoordinateSpaceData(). Esto me da el objeto CoordinateSpaceData, que representa mi estado local, listo para ser transmitido a través de mi red.
Finalmente, esta lógica forma el centro de mi gestión personalizada del espacio compartido, uniendo mi capa de red con la alineación de coordenadas de ARKit.
Esta es la API de coordenadas compartidas de ARKit para desarrolladores empresariales, una excelente manera de colaborar en las apps internas. Mi última mejora en la experiencia es sobre privacidad y seguridad de los datos. Muchas apps empresariales manejan información confidencial, datos financieros, registros de pacientes, diseños propietarios o comunicaciones confidenciales. Y aunque son increíblemente útiles, funciones como SharePlay, capturas y grabaciones de pantalla o incluso la vista reflejada pueden exponer inadvertidamente los datos confidenciales. Hoy en día, hay una nueva API que te brinda control sobre lo que se puede capturar y compartir con otros.
Y es el nuevo modificador de vista contentCaptureProtected para SwiftUI. Es compatible con apps con derecho a contenido protegido. Solo agrégalo a cualquier elemento de interfaz de usuario o a escenas completas de RealityKit. Cuando el contenido está marcado como protegido, el sistema lo ocultará automáticamente en cualquier captura de pantalla, grabación, vista reflejada o compartida. Sin embargo, el contenido permanece perfectamente visible para el usuario con el dispositivo. Este es un ejemplo de un caso de uso empresarial común.
Tengo una app que sirve como repositorio central para los documentos de mi empresa, accesible para todos los empleados. Sin embargo, ciertos documentos dentro del sistema contienen información confidencial y no deberían compartirse ampliamente. Estoy compartiendo estos documentos con mi equipo en la otra oficina. Aquí, el equipo puede ver nuestras notas de la reunión y el plan para el próximo año. Ambos documentos son visibles para mí y compartidos con el equipo. Aquí puedes ver que el informe trimestral tiene un ícono de candado.
Este informe no debe compartirse y por eso mi equipo no puede verlo en la pantalla remota.
Ahora que has visto el contenido protegido en acción, veamos cómo implementarlo. En este ejemplo, tengo una vista de documento que contiene una vista secundaria que llamé SensitiveDataView. Contiene información que solo debe verse en Vision Pro. Para protegerlo, agrego el modificador de vista, contentCaptureProtected y listo. El sistema ahora ocultará el feed cada vez que se intente compartir este contenido. También puede integrar esta protección de contenido con flujos de autenticación como Optic ID o inicio de sesión único corporativo.
Así es como se protege el contenido 2D y 3D de la app. Se puede proteger con el mismo modificador simple.
Estas características mejoran la experiencia dentro del espacio digital. Ahora, veamos algunas funciones diseñadas para ayudar a visualizar el entorno y unir los mundos físico y digital.
Primero, estamos ampliando el acceso a la cámara en Vision Pro.
Vision Pro utiliza su sofisticado sistema de cámaras para capturar el entorno del usuario con las cámaras frontales proporcionando la experiencia de traspaso.
El año pasado, asignamos una API para proporcionar acceso a la transmisión de video de la cámara principal izquierda del dispositivo. Y este año, ampliamos la API para proporcionar acceso directo a las cámaras individuales izquierda o derecha, o a ambas para el procesamiento y análisis estéreo. Si ya estás familiarizado, es la API CameraFrameProvider en ARKit.
Ahora, la compatibilidad con la transmisión de la cámara está disponible en los entornos de Espacio Inmersivo y Espacio Compartido, lo que permite que tu app funcione junto con otras apps y ventanas.
Así es como el último visionOS hace que el acceso a la cámara sea aún más flexible.
Ahora, te mostraré una nueva forma de visualizar detalles de tu entorno.
Los profesionales a menudo necesitan supervisar detalles específicos en su área de trabajo. Por ejemplo, los técnicos necesitan leer medidores pequeños en maquinaria compleja, o los inspectores necesitan examinar componentes en áreas poco iluminadas.
Para esto, presentamos una nueva y poderosa función que permite a las personas que usan Vision Pro seleccionar un área específica en su vista del mundo real y transmitir video dedicado de esa área en su propia ventana.
Esta se puede ampliar o mejorar para que los detalles críticos aparezcan con claridad.
Hay una nueva vista SwiftUI en VisionKit llamada CameraRegionView. Simplemente coloca esta ventana visualmente sobre el área que deseas mejorar. Luego, CameraRegionView utiliza su propia posición para proporcionar la región y el espacio adecuados para la cámara virtual.
Si necesitas un control más detallado, puedes utilizar la nueva API CameraRegionProvider en ARKit.
Esto te brinda acceso directo y es útil si ya estás usando ARKit, estás familiarizado con los anclajes o necesitas interfaz de usuario más específicas.
Esta es una demostración de cómo funciona con una app de estado de ejemplo que creé.
Aquí puedes ver que estoy en mi proyecto. Esta vez, me gustaría monitorizar la presión en el sistema mientras trabajo.
Abriré la ventana del inspector de mi app de estado y la colocaré delante del indicador.
Como puedes ver, la transmisión de video del medidor apareció en mi app de estado. Ahora puedo volver a trabajar y controlar la presión al mismo tiempo.
Ahora, te mostraré cómo agregué una región de cámara a mi app en solo unas pocas líneas de código con SwiftUI y la API VisionKit.
Primero, importo VisionKit.
Defino una vista SwiftUI estándar. Lo llamé InspectorView. Contendrá la región de la cámara. El núcleo de la vista es CameraRegionView. Lo estoy inicializando con el parámetro IsContrastAndVibrancyEnhancementEnabled, pasándolo para habilitar la estabilización con mejora de contraste y vibración. Como mencioné, esta vista debe tener su propia ventana porque utiliza la posición de la ventana para determinar qué parte del paso se procesa. Para ello, veamos la estructura de la app.
Esta es la estructura de mi app. Tengo un WindowGroup para el contenido de mi app principal. Crearé un segundo WindowGroup para el InspectorView.
Es suficiente para agregar una región de cámara a mi app. Pero para apps más complejas, CameraRegionView admite un cierre. Voy a cambiar mi código para analizar las imágenes de la cámara con este cierre y luego, agregar una función para guardar las imágenes en un archivo.
Modificaré CameraRegionView para aceptar un cierre, esto me permitirá procesar cada fotograma de la cámara llega.
Primero, agrego mi clase cameraFeedDelivery que creé para capturar fotogramas de la cámara y enviarlos al resto de mi app.
Mi cierre utilizará el pixelBuffer de CameraRegionView. Aquí, verificaré si hay errores y pasaré el pixelBuffer a mi clase cameraFeedDelivery. Mi cierre devuelve cero, lo que indica que no he modificado el pixelBuffer. También podría usar este cierre para un procesamiento personalizado. Si modifico pixelBuffer y lo devuelvo, CameraRegionView renderizará la imagen de la cámara ajustada.
Así, con solo unas pocas líneas de código, agregué regiones de cámara a mi app. En mi ejemplo, habilité la mejora del contraste y la vitalidad. Pero las API de región de cámara proporcionan dos capacidades de procesamiento integradas. La primera es la estabilización de imagen. Esta garantiza que el contenido permanezca anclado y estable al mover naturalmente la cabeza. La segunda es la mejora del contraste y la vitalidad, la cual incluye estabilización y optimización del brillo y la representación del color.
Ahora, veamos la API de ARKit para las regiones de la cámara. Quizás quisieras una región de cámara asociada con un objeto 3D en particular para tu app. O te gustaría colocar una región de cámara luego de reconocer un objeto específico en el entorno. Si tu app necesita este nivel de control detallado sobre anclajes y objetos 3D, esta API proporciona los primitivos de bajo nivel y tú deberá definir los anclajes.
En ARKit, tu ancla define una ventana virtual hacia el mundo real al especificar su transformación y tamaño físico en metros. Esta ventana define un área donde verás la vista directa y estabilizada de la transmisión de la cámara de paso.
Puedes pensarlo como si colocaras una cámara virtual allí mismo en tu espacio físico. No es necesario conectar esta cámara virtual a una ventana de visionOS. Puede producir la transmisión de la ubicación dentro del campo de visión de la cámara Vision Pro.
Ahora, veamos más de cerca a la API.
ARKit ofrece un nuevo tipo de proveedor de datos llamado CameraRegionProvider. La integración de regiones de la cámara sigue un patrón familiar de ARKit. Primero ejecuto un proveedor de datos en mi ARKitSession como lo haría para otras funciones de ARKit. Con el proveedor en funcionamiento, mi siguiente paso es localizar el área para una región de cámara. Hago esto al crear un CameraRegionAnchor y agregarlo a mi proveedor. Pienso en estos anclajes como si especificaran las regiones exactas en el mundo real que deseo en la cámara virtual. Conforme se ejecuta ARKit, el proveedor envía actualizaciones a estos anclajes. Cada actualización viene con un nuevo pixelBuffer. Este búfer contiene la vista estabilizada para esa región espacial específica.
Veamos cómo creo uno de estos anclajes.
Crear un CameraRegionAnchor es sencillo. Defino su posición y orientación en el mundo con una transformación estándar de 6 grados de libertad. Luego especifico su tamaño físico, su ancho y alto en metros. En conjunto, estos parámetros definen la ventana del mundo real para la región de la cámara. También necesito decirle a ARKit si quiero que el contraste de la ventana se mejore o se estabilice. Luego, lo agrego a CameraRegionProvider. Después de agregar el ancla, llamo a anchorUpdates(forID:) y paso el ID de anclaje de newAnchor. La transmisión de la cámara ahora aparece en la ubicación especificada por el ancla y mi código puede manejar los pixelBuffers de cada actualización.
Estas son las regiones de cámara en ARKit, una herramienta increíblemente útil para realizar un seguimiento de áreas específicas de tu entorno. Antes de cambiar de tema, hay algunos puntos que me gustaría que tuvieras en cuenta. El contenido de paso en CameraRegionView, como cualquier vista de SwiftUI, se puede ampliar o desplazar mediante técnicas estándar. Si implementas estas transformaciones, asegúrate de que también se apliquen a todos los fotogramas de la cámara que guardes o transmitas en remoto. Es importante comprender que el algoritmo de mejora ajusta dinámicamente su velocidad de cuadros para ofrecer la mejor calidad de imagen posible. Elegir la estabilización en lugar de la mejora del contraste resultará en mayor velocidad de cuadros, ya que esta requiere menos potencia de procesamiento. Si bien las regiones de cámara en ARKit son potentes y permiten regiones de cualquier tamaño, es importante tener en cuenta el uso de los recursos. Las regiones de cámara más grandes tendrán mayor impacto en la memoria y el procesamiento.
Por último, recomiendo que evalúes el uso general de tus recursos a medida que diseñas tu experiencia. Especialmente cuando trabajas con grandes regiones mejoradas. Como pauta, intenta que CameraRegionAnchors muestre contenido de paso al utilizar una sexta parte o menos del área visible total.
Estos son los últimos temas de una larga lista de mejoras para unir tus mundos físico y digital, preparadas para la empresa y que agregamos este año. Desde hacer que las funciones principales, como el acceso a UVC y el seguimiento de objetos, sean más flexibles, hasta presentar el modo de seguimiento de ventana, el contenido protegido por apps y las regiones de la cámara. Seguro encontrarás innumerables formas de poner en práctica estas nuevas capacidades en tu app.
Terminemos con algunas orientaciones.
Ten en cuenta la seguridad del ambiente. Asegura que los usuarios se encuentren en una ubicación adecuada para realizar tareas de forma segura mientras usan Vision Pro e interactúan con equipos del mundo real. Recuerda que un mayor acceso a cámaras y sensores en particular, conlleva una mayor responsabilidad. Sé transparente con los usuarios sobre a qué datos accedes y por qué. Diseña tus apps para recopilar solo la información necesaria para la tarea en cuestión y respeta la privacidad del usuario en el lugar de trabajo. Asegúrate de que tu app y caso de uso cumplan con los requisitos de elegibilidad. Estos están destinados a apps internas desarrolladas para tus propios empleados o para apps B2B personalizadas creadas para otra empresa y distribuidas de forma privada. Y con esos elementos confirmados, si son elegibles, solicita los derechos empresariales que realmente necesitas para la funcionalidad específica de tu app.
Por último, comparte tus comentarios. Confiamos en tus comentarios sobre estas API específicas y también sobre las capacidades futuras que necesitas para crear apps empresariales increíbles en visionOS.
Gracias por acompañarme y que tengas una excelente WWDC.
-
-
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 - Introducción
El año pasado, Apple presentó las API empresariales, y este año hay una gran cantidad de nuevas funcionalidades y mejoras. Estas API, diseñadas para apps internas patentadas, requieren derechos administrados y archivos de licencia. Las actualizaciones se centran en agilizar el desarrollo, mejorar la experiencia del usuario y habilitar nuevas capacidades de visualización del entorno.
- 1:37 - Agilizar el desarrollo
La última versión de visionOS amplía el acceso a la API para mejorar las capacidades para los desarrolladores. Las mejoras clave incluyen una mayor disponibilidad de API, mejoras en el seguimiento de objetos y una administración simplificada de licencias empresariales. Varias API presentadas el año pasado, como las de acceso a cámaras web compatibles con UVC y Neural Engine, ahora están abiertas a todos los desarrolladores sin licencias empresariales. Ahora, para entrenar modelos de seguimiento de objetos directamente desde la línea de comandos, puedes automatizar el proceso e integrarlo en las canalizaciones existentes. Los archivos de licencia ahora son accesibles dentro de la cuenta de Apple Developer, las renovaciones son automáticas y una estructura nueva permite comprobar fácilmente el estado de la licencia y la aprobación de la app para funcionalidades concretas.
- 4:54 - Mejorar la experiencia de usuario
Varias funcionalidades nuevas en visionOS 26 mejoran las experiencias del usuario en apps espaciales. Una de ellas es el modo de seguimiento de ventana, que permite a los usuarios habilitar una ventana para que se muevan mientras navegan por un entorno espacial. Esto es particularmente útil para tareas que requieren referencia frecuente a la información mientras te mueves. Para habilitar este modo, debes solicitar y administrar un derecho de licencia específico. La computación espacial también se mejora para la colaboración. Los espacios de coordenadas compartidos permiten que las personas que están físicamente juntas compartan sus experiencias espaciales. Todos pueden interactuar con el contenido de la app y hablar sobre él como si estuviera físicamente presente. Puedes usar SharePlay para una configuración sencilla u obtener más control, la nueva API de ARKit llamada “SharedCoordinateSpaceProvider”, disponible específicamente para clientes empresariales. Esta API permite que varios participantes alineen sus sistemas de coordenadas y compartan datos a través de un transporte de red local elegido, y así crear un sistema de coordenadas común para anclajes mundiales compartidos. La privacidad y la seguridad de los datos también son de suma importancia, especialmente en apps empresariales que manejan información confidencial. Una nueva API, llamada “contentCaptureProtected”, te permite marcar elementos específicos de interfaz o escenas enteras como protegidos. Luego, el sistema oculta este contenido protegido en cualquier captura de pantalla, grabación, vista reflejada o sesión compartida, lo que garantiza que los datos confidenciales permanezcan visibles solo para el que usa el dispositivo.
- 13:37 - Visualizar el entorno
La última versión de visionOS mejora las capacidades del Apple Vision Pro para unir los mundos físico y digital. Se amplía el sistema de cámaras, lo que proporciona un mayor acceso a las cámaras del dispositivo a través de la API “CameraFrameProvider” de ARKit. Esta capacidad permite que las apps usen las imágenes de la cámara tanto en entornos de espacios envolventes como compartidos. Una nueva funcionalidad permite a las personas ampliar y mejorar áreas específicas de su visión del mundo real. Al usar “CameraRegionView” de VisionKit, los desarrolladores pueden crear ventanas que muestren transmisiones de video dedicadas de regiones seleccionadas y hacer que los detalles críticos sean más claros. Esta funcionalidad es muy útil para profesionales, como técnicos e inspectores, que necesitan monitorear medidores o componentes pequeños en áreas poco iluminadas. Puedes implementar esta funcionalidad con solo unas pocas líneas de código SwiftUI y usando las API “CameraRegionView” y “CameraRegionProvider”. Estas API ofrecen opciones de procesamiento integradas, como mejora del contraste y la vitalidad, y permiten el análisis y la modificación de imágenes personalizadas, lo que proporciona flexibilidad para diversas apps. La funcionalidad de regiones de cámara de ARKit mejora la transmisión en el Apple Vision Pro, que se puede aplicar a áreas específicas definidas por ventanas virtuales llamadas “CameraRegionAnchors”. Puedes crear estos anclajes especificando su posición, orientación y tamaño en el mundo real. ARKit luego proporciona búferes de píxeles estabilizados y mejorados para estas regiones. Esta funcionalidad permite hacer zoom y desplazarse panorámicamente, y ajusta dinámicamente la velocidad de cuadros según el algoritmo de mejora elegido. Asegúrate de tener en cuenta el uso de recursos, ya que las regiones de cámara más grandes afectan la memoria y el procesamiento.
- 24:01 - Próximos pasos
Para los mejores resultados en las apps empresariales del Apple Vision Pro, prioriza la seguridad, respeta la privacidad recopilando solo los datos necesarios, asegúrate de que las apps cumplan con los requisitos de elegibilidad (internas o B2B personalizadas) y solicita solo los derechos necesarios para una funcionalidad específica.