LODY/정리

애플 플랫폼 백과사전 / iOS 앱 샌드박스와 Extension 정리

iOS 앱 샌드박스와 Extension 정리

앱 샌드박스

  • iOS 앱은 모두 샌드박스 안에서 동작. 다른 앱·시스템 자원에 임의 접근 불가
  • 목적: 보안 경계 + 리소스 사용 규제
  • 격리 범위
    • 파일 시스템: 앱마다 독립된 홈 디렉토리
    • 네트워크: 자체 URLSession·캐시
    • 메모리: 프로세스 단위 격리
    • Keychain: 기본은 앱 전용. access group 명시 시에만 공유
    • UserDefaults: 앱 번들 단위

샌드박스가 막는 것

  • 다른 앱 데이터 직접 읽기·쓰기
  • 시스템 파일·설정 임의 수정
  • 백그라운드에서 장시간 동작
  • 푸시 도달 시점에 메인 앱을 강제로 깨우기

이 중 일부는 "반드시 해야 하는 작업"에 속함. 예컨대 푸시가 왔을 때 이미지를 첨부해 보여 주려면 네트워크를 타야 하고, 홈 화면 위젯을 그리려면 앱이 꺼진 상태에서도 뷰를 구성해야 함.


App Extension

앱 샌드박스 안에서는 할 수 없는 작업을 OS가 "특정 목적의 독립 프로세스"로 따로 열어 둔 체계.

  • 메인 앱과 다른 프로세스에서 실행
  • 메인 앱과 다른 샌드박스. 메인 앱의 캐시·UserDefaults·Keychain(기본)이 보이지 않음
  • 실행 시간·메모리·네트워크 접근이 Extension 종류별로 별도 제한
  • 필요 시 App Group으로 일부 자원 공유 가능

주요 Extension 종류

Extension역할제약
Notification Service Extension푸시 payload 가공 (Rich Push·메타데이터 디코딩)~30초 실행, ~24MB 메모리
Notification Content Extension알림 UI 커스터마이즈알림 노출 순간만 동작
Widget Extension홈 화면·잠금 화면 위젯timeline 기반, 제한된 렌더링
Background Modefetch·silent push·오디오·위치 등작업 유형별 허가 필요, 스로틀링 존재
Intents ExtensionSiri·단축어짧은 응답 시간 요구
Share Extension공유 시트메인 앱과 독립 동작
Action Extension선택 텍스트·이미지 액션제한된 UI
Document Provider Extension파일 선택 UI파일 I/O 중심

App Group으로 공유하기

Extension이 메인 앱과 데이터를 공유해야 할 때 사용.

설정

  • 메인 앱·Extension Entitlements에 같은 App Group identifier 추가 (group.com.example.shared)

공유 경로

  • 파일 시스템: FileManager.default.containerURL(forSecurityApplicationGroupIdentifier:)
  • UserDefaults: UserDefaults(suiteName: "group.com.example.shared")
  • Keychain: 각 타깃의 Keychain Sharing entitlement에 같은 access group 명시

주의

  • 공유는 명시적으로 써야만 됨. 같은 키를 메인 앱 쪽에서 UserDefaults.standard에 썼다면 Extension에서 공유 suite로 읽어도 값이 없음
  • 메모리 공유 안 됨. IPC 형태로 파일 또는 UserDefaults를 경유

실무 체크리스트

  • Extension 타깃의 번들 ID는 메인 앱 접두사 규칙을 따름 (예: com.app.ios.NotificationService)
  • Provisioning Profile이 Extension마다 별도 필요
  • 실행 시간 제한을 대비해 fallback 경로 마련 (예: serviceExtensionTimeWillExpire())
  • 메모리 제한에 맞춰 외부 리소스(이미지 등) 크기 정책 합의
  • Extension에서 네트워크가 필요하면 자체 URLSession 구성
  • 메인 앱 데이터가 필요하면 App Group 구성 후 공유 경로로 접근
  • Release 빌드에서 Extension 포함 여부·코드 서명 체크

참고