iPhone Duo 相機適配教學
🕒 12:592026/9/29 11:403,311 字16 張照片
本講說明如何讓相機類 App 適配 iPhone Duo:先認識雙前置攝像頭與虛擬前置攝像頭,再處理設備開合、翻轉與雙螢幕時的攝像頭方向,最後調整預覽畫面與旋轉處理。核心目標是讓使用者在任何裝置形態下,都能獲得自然、連續且方向正確的拍攝體驗。
本講重點
- iPhone Duo 首次同時搭載外屏與內屏兩顆超廣角前置攝像頭;其中內屏鏡頭是 iPhone 首款屏下攝像頭。
- 一般情況可透過虛擬前置攝像頭,自動在內外屏實體鏡頭之間無縫切換;若追求完整硬體能力,則可直接存取個別物理攝像頭。
- 直接使用物理攝像頭時,App 必須自行因應設備展開、合上與翻轉,重新配置 AVCaptureSession,持續使用正對使用者的鏡頭。
- AVCaptureDeviceDirectionCoordinator 以視圖所在螢幕為基準回報鏡頭朝向,是處理跨屏、雙螢幕與鏡像預覽的關鍵。
- 預覽設計可利用內屏額外空間,透過 AVCaptureVideoPreviewLayer 的 videoGravity 調整畫面填充與控件配置;超廣角前置攝像頭可運用方形傳感器與動態寬高比。
- 採用 AVCaptureDeviceRotationCoordinator 後,要停用攝像頭傳感器方向補償以提升性能,並以 iOS 27.1 的 SDK 建構、在實機充分測試。
概念整理:雙前置攝像頭與裝置發現
0:21iPhone Duo 的相機架構從兩顆前置攝像頭開始:外屏與內屏各有一顆超廣角攝像頭,App 可透過 AVFoundation 取得影片流。iPhone Duo 是首款同時搭載兩顆前置攝像頭的 iPhone。外屏可見一顆超廣角攝像頭,適合拍攝照片與影片;設備展開後,內屏也有一顆超廣角攝像頭,且為 iPhone 首款屏下攝像頭。既有 App 仍可透過 AVFoundation 從這些前置攝像頭採集影片流。
- 使用 AVCaptureDeviceDiscoverySession 尋找前置攝像頭:請求 front 的位置參數,並搭配廣角或超廣角的設備類型。
- 在 iPhone Duo 上,這樣的搜尋會找到新的虛擬前置攝像頭。
- 虛擬前置攝像頭是一個新的 AVCaptureDevice,可在外屏與內屏的物理攝像頭之間自動、無縫切換。
- 設備展開時,虛擬前置攝像頭會使用內屏鏡頭;合上設備時,會切至外屏前置鏡頭。
- 因此,使用虛擬前置攝像頭時,系統會替 App 選擇最符合目前使用情境的前置鏡頭。
「虛擬前置攝像頭始終會為你的app選用最契合當前使用情景的前置鏡頭。」
1:54虛擬前置攝像頭會隨 iPhone Duo 的開合,自動在內屏與外屏的實體前置攝像頭之間切換,降低一般 App 的切換負擔。概念整理:虛擬與物理攝像頭的取捨
虛擬前置攝像頭適合希望由系統管理鏡頭切換的情況;但若 App 要依使用情境打造更進階的體驗,或需要個別鏡頭的完整硬體能力,就可以直接使用指定的物理攝像頭。此時也要一併承擔鏡頭切換與方向處理的責任。
- 使用 .builtInOuterUltraWideCamera 可存取外屏前置攝像頭。
- 使用 .builtInInnerUltraWideCamera 可存取內屏攝像頭。
- 直接使用個別設備類型時,可完整使用該鏡頭的硬體能力。
- 內屏超廣角攝像頭支援最高 1080p、60fps。
- 外屏超廣角攝像頭支援最高 4K、120fps。
- 透過虛擬前置攝像頭存取時,兩顆物理攝像頭會採用相同規格,最高為 1080p、60fps。
- 深度資訊只在單獨存取物理攝像頭時支援。
- 若直接存取物理攝像頭,使用者開合 iPhone Duo 時,App 必須自行處理鏡頭切換。
3:09直接使用個別物理攝像頭可取得不同的最高規格:內屏鏡頭最高為 1080p、60fps,外屏鏡頭最高可達 4K、120fps。
3:12虛擬前置攝像頭雖可自動切換鏡頭,但會讓兩顆物理攝像頭共用最高 1080p、60fps 的規格。
3:25深度資訊僅在單獨存取物理攝像頭時提供;選擇虛擬或物理攝像頭前,需先確認 App 對規格與深度功能的需求。概念整理:為何 front 不等於正對使用者
3:55直接使用物理攝像頭時,設備開合會改變鏡頭與使用者的相對方向,App 需要利用方向協調器處理切換。在過去的 iPhone,AVCaptureDevice 的 position 通常只區分後置 back 與前置 front。但 iPhone Duo 的內屏和外屏前置攝像頭,position 都是 front,兩者卻朝向相反。因此,front 只能表示攝像頭類別,不能保證鏡頭當下正對使用者。
4:10iPhone Duo 的內屏與外屏前置攝像頭雖都回報為 front,但因兩面螢幕方向相反,實際朝向仍須依目前視圖與設備狀態判斷。- 使用者看著內屏時,App 可能正在使用外屏前置攝像頭;此時該鏡頭實際上背對使用者。
- 若 App 使用外屏前置攝像頭,使用者隨後合上設備,該鏡頭便會轉為正對使用者。
- 設備展開後若使用者翻轉裝置,也可用後置攝像頭自拍;此時 App 與後置攝像頭會同時正對使用者。
- 因此,判斷是否適合自拍、是否應切換輸入或啟用鏡像時,不能只依賴 position,應使用方向協調器。
「位置是front的攝像頭,它並不總是正對著使用者。」
概念整理:AVCaptureDeviceDirectionCoordinator
建議以 AVCaptureDeviceDirectionCoordinator 管理攝像頭朝向與開合切換。建立協調器時需要一個 UIView、要監聽的設備類型,以及狀態變更回調。回調在初始化完成後會立即執行一次,之後每逢攝像頭方向改變也會再次觸發。
5:33建立 AVCaptureDeviceDirectionCoordinator 時,需要綁定 UIView、指定要監聽的設備類型,並提供狀態變更回調。- 視圖位於外屏時:外屏前置攝像頭會被回報為朝前,後置攝像頭被回報為朝後。
- 設備展開、App 視圖移到內屏時:會收到狀態變更;外屏前置與後置攝像頭會被回報為朝後,內屏前置攝像頭則為朝前。
- 在展開狀態翻轉設備並將相機類 App 移到外屏時:後置攝像頭與外屏前置攝像頭都可能被回報為朝前。
- 方向協調器的回報嚴格相對於它所綁定視圖所在的螢幕,而非單純依設備的固定物理位置。
6:43在展開並翻轉設備的情境下,後置攝像頭與外屏前置攝像頭都可能相對於外屏視圖朝前,說明方向必須以視圖所在螢幕為準。相機類 App 可透過 Scene Accessory API 開啟雙螢幕能力,例如提詞器情境會同時擁有外屏與內屏兩個獨立 UI。每個視圖都應各自建立一個方向協調器:同一顆後置鏡頭,對外屏協調器可能是朝前,對內屏協調器則可能是朝後。
「每個協調器報告的方向都是嚴格相對於其所屬視圖所在的螢幕而言的。」
重要提醒:MainActor 與 camera actor 的安全分工
方向協調器與 UIView 深度綁定,因此被隔離在 MainActor 上。不要在方向協調器觸發的狀態變更回調裡直接呼叫 AVFoundation API,否則會混淆 UI 與相機工作執行緒的責任。
8:33方向協調器不直接傳遞 AVCaptureDevice,而是提供可安全跨執行緒傳遞的 AVCaptureDeviceDescriptor,讓 UI 與相機處理維持正確分工。- 方向協調器提供的是 AVCaptureDeviceDescriptor,不是直接提供 AVCaptureDevice。
- AVCaptureDeviceDescriptor 是 AVCaptureDevice 的 MainActor 安全且支援 Sendable 的形式。
- 描述符包含建立 AVCaptureDevice 所需的完整資訊,可安全傳遞至 camera actor。
- 在 camera actor 內部,才可自由呼叫 AVFoundation API,例如重新配置 AVCaptureSession。
重要提醒:切換輸入後要同步處理鏡像
使用者開合設備時,方向協調器的回調會告知目前哪一顆攝像頭正對使用者。此時應在 camera actor 中重新配置 AVCaptureSession,無縫切換到正對使用者的攝像頭,並重新檢查預覽鏡像。
9:00設備開合觸發方向變更後,App 應重新配置 AVCaptureSession,改由目前正對使用者的攝像頭持續拍攝。- 當物理攝像頭變成朝前方向時,請開啟預覽鏡像。
- 鏡像可使自拍預覽更符合使用者習慣,避免畫面左右感受不自然。
- 鏡頭切換不只要確認輸入來源,也必須重新確認預覽方向與鏡像狀態。
9:21當物理攝像頭朝前時,預覽應開啟鏡像,才能維持自然的自拍畫面。「當物理攝像頭變為朝前方向的時候,請記得開啓預覽的鏡像,這樣才能為使用者提供一個非常自然的自拍預覽體驗。」
9:38AVCaptureDeviceDirectionCoordinator 可在 AVKit 中使用;實作細節可再參考 Apple開發者文檔的對應技術文章。概念整理:相機預覽的版面最佳化
在 iPhone Duo 內屏以後置攝像頭完整視野取景時,預覽畫面周圍會留下額外螢幕空間。App 不一定要把預覽撐滿螢幕,而是可將這些空間轉化為更清楚的操作介面。
- 可偏移預覽畫面,將拍照控件集中排列在剩餘區域,讓完整視野與操作控件各有清楚位置。
- 也可讓預覽畫面填滿整個螢幕,依 App 的視覺風格與功能需求決定。
- 使用 AVCaptureVideoPreviewLayer 的 videoGravity,可精確控制預覽畫面在圖層邊界中的排版與填充方式。
- 設計時應比較不同顯示方式在內屏、外屏與跨屏切換時的可讀性及操作性。
10:33後置攝像頭在內屏完整視野取景時,可用 AVCaptureVideoPreviewLayer 的 videoGravity 控制預覽填充方式,並善用周圍空間配置拍照控件。使用超廣角前置攝像頭拍攝時,可發揮方形傳感器特性填滿整個螢幕。透過 AVCaptureDevice 上的動態寬高比,可在內屏輕鬆選用橫向寬高比;若要深入理解方形傳感器能力,可觀看 WWDC26 的專項影片。
10:59超廣角前置攝像頭可利用方形傳感器與 AVCaptureDevice 的動態寬高比,在內屏採用橫向畫面並更充分填滿螢幕。重要提醒:旋轉協調與性能
除了鏡頭朝向,還要處理設備旋轉。使用 AVCaptureDeviceRotationCoordinator,可讓相機預覽與拍攝出的照片始終保持正向朝上。當 App 在 iPhone Duo 的不同螢幕間切換時,旋轉協調器會自動更新狀態,協助跨屏維持一致方向。
- 接入 AVCaptureDeviceRotationCoordinator 後,記得停用攝像頭傳感器方向補償,以提升性能。
- iPhone Duo 的所有前置攝像頭預設都開啟攝像頭傳感器方向補償,因此此步驟不可忽略。
- 方向協調器處理鏡頭相對於視圖的朝向;旋轉協調器處理預覽與成像維持正向朝上,兩者用途不同且可互補。
12:00接入旋轉協調器後,應停用前置攝像頭預設開啟的攝像頭傳感器方向補償,以兼顧跨屏方向一致性與性能。課後複習
iPhone DuoAVFoundationAVCaptureDeviceDiscoverySession虛擬前置攝像頭.builtInOuterUltraWideCamera.builtInInnerUltraWideCameraAVCaptureDeviceDirectionCoordinatorAVCaptureDeviceDescriptorMainActorcamera actorAVCaptureSessionScene Accessory APIAVCaptureVideoPreviewLayervideoGravity動態寬高比AVCaptureDeviceRotationCoordinatoriOS 27.1
- 確認專案以 iOS 27.1 的 SDK 建構,作為適配 iPhone Duo 的基礎。
- 盤點 App 的拍攝需求:若重視自動切換與一致規格,評估使用虛擬前置攝像頭;若需要 4K、120fps 或深度資訊,規劃直接使用物理攝像頭。
- 若直接使用物理攝像頭,建立 AVCaptureDeviceDirectionCoordinator,並針對每個獨立 UI 視圖建立對應協調器。
- 在方向變更回調中僅傳遞 AVCaptureDeviceDescriptor 至 camera actor;由 camera actor 重新配置 AVCaptureSession,避免直接在 MainActor 回調中呼叫 AVFoundation API。
- 實作鏡頭切換後的預覽鏡像檢查:物理攝像頭朝前時開啟鏡像。
- 以 videoGravity 測試偏移預覽與全螢幕預覽兩種版面,確認控件在內屏額外空間中的配置是否合適。
- 導入 AVCaptureDeviceRotationCoordinator,並停用前置攝像頭的攝像頭傳感器方向補償。
- 在 iPhone Duo 上完整測試外屏、內屏、展開、合上、展開後翻轉,以及雙螢幕 UI 等情境,確認預覽、鏡頭選擇、鏡像與旋轉皆表現正確。
- 參考設計指南、Apple開發者文檔與 WWDC26 專項影片,補足方向協調器、旋轉協調器及方形傳感器的實作細節。