
-
공간 비즈니스 앱의 개선 사항 살펴보기
작년에 발표한 바와 같이, visionOS 26에서 최신 개선 사항과 API로 통해 접근 권한을 확장하고 엔터프라이즈 기능을 확장하는 방법을 알아보세요. 새로운 기능을 이용해 모델 훈련 워크플로를 구축하고, 비디오 피드를 개선하며, 로컬 네트워크에서 좌표 시스템을 맞춰 자체 앱에서 협업 환경을 간단히 개발해 보세요.
챕터
- 0:04 - 서론
- 1:37 - 개발 간소화하기
- 4:54 - 사용자 경험 개선하기
- 13:37 - 환경 시각화하기
- 24:01 - 다음 단계
리소스
- Building spatial experiences for business apps with enterprise APIs for visionOS
- Implementing object tracking in your visionOS app
관련 비디오
WWDC25
WWDC24
-
비디오 검색…
안녕하세요, visionOS Enterprise 팀의 엔지니어 Alex Powers입니다 WWDC에 돌아오니 좋군요
작년에는 visionOS를 위한 최초의 엔터프라이즈 API 세트가 출시되었죠 이후 Apple은 더 많은 엔터프라이즈 기능을 준비하고자 노력했습니다
새 기능을 확인하기 전에 엔터프라이즈 API의 기본 요구 사항을 살펴보겠습니다
이 API는 효용이 광범위하고 기기 접근이 더 심층적이기 때문에 이러한 API를 이용하려면 관리되는 권한, 그리고 개발자 계정에 연결된 사용권 파일이 필요합니다 또한 조직에서 임직원을 위해 개발한 독점 사내 앱이나 다른 기업에서 사내에 배포하도록 여러분이 빌드하는 맞춤형 앱을 위해 디자인되었습니다
이를 염두에 둔 상태로 이제 새로운 엔터프라이즈 API와 기존 API의 주요 개선 사항을 소개하겠습니다
먼저 개발을 간소화하고 엔터프라이즈 기능을 더 쉽게 이용할 수 있는 변경 사항을 둘러봅니다 다음으로 윈도우와 상호작용하고 근처 사용자와 콘텐츠를 공유하며 민감한 정보를 보호하는 새로운 방법을 제공해 사용자 경험을 향상하는 방법을 안내합니다 마지막으로 환경을 시각화하는 새로운 기능을 살펴봅니다
그러면 더 쉽게 엔터프라이즈 기능을 이용하고 개발을 간소화하는 방법을 보여 드리겠습니다
더 광범위한 API 이용을 필두로 작년에 도입된 여러 API를 더 광범위하게 이용하실 수 있도록 올해 몇몇 변경 사항이 있습니다
앞서 Vision Pro Developer Strap을 통해 앱이 USB 비디오 클래스 기기의 외부 비디오에 접근할 수 있는 기능이 도입되었는데요 해당 API를 사용하면 앱이 향상된 화상 회의에 UVC 호환 웹캠을 활용하거나 원격 진단에 특수 이미징 기기를 활용하거나 품질 관리에 산업용 검사 카메라를 활용할 수 있습니다
또한 고급 온디바이스 머신 러닝에 Neural Engine을 이용할 수 있게 되었습니다 최신 visionOS에서 이제 모든 개발자가 이러한 API를 사용할 수 있습니다 엔터프라이즈 사용권이나 권한 없이도 UVC 비디오 및 Neural Engine을 이용할 수 있습니다
작년에 visionOS에 객체 추적 기능이 도입되어 앱이 특정 현실 객체를 인식하고 추적할 수 있는 강력한 경험이 마련되었는데요 올해는 명령어 라인에서 직접 학습시키는 기능이 추가됩니다
즉 이제 모델 학습 과정을 자동화하고 이를 기존 파이프라인에 통합하고 객체 추적 애셋을 더 효율적으로 관리할 수 있습니다 개별 객체마다 CreateML 앱을 수동으로 사용할 필요가 없죠 이 도구는 CreateML 앱과 컨트롤이 동일합니다 이로써 새로운 작업 흐름을 활용하고 객체 추적 기능을 더 빠르고 확장 가능한 방식으로 반복할 수 있죠
엔터프라이즈 사용권 관리도 더욱 간소화됩니다
이제 Apple Developer 계정에서 사용권 파일에 바로 접근할 수 있습니다 갱신은 무선으로 앱에 자동 푸시되며 Vision Entitlement Services 프레임워크가 마련되었습니다 이 프레임워크로 특정 기능에 대해 앱이 적절한 사용권 및 승인을 받았는지 쉽게 확인할 수 있습니다 Vision Entitlement Services를 사용해 앱이 메인 카메라 접근 등 특정 엔터프라이즈 API에 접근 가능한지 확인할 수 있습니다 앱의 사용권 상태와 만료 날짜를 확인 가능합니다 향상된 성능 헤드룸 권한을 사용하는 앱의 경우 집약적 작업을 하기 전에 이 동작을 확인하여 최고의 성능을 확보할 수 있습니다
예를 들어 앱이 메인 카메라에 접근 가능하도록 제대로 구성되었는지 확인하는 방법을 보여 드리죠
먼저 프레임워크를 가져옵니다 그런 다음 공유된 Enterprise License Details 싱글톤을 사용해 먼저 사용권이 유효한지 확인한 후 mainCameraAccess에 대해 사용권이 승인되었는지 확인합니다
이렇게 최신 visionOS가 API 이용을 확장하고 모델 개발 및 엔터프라이즈 앱 관리를 용이하게 하는 방식을 알아보았습니다
이제 더 직관적이고 협력적이며 안전한 공간 앱을 빌드해 사용자 경험을 향상하는 새로운 방법을 살펴보겠습니다 우선 공간 환경에서 더 자연스러운 윈도우 상호작용을 위한 방법이 도입됩니다 특히 Vision Pro를 착용하고 움직일 때 말이죠
Window Follow 모드라고 하는데요
활성화하면 콘텐츠가 접근 가능하며 사용자의 위치에 상대적인 상태로 유지됩니다 이 동작의 활성화에 필요한 권한은 window-body-follow입니다 이 권한은 사용권이 부여된 권한으로 요청 및 관리됩니다 권한이 부여되고 앱에 포함되면 이 동작은 모든 앱의 기기에서 모든 윈도우에 대해 활성화됩니다
visionOS의 표준 윈도우는 배치된 공간에 고정됩니다 하지만 대시보드나 일련의 지침 또는 참고 자료를 자주 확인해야 하는 경우가 있죠 움직이면서 작업을 수행하는 중에 말입니다
Window Follow 모드를 사용하면 윈도우를 선택하고 사용자의 움직임에 따라 함께 움직이도록 할 수 있습니다
Window Follow 모드를 실제로 보죠
작업대에서 프로젝트에 집중하고 있는데요 동시에 매니퓰레이터 팔이 작업을 실행하고 있습니다 주 작업을 계속 방해하는 일 없이 매니퓰레이터 상태를 모니터링하려고 합니다 상태 윈도우에 대해 Window Follow 모드를 활성화하고자 윈도우 닫기 컨트롤을 길게 클릭하고 Start Follow Mode(Follow 모드 시작)를
선택하면 시작됩니다 작업 공간으로 움직이면 상태 창이 따라옵니다
이것이 Window Follow 모드입니다 사용자 경험을 강화하는 좋은 방법 중 하나죠 하지만 공간 컴퓨팅은 공유 협력 경험을 구현할 때 가장 빛을 발합니다 그리고 주역은 바로 공유 좌표 공간인데요 이 기능을 사용하면 물리적으로 함께 있는 사람들이 서로 공간 경험을 공유할 수 있습니다
누구나 앱의 콘텐츠가 물리적으로 눈앞에 있는 것처럼 자연스럽게 상호작용하고 논의할 수 있습니다 Apple은 공유 좌표 공간의 발견, 연결 및 세션 관리를 자동으로 처리하는 SharePlay 사용 상위 수준 API를 제공합니다
이에 대한 별도의 세션이 있습니다 “근거리에 있는 사람들과 visionOS 경험 공유하기”입니다
SharePlay는 바로 매우 쉽게 사용할 수 있지만 더 큰 제어권이 필요한 시나리오도 있습니다 자체 맞춤형 네트워킹 인프라와 통합해야 할 수도 있습니다 기업 요구 사항에 따라 기기 통신을 직접 처리해야 할 수도 있고요
이러한 사용 사례를 위해 특히 기업 고객용으로 공유 좌표 공간을 설정할 수 있는 새로운 ARKit API가 도입됩니다 SharedCoordinateSpaceProvider API죠 이 API로 여러 참여자가 좌표계를 맞출 수 있습니다 이를 위해 ARKit에서 생성된 특정 데이터를 원하는 로컬 네트워크 전송으로 교환합니다 각 참여자는 이 데이터를 다른 참여자와 지속적으로 공유합니다 이 지속적인 공유를 통해 공통 좌표계가 생성되어 공유 세계 앵커가 모든 사람에게 지속적으로 표시됩니다
그러면 이제 이 API를 사용해 맞춤형 공유 경험을 빌드하는 방법을 살펴보겠습니다
SharedCoordinateSpaceProvider 사용은 ARKit 데이터 제공자를 이용한 적이 있다면 간단합니다
World Tracking 또는 Hand Tracking과 비슷하게 인스턴스화하고 활성 ARKitSession에서 실행합니다 실행하면 SharedCoordinateSpaceProvider가 CoordinateSpaceData 객체에 캡슐화된 필요 정렬 정보를 생성합니다 pull 기반 API를 사용해 이 데이터와 제공자의 nextCoordinateSpaceData() 함수를 검색하게 됩니다 제 앱은 이 CoordinateSpaceData를 다른 참여자에게 전송해 공유 좌표 공간을 설정하는 역할을 합니다 따라서 완전한 제어권이 확보되죠 원하는 어떤 네트워킹 계층이든 사용할 수 있습니다
반대로 여러분의 앱이 네트워크를 통해 다른 참여자에게 CoordinateSpaceData를 수신하면 여러분은 이것의 push() 메서드를 호출해 이를 로컬 SharedCoordinateSpaceProvider에 제공합니다 각 수신 데이터에는 발송자의 고유 participantID가 태그로 지정되죠 마지막으로 제공자는 세션 라이프 사이클 관리에 도움이 되는데요 참여자가 공유 공간을 나간 시점 등 중요한 변경 사항에 대해 알려 주는 eventUpdates 비동기 시퀀스를 제공합니다
이것이 코드에서 작동하는 방법을 보여 주는 예를 살펴보겠습니다
SharedCoordinateSpaceProvider를 먼저 만들고 ARKitSession에서 실행합니다 네트워크의 다른 참여자에게서 데이터가 도착하면 푸시 데이터로 로컬 제공자의 이해 내용을 업데이트합니다 nextCoordinateSpaceData() 함수를 호출해 제 기기가 공유해야 하는 데이터를 받습니다 네트워크로 브로드캐스트할 준비가 된 제 로컬 상태를 나타내는 CoordinateSpaceData 객체를 제공하는 함수죠
그리고 이 논리는 제 맞춤형 공유 공간 관리의 핵심을 형성합니다 ARKit의 좌표 정렬을 사용하여 네트워킹 계층을 잇죠
이것이 사내 앱에 쉽게 협력을 추가할 수 있는 ARKit의 엔터프라이즈 개발자용 Shared Coordinate API입니다 제 사용자 경험 개선 최종 목표는 데이터 개인정보 보호와 보안이죠 많은 기업용 앱은 민감한 정보 재무 데이터, 환자 기록, 독점 디자인 또는 기밀 의사소통 내용을 처리합니다 그리고 매우 유용하다고는 하지만 SharePlay나 화면 캡처 및 녹화, 화면 미러링 같은 기능은 의도치 않게 민감한 데이터를 노출할 수 있습니다 따라서 캡처 가능한 내용 및 다른 사용자와 공유 가능한 내용을 제어할 수 있는 새로운 API가 마련되었습니다
SwiftUI의 새로운 보기 수정자 contentCaptureProtected인데요 보호된 콘텐츠 권한이 있는 앱에서 지원됩니다 사용자 인터페이스 요소나 전체 RealityKit 장면에 추가하면 됩니다 콘텐츠가 보호됨으로 표시되면 화면 캡처, 녹화, 미러링 또는 공유 보기 시 시스템이 자동으로 해당 콘텐츠를 가립니다 다만 기기를 착용한 사용자에게는 콘텐츠가 정상적으로 보입니다 일반적인 기업 사용 사례의 예를 보여 드리죠
회사 문서용 중앙 리포지토리 역할을 하며 모든 직원이 접근할 수 있는 앱입니다 그러나 시스템의 특정 문서는 민감한 정보가 포함되어 있어 널리 공유해서는 안 됩니다 이러한 문서를 다른 사무실의 제 팀과 공유하고 있는데요 여기서 팀은 우리의 회의록과 내년 계획을 볼 수 있습니다 두 문서 모두 저에게 보이고 팀과 공유됩니다 여기 분기 보고서에 자물쇠 아이콘이 있죠
이 보고서는 공유해서는 안 되고 그래서 원격 디스플레이에서 팀에 표시되지 않습니다
보호된 콘텐츠의 실제 모습을 보았으니 이제 구현 방법을 알아보겠습니다 이 예에는 하위 보기가 포함된 문서 보기가 있는데 이름은 SensitiveDataView입니다 여기에는 Vision Pro에서만 보여야 하는 정보가 있습니다 이를 보호하기 위해 보기 수정자 contentCaptureProtected를 추가합니다 이제 시스템은 이 콘텐츠를 공유하려는 시도가 있을 때마다 피드를 가립니다 이 콘텐츠 보호 기능을 Optic ID, Single Sign-On 등 기업 인증 흐름과 통합할 수도 있습니다
이렇게 앱 2D 및 3D 콘텐츠를 보호하는 방법을 살펴보았습니다 같은 간단한 수정자를 사용해 보호할 수 있죠
이러한 기능은 디지털 공간 내에서의 경험을 향상합니다 이제 환경을 시각화하고 물리적 세계와 디지털 세계를 잇도록 디자인된 기능을 중점적으로 살펴보겠습니다
먼저 Vision Pro에서 카메라 접근을 확장합니다
Vision Pro는 정교한 카메라 시스템을 사용해 전방 카메라로 착용자의 환경을 캡처해 패스스루 경험을 제공합니다
작년에 기기의 왼쪽 메인 카메라 비디오 피드에 접근할 수 있는 API를 소개했죠 올해는 개별 왼쪽 또는 오른쪽 카메라에 직접 접근하거나 스테레오 처리 및 분석을 위해 양쪽 모두에 접근할 수 있도록 이 API를 확장했습니다 이미 익숙하실 수도 있는데 ARKit의 CameraFrameProvider API입니다
그리고 이제 몰입형 공간 및 공유 공간 환경 모두에서 카메라 피드 지원을 이용 가능하므로 앱이 다른 앱 및 윈도우와 함께 작동할 수 있습니다
이렇게 최신 visionOS에서 카메라 접근이 유연해졌음을 알아보았고
이제 주변의 세부 사항을 시각화하는 새로운 방법을 볼까요
전문가는 흔히 작업 영역의 구체 세부 사항을 모니터링해야 합니다 예를 들어 기술자가 복잡한 기계의 소형 게이지를 읽어야 하거나 검사관이 조명이 어두운 곳에서 부품을 검사해야 할 수 있습니다
이를 위해 Vision Pro 착용자가 현실 보기의 특정 영역을 선택해 그 영역의 전용 비디오 피드를 제공할 수 있는 강력한 새로운 기능이 도입됩니다
중요한 세부 사항이 더 명확하도록 이 피드를 확대/향상할 수 있죠
VisionKit에 CameraRegionView라는 새 SwiftUI 보기가 추가되었습니다 향상할 영역 위에 이 윈도우를 시각적으로 배치하면 됩니다 그러면 CameraRegionView가 자신의 위치를 사용해 가상 카메라에 적절한 영역 및 공간을 제공합니다
더 세밀한 제어가 필요하다면 ARKit의 새 CameraRegionProvider API를 사용할 수 있습니다
이렇게 하면 직접 접근이 가능하며 ARKit을 이미 사용 중이거나 앵커에 익숙하거나 구체적인 UI 요구 사항이 있다면 유용합니다
제가 예로 만든 상태 앱을 사용해 작동 방식 데모를 살펴보겠습니다
앞서 보았던 제 프로젝트가 표시되어 있는데요 이번에는 작업하는 동안 시스템의 압력을 모니터링하고자 합니다
상태 앱의 Inspector (인스펙터) 윈도우를 열어 게이지 앞에 배치합니다
보시다시피 게이지의 비디오 피드가 상태 앱에 나타났습니다 이제 작업으로 돌아가 작업 중 압력을 계속 확인할 수 있습니다
이제 SwiftUI 및 VisionKit API를 사용해 코드 몇 줄로 앱에 카메라 영역을 추가한 방법을 보여 드리겠습니다
먼저 VisionKit을 가져옵니다
표준 SwiftUI 보기를 정의합니다 InspectorView라고 하겠습니다 여기에 카메라 영역이 포함됩니다 이 보기의 핵심은 CameraRegionView입니다 초기화를 위해 IsContrastAndVibrancyEnhancementEnabled 매개변수를 사용하고 true를 전달해 대비와 생동감 향상으로 안정화를 활성화합니다 말씀드렸듯이 이 보기는 자체 윈도우에 자리해야 하는데 윈도우의 위치를 사용해 패스스루의 어떤 부분이 처리되는지 결정하기 때문입니다 이를 위해 앱 구조체를 볼까요
이것이 제 앱 구조체입니다 주요 앱 콘텐츠를 위한 기본 WindowGroup이 있습니다 InspectorView를 위한 두 번째 WindowGroup을 만들겠습니다
앱에 카메라 영역을 추가하기에 충분하죠 CameraRegionView는 더 복잡한 앱의 경우 클로저를 지원합니다 이 클로저를 사용해 카메라 이미지를 분석하도록 코드를 변경하겠습니다 나중에 이미지를 파일에 저장하는 기능을 추가할 수도 있겠죠
CameraRegionView를 수정해 클로저를 허용하도록 하겠습니다 그러면 각 카메라 프레임을 도착하는 대로 처리할 수 있습니다
먼저 카메라 프레임을 캡처해 앱의 나머지 부분에 전달하기 위해 만든 cameraFeedDelivery를 추가합니다
클로저는 CameraRegionView의 pixelBuffer를 사용합니다 여기서 오류를 확인하고 cameraFeedDelivery 클래스에 pixelBuffer를 전달합니다 클로저는 nil을 반환하는데 제가 pixelBuffer를 수정하지 않았음을 나타냅니다 맞춤형 처리에도 이 클로저를 사용할 수 있습니다 pixelBuffer를 수정해 반환하면 CameraRegionView가 조정된 카메라 이미지를 렌더링합니다
이렇게 코드 몇 줄로 앱에 카메라 영역을 추가했습니다 제 예에서는 대비와 생동감 향상을 활성화했습니다 그런데 카메라 영역 API는 두 가지 기본 제공 처리 기능을 제공합니다 첫 번째는 이미지 안정화입니다 자연스러운 머리 움직임 시 콘텐츠를 고정하고 안정적으로 유지하는 역할을 하죠 두 번째는 대비와 생동감 향상입니다 이는 안정화를 포함하며 밝기와 색상 표현을 최적화합니다
이제 카메라 영역에 대한 ARKit의 API를 살펴보겠습니다 앱에 특정 3D 객체와 연결된 카메라 영역이 필요할 수 있습니다 또는 환경의 특정 객체를 인식한 후 카메라 영역을 배치해야 할 수 있습니다 앱에서 이 정도로 앵커 및 3D 객체를 세밀하게 제어해야 하는 경우 이 API는 하위 수준 프리미티브를 제공하며 여러분은 앵커를 정의해야 합니다
ARKit에서 앵커는 가상 윈도우의 변형과 물리적 크기를 미터 단위로 지정해 현실에 해당 윈도우를 정의합니다 이 윈도우는 패스스루 카메라 피드의 안정화된 직접 보기가 표시되는 영역을 정의하죠
물리적 공간에 직접 가상 카메라를 배치하는 것과 같습니다 이 가상 카메라는 visionOS 윈도우에 연결할 필요가 없습니다 Vision Pro 카메라의 보기 내 모든 위치의 피드를 생성할 수 있습니다
이제 API를 자세히 살펴보겠습니다
ARKit에는 CameraRegionProvider란 새로운 데이터 제공자가 있습니다 카메라 영역 통합은 익숙한 ARKit 패턴을 따릅니다 먼저 ARKitSession에서 데이터 제공자를 실행합니다 다른 ARKit 기능에서처럼요 제공자가 실행 상태가 되면 다음은 카메라 영역의 부분을 정확히 지정하는 것입니다 이를 위해 CameraRegionAnchor를 생성하고 제공자에 추가합니다 이러한 앵커는 현실에서 가상 카메라에 원하는 정확한 영역을 지정하는 것과 같습니다 ARKit이 실행되면 제공자는 이런 앵커에 업데이트를 보내는데 각기 새 pixelBuffer가 포함됩니다 이 버퍼에는 해당 공간 영역의 안정화된 보기가 포함되어 있고요
이러한 앵커를 생성하는 방법을 자세히 살펴보겠습니다
CameraRegionAnchor 생성은 간단합니다 표준 6자유도 변환을 사용해 세계에서의 위치와 방향을 정의합니다 그런 다음 실제 크기, 너비 높이를 미터 단위로 지정합니다 이러한 매개변수가 함께 카메라 영역의 현실 윈도우를 정의합니다 또한 윈도우 대비를 향상할지 그냥 안정화할지 ARKit에 알려 주어야 합니다 그런 다음 CameraRegionProvider에 추가합니다 앵커를 추가한 후 anchorUpdates(forID:)를 호출하고 newAnchor의 앵커 ID를 전달합니다 이제 카메라 피드가 앵커로 지정된 위치에 정확히 나타나고 코드가 업데이트별로 제공되는 pixelBuffer를 처리할 수 있죠
이렇게 환경의 특정 영역을 파악하는 데 매우 유용한 도구인 ARKit의 카메라 영역을 살펴보았습니다 이 주제를 마무리하기 전에 몇 가지 명심하실 점을 알려 드리겠습니다 CameraRegionView의 패스스루 콘텐츠는 SwiftUI 보기처럼 표준 기술로 확대/축소 또는 패닝 가능합니다 이러한 변환을 구현한다면 원격으로 저장하거나 전송하는 모든 카메라 프레임에도 적용되도록 하세요 향상 알고리즘은 최선의 이미지 품질을 위해 프레임 속도를 동적으로 조정한다는 점을 이해해야 합니다 대비 향상 대신 안정화를 선택하면 프레임 속도가 높아지는데 안정화에 처리 능력이 덜 필요하기 때문입니다 ARKit의 카메라 영역은 강력하며 어떤 크기의 영역이든 가능하지만 리소스 사용량에 유의해야 합니다 카메라 영역이 크면 자연히 메모리와 처리에 큰 영향을 미치죠
마지막으로 경험을 디자인하는 과정에서 전반적인 리소스 사용을 평가하는 것이 좋습니다 대규모 향상 영역으로 작업할 때 특히 그렇습니다 지침을 드리자면 CameraRegionAnchor가 패스스루 콘텐츠를 표시하는 데 전반적인 표시 영역의 약 1/6 이하를 사용하도록 하세요
지금까지 물리적 세계와 디지털 세계를 잇도록 디자인된 주제와 올해 추가된 여러 기업용 향상 사항의 마지막 부분을 살펴보았습니다 UVC 접근, 객체 추적 등 핵심 기능의 유연성 향상부터 Window Follow 모드 앱 보호 콘텐츠, 카메라 영역 도입까지 알아보았죠 앱 작업에 이 모든 기능을 활용할 다양한 방법을 찾으실 수 있을 겁니다
그러면 최종 지침을 드리며 마무리하겠습니다
첫째, 환경 안전에 유의하세요 사용자가 Vision Pro를 착용하고 작업을 안전하게 수행할 수 있는 적절한 위치에 있도록 하세요 특히 현실 장비와 상호작용할 때 말이죠 특히 카메라 및 센서에 대한 접근이 향상되면서 책임도 커진다는 점에 유의하세요 접근 대상 데이터와 접근 이유를 사용자에게 투명하게 알리세요 업무 환경의 사용자 개인정보 보호를 존중해 현재 작업에 필요한 정보만 수집하도록 앱을 디자인하세요 앱과 사용 사례가 자격 요건을 충족하도록 하세요 자사 직원을 위해 개발된 독점 사내 앱이나 다른 기업을 위해 빌드되었으며 비공개로 배포되는 맞춤형 B2B 앱이 대상입니다 이러한 항목을 확인한 후 자격을 충족한다면 앱의 특정 기능에 실제로 필요한 기업 권한만 요청하세요
마지막으로 Apple에 피드백을 공유해 주세요 이러한 특정 API뿐만 아니라 visionOS에서 멋진 기업용 앱을 빌드하는 데 필요한 향후 기능에 대한 의견을 기다립니다
시청해 주셔서 감사합니다 멋진 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 - 서론
Apple은 작년에 Enterprise API를 했고 올해에는 새로운 기능 및 개선 사항을 다양하게 선보입니다. 사내 전용 앱을 위해 설계된 이러한 API를 사용하려면 관리형 권한 및 라이선스 파일이 필요합니다. 이번 업데이트는 개발 간소화, 사용자 경험 향상, 새로운 환경 시각화 기능 활성화에 초점을 맞춥니다.
- 1:37 - 개발 간소화하기
최신 visionOS는 API 액세스를 확장하여 기기 기능을 향상합니다. 주요 개선 사항으로는 보다 광범위한 API 가용성, 객체 추적 기능 강화, 단순화된 기업 라이선스 관리 등이 있습니다. UVC와 호환 가능한 웹캠 액세스 및 Neural Engine API 등 작년에 도입된 여러 API는 이제 기업 라이선스가 없는 모든 개발자가 사용할 수 있습니다. 이제 명령줄에서 직접 객체 추적 모델을 교육하여 프로세스를 자동화하고 이를 기존 라인에 통합할 수 있습니다. 이제 Apple Developer 계정 내에서 라이선스 파일에 액세스할 수 있고, 갱신은 자동으로 진행되며, 새로운 프레임워크를 사용하여 개발자는 특정 기능에 대한 라이선스 상태 및 앱 승인을 쉽게 확인할 수 있습니다.
- 4:54 - 사용자 경험 개선하기
visionOS 26의 몇 가지 새로운 기능 덕분에 공간 애플리케이션에서의 사용자 경험이 향상됩니다. 이러한 기능 중 하나는 Window Follow Mode로, 사용자가 공간 환경을 탐색할 때 윈도우를 함께 이동할 수 있도록 지원합니다. 이는 이동하는 동안 정보를 빈번하게 참조해야 하는 작업에서 특히 유용합니다. 이 모드를 활성화하려면 라이선스가 부여된 특정 자격을 요청하고 관리해야 합니다. 또한 공간 컴퓨팅은 협업을 위해서도 향상됩니다. 공유 좌표 공간을 통해 물리적으로 함께 있는 사람들이 공간 경험을 공유할 수 있습니다. 마치 앱 콘텐츠가 물리적으로 존재하는 것처럼 모두가 앱 콘텐츠와 상호작용하고 이에 대해 논의할 수 있습니다. SharePlay를 활용하여 쉽게 설정할 수 있고 아니면 더 세밀한 제어를 위해 특별히 기업 고객을 위해 마련된 ‘SharedCoordinateSpaceProvider’라는 새로운 ARKit API를 사용할 수 있습니다. 이 API를 사용하면 여러 명의 참여자가 좌표 시스템을 정렬하고 선택한 로컬 네트워크 전송을 통해 데이터를 공유할 수 있어 공유 세계 앵커에 대한 공통 좌표 시스템을 생성할 수 있습니다. 개인 정보 보호 및 보안 또한 극도로 중요한데, 특히 민감한 정보를 처리하는 앱 기업에서는 더욱 중요합니다. ‘contentCaptureProtected’라는 새로운 API를 사용하면 특정 사용자 인터페이스 요소 또는 전체 장면을 보호되었다고 표시할 수 있습니다. 그런 다음 이 시스템은 모든 화면 캡처, 녹화, 미러링된 뷰 또는 공유 세션 내 보호된 이러한 콘텐츠를 자동으로 가려 기기를 착용한 사용자만 민감한 데이터를 볼 수 있도록 합니다.
- 13:37 - 환경 시각화하기
최신 visionOS는 실제 및 디지털 세상을 연결하는 Apple Vision Pro의 기능을 향상합니다. 카메라 시스템이 확장되어 ARKit ‘CameraFrameProvider’ API를 통해 기기의 카메라에 더욱더 잘 액세스할 수 있습니다. 이러한 기능을 사용하면 앱은 몰입감 넘치는 환경 및 공유 공간 환경 모두에서 카메라 피드를 활용할 수 있습니다. 새로운 기능을 사용하면 사람들은 실제 뷰 영역을 확대하고 강화할 수 있습니다. VisionKit의 ‘CameraRegionView’를 사용하면 개발자들은 선택한 영역의 전용 동영상 피드를 표시하는 윈도우를 생성하여 중요한 세부 사항을 더 명확하게 표시할 수 있습니다. 이 기능은 조명이 어두운 곳에 있는 작은 게이지 또는 구성 요소를 모니터링해야 하는 기술자 및 검사자와 같은 전문가에게 특히 유용합니다. ‘CameraRegionView’ 및 ‘CameraRegionProvider’ API를 활용하여 SwiftUI 코드 몇 줄로 이 기능을 구현할 수 있습니다. 이러한 API는 대비 및 생동감 강화와 같은 내장형 처리 옵션을 제공하고 사용자 지정 이미지 분석 및 수정을 허용하여 다양한 애플리케이션에 대한 유연성을 제공합니다. ARKit의 카메라 영역 기능은 ‘CameraRegionAnchors’라고 하는 가상 윈도우에서 정의된 특정 영역에 적용될 수 있는 Apple Vision Pro의 패스스루 카메라 피드 기능을 향상합니다. 실제 환경에서 위치, 방향, 크기를 지정하여 이러한 앵커를 생성할 수 있습니다. 그런 다음 ARKit은 이러한 영역에 대해 안정화되고 향상된 픽셀 버퍼를 제공합니다. 이 기능을 통해 확대/축소 및 이동이 가능하고 선택한 향상 알고리즘에 따라 프레임 속도를 동적으로 조절할 수 있습니다. 카메라 영역이 크면 메모리 및 처리에 영향을 미치기 때문에 리소스 사용량을 고려해야 합니다.
- 24:01 - 다음 단계
Apple Vision Pro 기업 앱에서 최상의 결과를 달성하기 위해 안전을 우선시하며, 필요한 데이터만 수집하여 개인 정보를 존중하고, 앱이 자격 요구 사항(사내 전용 또는 사용자 지정 B2B)을 충족하는지 확인하며, 특정 기능에 필요한 권한만 요청합니다.