View in English

  • 메뉴 열기 메뉴 닫기
  • Apple Developer
검색
검색 닫기
  • Apple Developer
  • 뉴스
  • 둘러보기
  • 디자인
  • 개발
  • 배포
  • 지원
  • 계정
페이지에서만 검색

빠른 링크

5 빠른 링크

비디오

메뉴 열기 메뉴 닫기
  • 컬렉션
  • 주제
  • 전체 비디오
  • 소개

더 많은 비디오

  • 소개
  • 요약
  • 자막 전문
  • 코드
  • 캡처 제어 기능으로 카메라 경험 향상하기

    카메라 경험에서 캡처 제어를 사용자 정의하는 방법을 알아보세요. 새로운 AirPods 지원을 비롯하여 모든 물리적 캡처 제어로 사진을 찍는 방법과 카메라 컨트롤로 설정을 조정하는 방법을 보여드립니다.

    챕터

    • 0:00 - 서론
    • 2:51 - 물리적 캡처
    • 3:01 - 이벤트 처리하기
    • 6:39 - AirPods 원격 캡처
    • 10:00 - 카메라 제어

    리소스

    • Accessing the camera while multitasking
    • AVFoundation
    • AVMultiCamPiP: Capturing from Multiple Cameras
    • Capture setup
    • Capturing Photos with Depth
    • Creating a camera experience for the Lock Screen
    • Creating a camera extension with Core Media I/O
    • DockKit
    • Forum: Photos & Camera
    • Scanning data with the camera
    • Supporting Continuity Camera in your macOS app
    • Supporting Continuity Camera in your tvOS app
      • HD 비디오
      • SD 비디오

    관련 비디오

    WWDC24

    • 잠금 화면 카메라 캡처 경험을 멋지게 빌드하기

    WWDC23

    • iPadOS 앱에 외장 카메라 지원하기
    • tvOS에서 연속성 카메라 사용하기
  • 비디오 검색…

    안녕하세요 저는 Vitaliy입니다 AVKit 팀의 엔지니어로 일하고 있습니다 캡처 제어 기능으로 카메라 경험 향상하기에 오신 것을 환영합니다 이 세션에서는 앱에서 사용자 상호작용 개선을 위한 새 방법을 살펴보겠습니다 캡처 제어를 사용하면 물리적 버튼 제스처를 카메라 동작에 프로그래밍 방식으로 매핑 가능합니다 네이티브 iOS 카메라 앱의 친숙한 느낌을 제공합니다 iOS 26에 도입된 놀라운 새로운 기능도 선보일 예정입니다 여러분에게 정말 유용할 것 같습니다

    캡처 제어의 힘을 설명하겠습니다 iOS에서 앱 카메라를 사용해 보겠습니다 화면의 UI 버튼으로 사진을 찍는 대신 휴대폰의 실제 버튼을 활용해봅시다

    볼륨 높이기 버튼을 간단히 클릭하기만 하면 캡처를 시작할 수 있습니다

    하지만 이 API는 단순한 클릭에 관한 것이 아닙니다 길게 누르는 것도 지원합니다 예를 들어, 카메라 모드에서 볼륨 낮추기 버튼을 길게 누르면 비디오 녹화가 시작됩니다

    바로 그렇게 캡처 제어를 사용하면 사용자로 하여금 더 유연하게 카메라를 사용해 iPhone으로 잊지 못할 순간을 포착할 수 있습니다

    이 세션에서는 먼저 물리적 캡처가 무엇인지 알아보겠습니다 어떤 물리적 버튼이 지원되는지도 알아볼 것입니다 앱에서 API를 효과적으로 사용하는 방법도 보여드리겠습니다 사용자 상호작용에 반응하고 견고하고 반응성이 뛰어난 카메라 인터페이스를 구축하는 것입니다 데모에서 본 것처럼 말이죠

    또한 iOS 26의 흥미로운 새로운 기능도 살펴보겠습니다 AirPods를 사용한 원격 카메라 제어입니다

    마지막으로 저의 동료 Nick이 iPhone 16 카메라 제어를 간략히 소개할 예정입니다

    API의 핵심 기능을 살펴보기 전에 iOS에서 멋진 카메라 경험을 선사하는 것과 관련된 주요 프레임워크를 검토해 보겠습니다 카메라 앱 아키텍처의 핵심은 AV Foundation입니다 API를 통해 저수준 캡처 기능을 제공하죠 사진의 경우 AVCapturePhotoOutput과 유사합니다 비디오의 경우 AVCaptureMovieFileOutput과 유사하죠

    AV Foundation과 UI 레이어를 결합하려면 프레임워크 위에 AVKit를 두어야 합니다

    AVKit에 포함된 캡처 전용 API 중 하나는 AVCaptureEventInteraction입니다

    이제 주요 기능을 살펴보죠 AVCaptureEventInteraction의 역량도 볼 것입니다 이 API를 사용하면 볼륨 버튼과 같은 물리적 버튼의 기본 동작을 재정의할 수 있습니다 iPhone 16에서 도입된 카메라 제어와도 유사하죠

    AVCaptureEventInteraction이 지원하는 또 다른 버튼은 동작 버튼입니다 작년의 세션을 확인해 보세요 캡처용 동작 버튼을 구성하는 방법에 대한 세션입니다

    물리적인 버튼을 누를 때마다 캡처 이벤트 알림이 트리거됩니다 이 알림에는 이벤트 단계가 포함되어 있어 인쇄기 전체 수명 주기를 정확하게 제어할 수 있습니다 가능한 단계는 세 가지입니다 시작: 버튼을 누르는 순간입니다 앱의 카메라 객체를 준비하는 데 제격이죠

    취소됨: 앱이 배경으로 이동하는 순간을 위한 것입니다 아닌 경우 캡처가 불가능합니다

    종료: 버튼을 놓는 순간입니다 이 단계는 카메라 객체가 캡처를 시작해야 하는 단계입니다

    AVCaptureEventInteraction은 또한 주요 동작과 보조 동작 사이의 버튼 누름을 구별합니다 버튼을 누르면 캡처 알림이 트리거됩니다 지정된 처리자에게만 전송되죠

    주요 동작은 볼륨 낮추기 버튼을 통해 트리거됩니다 동작 버튼과 카메라 제어 버튼도 동일합니다 2차 동작은 볼륨 높이기 버튼으로 실행됩니다 동일한 버튼은 두 핸들러를 모두 트리거할 수 없습니다 서로 다른 동작을 나타내도록 설계되었기 때문입니다 2차 핸들러는 선택 사항입니다 지정되지 않은 경우 볼륨 높이기를 클릭하면 주요 동작이 트리거됩니다 이러한 디자인은 앱에 모듈성을 도입합니다 더 높은 유연성으로 사용자를 위한 훌륭한 카메라 경험을 디자인할 수 있게 해주죠 이 API는 캡처 사용 사례를 위해 만들어졌습니다 시스템은 카메라를 자주 사용하는 앱에만 캡처 이벤트를 전송합니다 이 API를 채택하면 기본 물리적 버튼 동작이 무시됩니다 앱은 수신된 모든 이벤트에 항상 적절하게 응답해야 합니다 이벤트 처리에 실패하면 버튼이 작동하지 않아 좋지 않은 사용자 경험을 제공합니다

    백그라운드 캡처 앱 또는 활성 AVCaptureSession이 실행 중이 아닌 앱의 경우 어떠한 이벤트도 수신하지 않습니다 모든 버튼을 누르면 기본 시스템 동작이 트리거됩니다 볼륨 조절이나 카메라 실행과 같은 기능입니다

    AVCaptureEventInteraction은 UIKit를 위해 특별히 디자인된 API이지만 SwiftUI 개발자도 기능에 접근할 수 있습니다 onCameraCaptureEvent 뷰 수정자를 통하면 되죠 둘 중 하나를 채택하면 동일한 작업이 발생합니다

    AVCaptureEventInteraction을 이해했으니 간단한 카메라 앱을 만들어 봅시다 SwiftUI onCameraCaptureEvent 뷰 수정자를 사용합니다 물리적 버튼으로 사진 촬영을 허용하죠 사용자 카메라 앱 인터페이스 정의부터 시작해 보겠습니다 화면에 카메라 출력을 표시하는 CameraView를 포함합니다

    뷰에서 사진을 찍을 수 있는 버튼도 추가해 보겠습니다 이 버튼을 카메라 모델에 연결해 보겠습니다 탭하면 사진 촬영이 시작되도록요

    이제 사용자가 화면 버튼을 누르면 사진을 찍는 기능 뷰가 있습니다 그러나 어떤 물리적인 버튼을 누르면 시스템 작업이 실행됩니다 이 세션에서 언급한 API로 카메라를 누르는 하드웨어 버튼을 만들어봅시다 먼저 AVKit 프레임워크를 가져옵니다 그 다음 onCameraCaptureEvent 뷰 수정자를 CameraView에 붙입니다 그리고 이벤트 단계가 끝났다면 사진을 찍습니다

    매우 간단합니다 단 6줄의 새 코드로 같은 사진 캡처용 직관적 물리적 버튼 상호작용을 활성화합니다 내장된 카메라 앱에서와 같죠 이것이 Capture Controls API를 레버리지하는 것의 힘입니다 올해 AVCaptureEventInteraction가 AirPod 스템 하나를 클릭하면 트리거되는 기본 작업도 지원됩니다 특히 H2 칩이 장착된 AirPods에서 제공됩니다 이를 통해 사용자는 원격으로 잊지 못할 순간을 포착합니다 휴대 전화와 상호 작용할 필요가 없죠

    이미 API를 채택했다면 이 기능은 곧 iOS 26에서 무료로 제공될 예정입니다

    이제 이 새로운 기능이 실제로 작동하는 모습을 봅시다 먼저 오른쪽 AirPod를 먼저 넣고 그 다음 왼쪽 것을 넣겠습니다

    멋진데요

    그런 다음 캡처를 위한 AirPods를 구성하려면 설정으로 이동해

    “원격 카메라 캡처“ 섹션까지 아래로 스크롤합니다

    거기서 클릭하면 캡처가 실행될 유형을 선택할 수 있습니다 저는 “한 번 누르기“ 옵션을 선택하겠습니다

    이제 카메라 앱으로 돌아가 보겠습니다

    몇 걸음 뒤로 물러서 그리고 스템 중 하나를 클릭하여 사진을 찍습니다

    이제 기기를 건드리지 않고 카메라를 제어할 수 있습니다

    원격 카메라 제어에 AirPods가 사용되기 때문에 오디오 피드백이 매우 중요합니다 사용자가 캡처 중 화면을 볼 수 없을 수도 있으므로 그들의 명령이 인식되었음을 확인시켜 주어야 합니다

    따라서 사운드 재생을 제어하는 새로운 API를 소개합니다 특히 AirPod 스템 클릭에 적합하죠 AirPod 클릭 이외 다른 것으로 캡처 이벤트가 트리거되는 경우 AVCaptureEventInteraction 객체 사운드 피드백을 제어할 수 없습니다

    사용자 편에 추가 작업 없이도 AVCaptureEventInteraction에 이 새로운 기능을 제공하기 위해 AirPods 클릭에 대한 기본 톤을 추가했습니다

    하지만 사운드가 사용 사례에 적합하지 않을 수 있기에 사운드 재생을 사용자 정의할 수 있도록 했습니다 앱 번들 내에서 사용자 고유의 사운드를 제공하면 됩니다

    카메라 앱으로 돌아가 보겠습니다 특히 onCameraCaptureEvent 뷰 수정자를 보겠습니다 iOS 26에서는 이 코드를 변경하지 않고 그대로 두면 사용자가 AirPod 스템을 클릭하면 기본 사운드가 들립니다 우리는 사진 촬영을 위한 앱을 특별히 만들고 있기 때문에 기본 사운드가 앱에 적합하지 않을 수 있습니다

    특정 시나리오에 맞게 캡처 사운드를 조정하려면 먼저 defaultSoundDisabled 매개변수로 기본 사운드를 비활성화합니다

    오디오 피드백이 필요한 경우 이벤트 객체의 playSound 메서드로 카메라 셔터 사운드를 재생합니다 shouldPlaySound 속성은 캡처 동작이 AirPod 스템 클릭으로 인해 트리거된 경우에만 참이 됩니다

    요약하자면 AVCaptureEventInteraction API는 앱을 위한 고품질 카메라 경험 구축 과정을 크게 단순화합니다 API의 주요 기능과 구현을 위한 모범 사례를 검토했습니다 올해의 업데이트인 AirPod 스템 클릭으로 카메라 촬영을 제어하는 방법을 포함했죠 이제 Nick에게 AVCaptureControls에 대해 이야기해 보겠습니다 안녕하세요 저는 닉 루피네티입니다 저는 카메라 경험 팀의 소프트웨어 엔지니어입니다 AVCaptureControl을 소개하게 되어 기쁩니다 iPhone 16에서 카메라 인터페이스 상의 실물 하드웨어를 통해 카메라 제어를 활성화하는 강력한 방법이죠 카메라 제어는 다재다능한 캡처 도구입니다 클릭하면 카메라 앱이 실행되고 셔터 버튼 역할을 할 수 있죠 손가락을 한 곳에 고정한 채로 빠르게 조정할 수 있습니다

    세 가지 기능을 순서대로 살피고 출시부터 시작해 보겠습니다 앱을 실행하려면 카메라 제어에 앱 액세스 권한이 필요합니다 기기가 잠긴 경우에도요 잠금 화면 캡처 확장 프로그램을 만들어야 한다는 뜻입니다 자세한 내용은 작년 세션 중 잠금 화면 카메라 환경을 구축하는 방법을 살펴보세요

    앱의 셔터 버튼으로 카메라 컨트롤을 사용하는 것은 쉽습니다 Vitaliy가 이전에 보여준 캡처 이벤트 API 중 하나를 설정하면 다 된 겁니다 카메라 제어는 동일한 기본 이벤트 콜백을 실행합니다 볼륨 버튼은 이미 제공했습니다 이제 제가 가장 좋아하는 부분인 카메라 설정을 조정하는 것입니다 카메라 제어는 가벼운 누르기 제스처를 지원합니다 기존 카메라 셔터처럼요 구성에 집중할 수 있도록 말끔한 미리보기를 활성화하죠 컨트롤을 밀어서 조정할 수 있는 설정이 제공됩니다 다른 설정은 가볍게 두 번 눌러 선택할 수 있습니다 그런 다음 카메라 제어를 슬라이드하고 다시 가볍게 눌러 확인합니다

    가장 높은 수준에서는 두 가지 종류의 제어가 있습니다 숫자 값에 대한 슬라이더와 목록의 항목에 대한 피커입니다

    슬라이더에는 연속형과 불연속형의 두 가지 유형이 있습니다

    연속 슬라이더로 지정된 범위에서 모든 숫자 값을 선택합니다 예로서, iOS는 기본적으로 연속 확대/축소 슬라이더를 제공합니다 전체 확대/축소 요소를 지원합니다 운영하는 디바이스의 권장 최소값과 최대값 사이를 오가죠 개별 슬라이더는 숫자 값도 선택합니다 귀하가 제공한 명시적 세트나 또는 한 값에서 다른 값으로 고정된 단계를 거치죠 iOS는 노출 편향을 구동하기 위해 내장된 개별 슬라이더를 제공하죠 플러스/마이너스 2 사이에서 1/3씩 증가하죠 전통적인 사진 촬영 방식에서 관리 가능한 단위입니다

    선택기는 개별 슬라이더와 마찬가지로 한정된 선택을 허용하지만 인덱싱됩니다 각 인덱스는 컨트롤의 명명된 상태에 매핑됩니다 플래시의 경우 “켜짐“ 및 “꺼짐“과 같이 말이죠 또는 카메라 앱의 사진 스타일 이름과 같습니다 이제 다양한 유형의 컨트롤을 이해했으므로 이를 구현하는 클래스를 살펴보겠습니다 컨트롤은 AV Foundation 프레임워크에서 정의됩니다 AVCaptureControl은 다른 클래스가 상속받는 추상 기본 클래스입니다

    두 개의 시스템 정의 하위 클래스가 있습니다 모든 앱이 내장 카메라 앱과 동일한 동작을 채택할 수 있죠 줌이나 노출 편향 조정 시에요 슬라이더의 경우 두 개의 일반 하위 클래스가 있습니다 연속적 및 불연속적 클래스를 포함하죠 그리고 피커의 동작은 직접 정의할 수 있습니다 앱에서 컨트롤을 채택하려면 AVCaptureSession에 컨트롤을 추가합니다 일반적으로 세션을 구성하는 첫 단계는 캡처 기기 구축입니다 그리고 이를 세션에 추가하고 입력으로 래핑합니다 다음으로, 사용자 대신 속성을 이끌 수 있도록 같은 디바이스를 참고하는 시스템 정의 컨트롤입니다 앱에서 정의한 동작이 있는 모든 컨트롤은 또한 이 시점에 생성됩니다 마지막으로 각 컨트롤이 세션에 추가됩니다

    앱이 카메라 제어와 상호 작용하는 사람으로 응답하려면 고려해야 할 흐름이 몇 가지 있습니다 시스템 제공 컨트롤이 카메라 제어에서 구성된 기기에 직접 값을 적용합니다 videoZoomFactor 또는 exposureTargetBias를 직접 설정할 필요가 없습니다

    하지만 모델이 있거나 업데이트가 필요한 UI가 있을 수 있습니다 이미 관찰 또는 KVO 중인 Key-Value를 사용해 관련 속성 변경 사항을 알고자 한다면 그 메커니즘을 계속 사용해 인터페이스를 업데이트합니다

    KVO를 사용하지 않는 경우 액션 핸들러로 시스템 제어를 생성합니다 이는 값이 변경됨에 따라 메인 스레드에서 호출되어 UI를 직접 업데이트할 수 있습니다

    앱 정의 컨트롤은 항상 액션 콜백을 사용해 생성됩니다 사용자가 지정한 대기열에서 실행됩니다 제어가 캡처 설정을 구동을 해야 하는 경우 대기열을 지정하여 동기적으로 할 수 있습니다 해당 상태를 관리하는 곳이죠 그런 다음 UI를 메인 대기열에 업데이트할 수 있습니다

    이제 도입할 준비가 되었습니다 비탈리와 함께 만들고 있는 앱의 카메라 제어 기능이죠 그가 캡처 상호작용을 추가했기 때문에 제어는 이미 사진을 찍기 위한 셔터 버튼과 같이 작동합니다 추가적인 코드 없이도요

    하지만 카메라 제어로 안팎으로 확대/축소도 지원하고 싶습니다 현재 구성 중인 위치는

    기기 사용을 위한 캡쳐 세션과 같습니다 먼저 실제로 지원되는 컨트롤이 있는지 확인해 보겠습니다 카메라 제어가 있는 기기에서만 사용 가능하기 때문입니다 iPhone 16처럼요

    시스템 제공 제어를 만드는 것은 코드 한 줄만 있으면 됩니다

    컨트롤을 추가하기 전에 세션이 이를 수락할지 확인하세요 예로서 기기에 대한 시스템 제공 확대/축소 제어가 이미 줌 제어와 연결되었다면 추가할 수 없습니다 마지막으로 세션에 컨트롤을 추가합니다

    이제 줌을 작동시켰습니다 앱에서 완벽히 구현했죠 하지만 이런 문제가 있습니다 확대/축소를 위한 핀치 제스처도 지원합니다 카메라 제어로 확대한 후 UI가 최신이 아닌 것을 보았습니다 오래된 확대/축소 요소로 인해 핀치 제스처가 점프백 되었어요 쉽게 해결할 수 있는 문제입니다 액션 클로저로 슬라이더를 만들 것입니다 인수로서 줌 요인을 받죠 새로운 값이 UI에 적용됩니다 대리자 콜백이나 관찰 가능한 모델 속성을 가졌죠

    모델 뒤에 핀치 제스처가 동기화되어 있습니다 카메라 제어로 확대/축소가 가능합니다 핀치는 항상 오른쪽 확대/축소 요소에서 시작되죠

    이제 바로 사용할 수는 없는 컨트롤을 추가하고 싶습니다 하지만 우리만의 것을 만들기 전에 훌륭한 통제력을 만드는 요소가 무엇인지 생각해 보겠습니다 카메라 제어는 이름 그대로 iPhone 카메라와 함께 사용하도록 되어 있습니다 그래서 캡처의 모양이나 경험에 영향을 미칠 것입니다 컨트롤이 앱의 관련 없는 영역에 영향을 미칠 때 혼란스러워집니다 단순히 카메라 제어를 채택하려고 캡처 세션을 도입하면 안 됩니다 카메라를 실행하려면 전원 과 개인정보 보호 요구사항이 캡처 경험을 위해 할당되어야 하기 때문입니다 사용자 정의 컨트롤의 좋은 예는 피커입니다 앱이 지원하는 효과나 필터를 반복하죠

    이러한 컨트롤은 일반적으로 UI보다는 캡처에 더 가깝게 작동해야 합니다 어떤 모습인지 확인해 보겠습니다 방금 작성한 코드부터 시작하여 줌 컨트롤을 여러 개 중 하나로 만들겠습니다 추가할 수 있는 컨트롤 수에는 제한이 있습니다 세션의 maxControlsCount 속성에서 보고되죠 canAddControl은 한계에 도달하면 false를 반환합니다 이제 효과를 정의할 수 있습니다 효과는 전용 대기열에서 렌더링될 수 있습니다 비디오 샘플 버퍼를 사용합니다 하지만 앱의 경우 iOS 17에서 도입된 반응 효과를 사용하겠습니다 여기서 효과의 순서 있는 목록과 그 이름을 작성했습니다 사용 가능한 순서 없는 세트 중에서 말이죠 피커는 표시할 효과 이름으로 초기화됩니다 옵션을 반복하는 시점에요 피커 자체에도 이름이 필요합니다 줌 컨트롤과 구별하기 위한 SF Symbols 이미지도 필요합니다 현재 지원되지 않는 경우 제어 기능을 비활성화하는 것이 좋습니다 생략하는 것보다 좋습니다 여전히 보이기는 하지만 상호 작용은 허용되지 않습니다 그렇지 않으면 다른 컨트롤이 대체 컨트롤로 선택됩니다 사용자에게 혼란을 야기할 수 있습니다

    사용자가 피커의 선택된 인덱스를 변경하면 해당 반응을 수행할 것입니다 세션 대기열에 대한 작업을 목표로 삼고 있습니다 기기를 관리하기 위한 격리된 컨텍스트이기 때문입니다 이제 남은 일은 피커를 컨트롤 배열에 추가하면 되죠 어떻게 했는지 확인해 볼까요

    카메라 제어와 상호 작용하면서 이 새로운 구성에서는 확대/축소가 비활성화되어 있습니다 제어 방식을 바꿔봅시다 오버레이에서 스와이프하면 목록에서 피커 확인이 가능합니다 스크롤해서 가볍게 눌러서 옵션을 표시하겠습니다 이제 각 효과를 차례로 선택하고 미리 보기에서 재생합니다

    잘 했습니다

    Vitaliy와 제가 이 세션에서 보여드린 것과 같이 세계적 수준의 카메라 앱 제작을 위한 훌륭한 도구가 많아요

    iOS 기기에서 물리적 버튼 미디어 캡처 법을 보았습니다 AirPods와 iOS 26의 상호작용이 얼마나 쉽게 작동하는지도요 카메라 제어를 편리한 도구로 활용하는 방법을 배웠습니다 앱의 캡처 상호작용을 극대화하기 위한 것이었죠 developer.apple.com/kr에는 더 훌륭한 리소스가 있습니다 카메라 제어를 위한 휴먼 인터페이스 가이드라인과 AirPods 설정 안내, 새로운 기능을 테스트하기 위한 안내 및 샘플 코드와 문서도 포함되어 있습니다 카메라 제어 도입 방법에 대한 자세한 정보를 참고하세요 이목을 끄는 카메라를 만드시기를 기대하고 있어요 시청해 주셔서 감사합니다

    • 5:35 - Initial PhotoCapture view setup

      import SwiftUI
      
      struct PhotoCapture: View {
          var body: some View {
              VStack {
                  CameraView()
              }
          }
      }
    • 5:37 - Connecting a button to the camera model

      import SwiftUI
      
      struct PhotoCapture: View {
          let camera = CameraModel()
          var body: some View {
              VStack {
                  CameraView()
                  Button(action: camera.capturePhoto) {
                      Text("Take a photo")
                  }
              }
          }
      }
    • 6:10 - Importing AVKit

      import AVKit
      import SwiftUI
      
      struct PhotoCapture: View {
          let camera = CameraModel()
          var body: some View {
              VStack {
                  CameraView()
                  Button(action: camera.capturePhoto) {
                      Text("Take a photo")
                  }
              }
          }
      }
    • 6:14 - Setting up onCameraCaptureEvent view modifier

      import AVKit
      import SwiftUI
      
      struct PhotoCapture: View {
          let camera = CameraModel()
          var body: some View {
              VStack {
                  CameraView()
                  .onCameraCaptureEvent { event in
                      if event.phase == .ended {
                         camera.capturePhoto()
                      }
                  }
                  Button(action: camera.capturePhoto) {
                      Text("Take a photo")
                  }
              }
          }
      }
    • 8:53 - Default sound for onCameraCaptureEvent view modifier

      .onCameraCaptureEvent { event
      	if event.phase == .ended {
         	camera.capturePhoto() 
        }
      }
    • 9:13 - Play photo shutter sound on AirPod stem click

      .onCameraCaptureEvent(defaultSoundDisabled: true) { event in
          if event.phase == .ended {a
              if event.shouldPlaySound {d
                  event.play(.cameraShutter)
              }
          }
          camera.capturePhoto()
       }
    • 14:46 - Add a build-in zoom slider to Camera Control

      captureSession.beginConfiguration()
      
      // configure device inputs and outputs
      
      if captureSession.supportsControls {
          let zoomControl = AVCaptureSystemZoomSlider(device: device)
      
          if captureSession.canAddControl(zoomControl) {
              captureSession.addControl(zoomControl)
          }
      }
      
      captureSession.commitConfiguration()
    • 15:40 - Modifying the built-in zoom slider to receive updates when zoom changes

      let zoomControl = AVCaptureSystemZoomSlider(device: device) { [weak self] zoomFactor in
          self?.updateUI(zoomFactor: zoomFactor)
      }
    • 16:46 - Adding a custom reaction-effects picker alongside zoom slider

      let reactions = device.availableReactionTypes.sorted { $0.rawValue < $1.rawValue }
      let titles = reactions.map { localizedTitle(reaction: $0) }
      let picker = AVCaptureIndexPicker(“Reactions", symbolName: “face.smiling.inverted”,
          localizedIndexTitles: titles)
      
      picker.isEnabled = device.canPerformReactionEffects
      picker.setActionQueue(sessionQueue) { index in
          device.performEffect(for: reactions[index])
      }
      
      let controls: [AVCaptureControl] = [zoomControl, picker]
      
      for control in controls {
          if captureSession.canAddControl(control) {
              captureSession.addControl(control)
          }
      }
    • 0:00 - 서론
    • 카메라 앱에서 사용자 상호작용을 개선할 수 있는 AVKit 및 AVFoundation을 사용하는 방법에 대해 알아보세요. 이제 볼륨 ‘업’ 및 ‘다운’과 같은 물리적 버튼 제스처를 카메라 동작에 프로그래밍 방식으로 매핑할 수 있어 사람들은 휴대폰 버튼을 사용하여 사진을 찍고 동영상 녹화를 시작할 수 있습니다. iOS 26의 새로운 기능은 AirPods를 사용한 원격 카메라 제어입니다. 지원되는 물리적 버튼, AVCaptureEventInteraction API 사용 방법, iPhone 16의 카메라 제어의 개요에 대해 알아보세요.

    • 2:51 - 물리적 캡처
    • AVCaptureEventInteraction은 동작 버튼을 지원합니다. 구성에 대한 세부 사항은 작년 세션인 ・€・시스템 전반으로 앱의 제어 기능 확장하기・€・에서 확인할 수 있습니다.

    • 3:01 - 이벤트 처리하기
    • AVCaptureEventInteraction은 카메라 앱 내에서 물리적으로 버튼을 누를 때의 수명 주기를 제어할 수 있도록 지원해 주는 API입니다. ‘시작됨’, ‘취소됨’, ‘종료됨’ 등 3개의 이벤트 단계를 제공합니다. ‘종료됨’ 단계는 카메라 객체가 캡처를 시작해야 하는 단계입니다. API는 특정 버튼으로 트리거되는 기본 동작과 보조 동작을 구분합니다(기본 동작은 볼륨 다운, 동작, 카메라 제어, 보조 동작은 볼륨 업). 이러한 디자인 덕분에 모듈식 및 유연한 앱 디자인이 가능합니다. SwiftUI 개발자는 ‘onCameraCaptureEvent’ 뷰 수정자를 통해 이 기능에 액세스할 수 있습니다. AVKit 프레임워크를 가져오고 이 수정자를 CameraView에 첨부하면 단 몇 줄의 코드로 물리적 버튼을 사용하여 사진 캡처를 지원해 내장형 카메라 앱의 동작을 모방할 수 있습니다.

    • 6:39 - AirPods 원격 캡처
    • iOS 26부터 H2 칩이 장착된 AirPods를 사용하면 스템 클릭을 통해 원격 카메라 제어를 할 수 있습니다. 사용자는 설정 앱에서 이 기능을 구성하고 사진 캡처를 트리거하는 스템 클릭 동작을 선택할 수 있습니다. 이러한 스템 클릭에 대한 오디오 피드백을 제공하기 위해 기본 톤을 포함하여 새로운 API가 도입되었지만, 특정 앱 맞게 이 사운드를 사용자 지정할 수 있습니다. 이러한 개선 사항을 통해 손을 사용하지 않고도 순간을 포착할 수 있고 오디오 신호를 통해 명령을 확인할 수 있습니다.

    • 10:00 - 카메라 제어
    • AVCaptureControl은 카메라 인터페이스용 물리적 하드웨어 제어를 생성할 수 있도록 지원하는 iPhone 16의 새로운 기능입니다. 이를 통해 사람들은 앱 카메라를 실행하고 빠르게 카메라 설정을 조정할 수 있으며 이 기능은 셔터 버튼 역할을 할 수 있습니다. 제어 기능은 숫자 값에 대한 슬라이더(연속적 및 불연속적)와 목록의 항목에 대한 피커 등 두 가지 주요 조절 유형을 지원합니다. 이러한 제어 기능은 AVFoundation 프레임워크에서 정의됩니다. 확대/축소 또는 노출 편향에 시스템에서 정의한 제어 기능을 추가하거나 앱에서 정의한 동작을 사용하여 사용자 제어 기능을 생성할 수 있습니다. 그런 다음 이러한 제어 기능이 AVCaptureSession에 추가되면 앱이 동작 핸들러 또는 Key-Value Observing(KVO)을 통해 상호작용에 응답하여 그에 따라 UI를 업데이트합니다. 카메라 앱 기능을 향상하려면 카메라 제어를 활용하여 확대/축소와 같은 시스템에서 제공하는 제어 기능을 쉽게 추가할 수 있습니다. 이 제어 기능은 코드 한 줄만 있으면 됩니다. 그러나 세션이 제어 기능을 허용하고 UI를 제어 기능의 상태와 동기화하여 오래된 확대/축소 요소와 같은 문제를 방지하는 것이 중요합니다. 사용자 지정 제어 기능을 생성할 때는 카메라 제어가 경험을 캡처하기 위해 특별히 고안되었다는 사실을 고려하세요. 사용자 지정 제어 기능의 좋은 예는 효과 또는 필터를 선택할 수 있도록 지원하는 선택기입니다. 이 제어 기능은 UI보다 포착 세션에 더 근접하게 작동해야 합니다. 효과를 정의하고, 효과 이름을 사용하여 선택기를 초기화하며, 지원되지 않을 때 제어 기능을 비활성화할 수 있습니다. 동작을 세션 대기열을 대상으로 하면 기기의 적절한 분리 및 관리를 보장할 수 있습니다. 카메라 제어를 사용하면 사람들의 관심을 사로잡는 세계적인 수준의 카메라 앱을 만들 수 있습니다.

Developer Footer

  • 비디오
  • WWDC25
  • 캡처 제어 기능으로 카메라 경험 향상하기
  • 메뉴 열기 메뉴 닫기
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    메뉴 열기 메뉴 닫기
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    메뉴 열기 메뉴 닫기
    • 손쉬운 사용
    • 액세서리
    • 앱 확장 프로그램
    • App Store
    • 오디오 및 비디오(영문)
    • 증강 현실
    • 디자인
    • 배포
    • 교육
    • 서체(영문)
    • 게임
    • 건강 및 피트니스
    • 앱 내 구입
    • 현지화
    • 지도 및 위치
    • 머신 러닝 및 AI
    • 오픈 소스(영문)
    • 보안
    • Safari 및 웹(영문)
    메뉴 열기 메뉴 닫기
    • 문서(영문)
    • 튜토리얼
    • 다운로드(영문)
    • 포럼(영문)
    • 비디오
    메뉴 열기 메뉴 닫기
    • 지원 문서
    • 문의하기
    • 버그 보고
    • 시스템 상태(영문)
    메뉴 열기 메뉴 닫기
    • Apple Developer
    • App Store Connect
    • 인증서, 식별자 및 프로파일(영문)
    • 피드백 지원
    메뉴 열기 메뉴 닫기
    • 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(영문)
    메뉴 열기 메뉴 닫기
    • Apple과의 만남
    • Apple Developer Center
    • App Store 어워드(영문)
    • Apple 디자인 어워드
    • Apple Developer Academy(영문)
    • WWDC
    Apple Developer 앱 받기
    Copyright © 2025 Apple Inc. 모든 권리 보유.
    약관 개인정보 처리방침 계약 및 지침