0Pricing
Swift Academy · 강의

앱 확장 기능 개요

공유, 동작 및 기타 확장 기능을 이해합니다.

앱 확장 기능 개요은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

앱 확장이란

앱 확장을 사용하면 앱이 다른 앱이나 시스템 화면 안에서 콘텐츠 공유, 사용자 설정 키보드, Spotlight 색인 등의 기능을 제공할 수 있습니다. 각 확장은 시스템이 정의한 진입점과 자체 수명 주기 및 샌드박스를 갖는 별도의 대상입니다.

// Extensions run in their own process, launched
// by the host (Photos, Safari, Messages, the system),
// not by your main app.

호스트, 컨테이너, 샌드박스

세 가지 구성 요소가 있습니다. 호스트 앱이 확장을 호출하고, 컨테이너 앱이 확장을 포함하며, 확장 자체는 샌드박스 안에서 실행됩니다. 확장은 앱과 자유롭게 통신할 수 없으며, 직접 메모리 접근이 아니라 앱 그룹을 통해 통신합니다.

import Foundation
// Container app + Extension target share data via
// an App Group, e.g. group.com.example.app
let group = "group.com.example.app"
_ = group

공유 확장

공유 확장은 시스템 공유 시트에 나타나 사용자가 모든 앱에서 콘텐츠(텍스트, URL, 이미지)를 앱으로 보낼 수 있게 합니다. 공유 확장은 뷰 컨트롤러를 상속하거나 호스팅하며 확장 컨텍스트에서 공유 항목을 읽습니다.

import Foundation
// Share extension reads incoming items:
// extensionContext?.inputItems
//   each NSExtensionItem has attachments (NSItemProvider)
let share = "appears in the share sheet"
_ = share

공유 항목 읽기

공유 콘텐츠는 NSItemProvider 첨부 파일로 전달됩니다. 유형 식별자를 확인한 다음 값을 비동기적으로 로드합니다. 이를 통해 공유 확장이 사용자가 공유하는 URL이나 이미지를 가져옵니다.

import UniformTypeIdentifiers
func handle(_ provider: NSItemProvider) {
    if provider.hasItemConformingToTypeIdentifier(
        UTType.url.identifier) {
        provider.loadItem(
            forTypeIdentifier: UTType.url.identifier) {
            value, _ in
            print("shared url:", value ?? "none")
        }
    }
}

동작 확장

동작 확장은 콘텐츠가 있는 자리에서 콘텐츠를 변환하거나 표시합니다. 선택한 텍스트를 번역하거나 PDF에 주석을 추가할 수 있으며, 결과를 호스트에 반환할 수도 있습니다. 공유 확장과 달리 콘텐츠를 다른 곳으로 보내기보다 콘텐츠에 동작을 적용하는 데 사용합니다.

import Foundation
// Action extension may return modified items:
// extensionContext?.completeRequest(
//     returningItems: outputItems)
let action = "acts on content, can return a result"
_ = action

알림 서비스 확장

알림 서비스 확장은 mutable-content: 1이 포함된 수신 푸시 알림을 가로채 짧은 시간 안에 표시 전에 수정합니다. 본문을 복호화하거나 미디어 첨부 파일을 다운로드하거나 제목을 다시 작성할 수 있습니다.

import UserNotifications
// Override in UNNotificationServiceExtension:
// didReceive(_ request:, withContentHandler:)
//   mutate bestAttemptContent, then call the handler
let service = "modifies push before it shows"
_ = service

알림 콘텐츠 확장

알림 콘텐츠 확장은 사용자가 배너를 길게 눌렀을 때 표시되는 확장된 알림의 사용자 설정 UI를 제공합니다. 지도, 미디어 플레이어, 대화형 제어 요소 등을 표시할 수 있습니다. 이 확장은 알림 카테고리에 연결됩니다.

import UserNotifications
// UNNotificationContentExtension renders a custom view
// for a given UNNotificationCategory when expanded.
let content = "custom expanded notification UI"
_ = content

completeRequest 수명 주기

확장은 짧은 시간 동안만 실행됩니다. 작업이 끝나면 extensionContext?.completeRequest(returningItems:completionHandler:)를 호출해 완료를 알리고 호스트가 확장을 닫도록 하십시오. 중단하려면 cancelRequest(withError:)를 사용합니다. 프로세스를 계속 열어 두면 리소스가 낭비되고 프로세스가 종료될 수 있습니다.

import Foundation
func finish(context: NSExtensionContext?) {
    context?.completeRequest(
        returningItems: [], completionHandler: nil)
}

기타 확장 지점

iOS는 사용자 설정 키보드, 문서 제공자, Spotlight 색인, Safari 콘텐츠 차단기, Siri 인텐트, 사진 편집, 파일 제공자 확장 등 다양한 확장 지점을 제공합니다. 각 확장은 Info.plist의 NSExtensionPointIdentifier로 선언된 시스템 정의 프로토콜을 준수합니다.

// Info.plist of an extension declares its point:
// NSExtension > NSExtensionPointIdentifier
//   e.g. com.apple.share-services
//        com.apple.usernotifications.service
let point = "each extension declares its point"
_ = point

메모리 및 시간 제한

확장은 기본 앱보다 더 엄격한 제한 아래에서 실행됩니다. 사용할 수 있는 메모리가 적고 실제 실행 시간도 짧습니다. 가능한 한 최소한의 작업만 수행하고 큰 메모리 할당을 피하며, 무거운 처리는 공유 저장 공간을 통해 기본 앱으로 넘기십시오.

import Foundation
// Tight memory + short runtime.
// Pattern: extension stages data in the App Group,
// the main app processes it fully on next launch.
let limits = "keep extensions lean and fast"
_ = limits

대상 간 코드 공유

로직을 중복하지 않으려면 앱과 확장이 모두 의존하는 프레임워크나 Swift 패키지에 공유 모델과 도우미를 넣으십시오. 각 대상에 필요한 항목만 표시하면 확장은 코드를 복사하지 않고 동일한 코드를 연결해 사용합니다.

import Foundation
// Shared Swift package 'AppCore' linked by:
//   - main app target
//   - share extension target
//   - widget extension target
let shared = "one source of truth for models"
_ = shared

빠른 확인

확장이 컨테이너 앱과 통신하는 방식을 떠올려 보십시오.

복습

앱 확장을 살펴보았습니다.

  • 확장은 호스트가 실행하는 별도의 샌드박스 대상이며, 공유 확장, 동작 확장, 알림 서비스 확장, 알림 콘텐츠 확장 등이 있습니다.
  • NSItemProvider를 통해 수신 콘텐츠를 읽고 completeRequest로 작업을 완료합니다.
  • 각 확장은 NSExtensionPointIdentifier를 선언하며 엄격한 메모리 및 시간 제한 아래에서 실행됩니다.
  • 앱 그룹을 통해 데이터를 공유하고 공유 패키지를 통해 코드를 재사용합니다.

자주 묻는 질문

“앱 확장 기능 개요” 강의는 무료인가요?

네 — “앱 확장 기능 개요” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“앱 확장 기능 개요”에서 뭘 배우나요?

공유, 동작 및 기타 확장 기능을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“앱 확장 기능 개요” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. WidgetKit 위젯 만들기
  2. 타임라인 제공자와 스냅샷
  3. 앱 확장 기능 개요
  4. 앱 인텐트와 단축어
← Swift Academy(으)로 돌아가기