앱 샌드박스
- 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 Mode | fetch·silent push·오디오·위치 등 | 작업 유형별 허가 필요, 스로틀링 존재 |
| Intents Extension | Siri·단축어 | 짧은 응답 시간 요구 |
| 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 포함 여부·코드 서명 체크
참고
- Apple Developer Documentation — App Extension Programming Guide
- WWDC — App Extensions 관련 세션 (연도별)