본문 바로가기

App Extension #1 본문

iOS Technologies

App Extension #1

SJ_Repsect 2025. 6. 5. 15:49

1. App Extension이란?

  • 앱의 기능을 시스템 전역으로 확장해 주는 모듈형 바이너리
  • 호스트 앱과 분리된 프로세스로 실행되어 보안·안정성을 확보
  • 하나의 “확장 가능한 시스템 영역”을 Extension Point라고 부르며, OS가 각 포인트마다 전용 API·가이드(정책)를 제공

2. 앱 확장 프로그램 유형

https://developer.apple.com/app-extensions/

 

App Extensions - Apple Developer

App extensions let you extend custom functionality and content beyond your app and make it available to users while they’re interacting with other apps or the system.

developer.apple.com

 

iOS, iPadOS, macOS, tvOS, visionOS, watchOS는 여러 유형의 확장 프로그램을 지원하며, 각 확장 프로그램은 공유, 알림 센터, Safari 등 시스템의 단일하고 범위가 명확한 영역에 연결됩니다.

 

확장 지점 설명 iOS/iPadOS MacOS tvOS VisionOS watchOS
행동 공유 시트에 사용자 정의 작업을 추가하여 모든 앱에서 앱의 기능을 호출할 수 있습니다.    
오디오 유닛 GarageBand나 Logic Pro X 등 음악 제작 앱을 포함해 사운드를 사용하는 모든 앱에서 오디오를 만들고 수정합니다.    
인증 서비스 단일 로그인을 활성화하여 사용자 인증을 간소화합니다.    
계정 인증 수정 사용자 비밀번호를 자동으로 강력한 비밀번호로 업그레이드하거나, Apple로 로그인을 사용하도록 계정을 변환합니다.        
자동 채우기 자격 증명 공급자 비밀번호 자동 완성에서 앱의 자격 증명을 표면화하고 앱의 비밀번호 데이터를 비밀번호 자동 완성 워크플로로 가져옵니다.    
전화번호부 앱의 사용자 지정 연락처 목록에서 발신자 식별 정보를 표시하여 사용자가 누가 전화하는지 알 수 있도록 합니다.      
ClassKit 콘텐츠 제공자 앱의 활동 상태를 업데이트하여 Schoolwork 앱에서 상태를 볼 수 있도록 하세요.    
연락처 제공자 시스템 전체 연락처 생태계에 연락처 항목을 제공합니다.        
콘텐츠 차단기 Safari 요청에서 요소 숨기기, 로드 차단, 쿠키 제거에 대한 규칙을 제공합니다.    
사용자 정의 키보드 고유한 입력 방법이나 특정 언어에 맞게 시스템 전체에 맞춤형 텍스트 입력을 제공합니다.        
파일 제공자 다른 앱이 귀하의 앱에 저장되고 관리되는 문서와 디렉토리에 접근하도록 허용합니다.    
파일 제공자 UI 앱에서 관리하는 문서에 대한 문서 브라우저의 상황에 맞는 메뉴에 사용자 지정 작업을 추가합니다.        
파인더 동기화 백엔드 저장 서비스와 파일을 동기화 상태로 유지합니다.        
아이메시지 사용자가 텍스트, 스티커, 미디어 파일, 대화형 메시지를 보낼 수 있도록 허용합니다.        
의도 Siri를 사용하여 사용자가 앱과 상호 작용할 수 있도록 하세요.
인텐트 UI Siri 대화나 지도에서 앱과의 상호작용을 위한 인터페이스를 사용자 정의하세요.      
실시간 발신자 ID 조회 직접 관리하는 서버에서 발신자 ID 및 통화 차단 서비스를 제공합니다. iOS에서만 사용 가능합니다.        
위치 푸시 서비스 사용자의 승인을 받아 위치 공유 앱이 Apple Push Notification 서비스(APNs)에서 보내는 푸시에 응답하여 사용자의 위치를 ​​쿼리할 수 있도록 합니다.        
우편 사용자 정의 작업 추가, 콘텐츠 차단, 메시지 서명 및 인코딩 등을 통해 메일을 개선하세요.      
메시지 필터 원치 않는 SMS 및 MMS 메시지를 식별하고 필터링합니다.      
회로망 VPN, 프록시, 콘텐츠 필터링과 같은 시스템 수준의 네트워킹 서비스를 제공합니다.    
알림 센터 앱의 알림 경고 모양을 사용자 지정하세요.    
알림 서비스 사용자 기기에 표시되기 전에 원격 알림의 페이로드를 수정합니다.  
영구 토큰 토큰을 사용하여 사용자 계정과 키체인에 대한 액세스 권한을 부여합니다.    
사진 편집 사진 앱 내에서 앱이 자산을 직접 편집할 수 있도록 허용합니다.      
사진 프로젝트 프로젝트 생성을 지원하는 확장 기능으로 macOS 사진 앱을 강화하세요.        
빠른 보기 미리보기 앱이 소유한 문서의 미리보기를 제공하여 모든 앱에서 볼 수 있도록 합니다.      
사파리 서비스 웹 기술과 네이티브 코드를 활용하여 Safari에서 웹 브라우징 경험을 확장하세요.      
공유하다 사용자가 어떤 앱에서든 귀하의 소셜 네트워크 서비스에 게시할 수 있도록 하세요.    
스마트 카드 토큰 하드웨어 기반 토큰을 사용하여 사용자 계정과 키체인에 대한 액세스 권한을 부여합니다.        
스포트라이트 가져오기 앱의 콘텐츠를 Spotlight, Safari, Siri 등에서 검색할 수 있도록 설정하세요.    
스티커 팩 메시지에 사용자 정의 스티커를 추가합니다.        
썸네일 모든 앱에서 사용자 정의 문서 유형의 축소판을 표시합니다.    
TV 상단 선반 Top Shelf 콘텐츠와 tvOS 앱에 대한 설명을 제공하여 사용자가 앱을 발견할 수 있도록 도와주세요.        
원치 않는 커뮤니케이션 앱의 사용자 지정 불요 발신자 데이터베이스를 사용하여 수신 전화를 차단합니다.        
가상 컨퍼런스 사용자 캘린더의 이벤트에 영상 회의 서비스를 직접 통합하세요.    
위젯 iOS 홈 화면과 잠금 화면, macOS 알림 센터, watchOS의 합병증 등 앱에서 관련성 있고 한눈에 볼 수 있는 콘텐츠를 표시합니다.    
Xcode 소스 편집기 Xcode 소스 편집기 내에서 직접 사용자 정의 편집 기능을 제공합니다.        

 

 

TIP : 구현하고자 하는 기능이 위 표에서 어떤 Extension Point에 속하는지 먼저 결정한 뒤, Xcode → New Target → 해당 템플릿을 선택해 시작하면 편하다.


3. 구조 · 빌드 · 배포

단계 설명
생성 앱 안에 별도 Target으로 생성 → 다른 타겟처럼 Info / Build Settings / Resource 구분
컴파일 App Extension은 독립 바이너리로 빌드·샌드박싱됨
앱 번들링 완성된 extension binary는 호스트 앱과 함께 App Store에 제출
설치 후 활성화 사용자는 유형별 절차(알림 센터 편집, 설정 앱, 시스템 환경설정 등)를 통해 수동 활성화

 

4. App Extension vs App

https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple_ref/doc/uid/TP40014214-CH2-SW2

 

App Extension Programming Guide: Understand How an App Extension Works

App Extension Programming Guide

developer.apple.com

 

구분 App App Extension
실행 주체 독립 프로세스 호스트 앱에 의해 로드된 별도 프로세스
역할 완전한 기능 제공 정해진 Extension Point(공유·키보드·위젯 등) 안에서 단일 작업 수행
종료 시점 사용자가 명시 종료 또는 OS 결정 호스트 앱 요청을 모두 처리하면 시스템이 자동 종료
5. 생명주기
① 선택 사용자(또는 시스템)가 호스트 앱 UI에서 Extension을 선택
② 생성·연결 시스템이 Extension 인스턴스 생성 → 호스트와 통신 채널(NSExtensionContext) 설정
③ 작업 수행 Extension이 호스트가 전달한 컨텍스트 데이터(예: 선택한 텍스트)로 UI 표시·작업 수행
• 사용자가 완료 / 취소 / 닫기 선택
• 필요 시 짧은 백그라운드 작업 가능
④ 종료 결과를 completeRequest(returningItems:…) 등으로 호스트에 전달 → 시스템이 Extension 프로세스 해제
 

6. 통신 모델

 
  • 직접 통신 금지 :
    일반적으로 컨테이닝 앱은 컨테이닝 익스텐션이 실행되는 동안에는 실행되지 않습니다. 앱 익스텐션의 컨테이닝 앱과 호스트 앱은 전혀 통신하지 않습니다.
  • 공유 방법 :
    일반적인 요청/응답 트랜잭션에서 시스템은 호스트 앱을 대신하여 앱 익스텐션을 열고, 호스트가 제공하는 익스텐션 컨텍스트 에서 데이터를 전달합니다 . 앱 익스텐션은 사용자 인터페이스를 표시하고, 일부 작업을 수행하며, 익스텐션의 목적에 적합한 경우 호스트로 데이터를 반환합니다.
  • 앱 익스텐션과 이를 포함하는 앱 간에 가능한 제한적인 상호작용을 나타냅니다. Today 위젯(다른 앱 익스텐션 유형은 아님)은 클래스 openURL:completionHandler:의 메서드를 호출하여 시스템에 포함하는 앱을 열도록 요청할 수 있습니다. NSExtensionContext 의 읽기/쓰기 화살표에서 알 수 있듯이 , 모든 앱 익스텐션과 이를 포함하는 앱은 비공개로 정의된 공유 컨테이너의 공유 데이터에 접근할 수 있습니다.
 

메모 : 시스템은 내부적으로 프로세스 간 통신(IPC)을 사용하여 호스트 앱과 앱 익스텐션이 함께 작동하여 일관된 경험을 제공할 수 있도록 합니다. 코드에서는 확장 지점과 시스템에서 제공하는 상위 수준 API를 사용하기 때문에 이러한 기본 통신 메커니즘에 대해 생각할 필요가 없습니다.

 

4. 공유 데이터·파일

App Groups Extension-앱 간 UserDefaults · 파일 공동 사용
UIDocumentPicker / File Provider Document Provider Extension 전용
Keychain Sharing 보안 자격 공유

 

 

5. 제한 사항

UIApplication.shared 접근 멀티-윈도, 상태 관리 충돌 방지
NS_EXTENSION_UNAVAILABLE API 사용 HealthKit·EventKit UI 등 앱 전용 프레임워크 금지
카메라·마이크 직접 사용 권한·자원 충돌
장시간 백그라운드 실행 배터리·자원 절약 (단, NSURLSession 전송 후 결과 보고는 가능)
AirDrop 수신 대용량 전송·UI 제약 (ActivityViewController로 송신만 가능)
 

6.  Extension 사용 시 체크리스트

  1. Extension Point가 요구 사항과 일치하는지 확인
  2. Info.plist에 NSExtensionPointIdentifier, 권한 등 정확히 설정
  3. 공유 데이터가 필요하면 App Groups 활성화
Comments