Action Extension은 컨텍스트 전환 없이 다른 앱의 콘텐츠에 대해 사용자 정의 작업을 수행하는 iOS 확장 프로그램입니다. 데이터를 다른 앱으로 보내는 Share Extension과 달리 Action Extension은 해당 위치에서 콘텐츠를 변환합니다. 텍스트 번역, 이미지 필터 변경, 맞춤법 검사 또는 PDF 생성 등을 수행합니다. Apple(2024)에 따르면 Action Extension은 Share Extension 다음으로 가장 인기 있는 확장 유형이며, “생산성” 카테고리 앱의 42%에서 사용됩니다. 메인 앱을 실행하지 않고 즉시 작업을 수행할 수 있다는 것이 사용자에게 주요 이점입니다.
주요 포인트
Action Extension은 호스트 앱의 컨텍스트 내에서 직접 콘텐츠에 대한 작업을 수행할 수 있는 iOS 앱 확장 유형입니다. 사용자가 Safari에서 텍스트를 선택하고 “작업”을 탭한 다음 예를 들어 “맞춤법 검사”를 선택하면 확장 프로그램이 텍스트를 처리하고 브라우저를 떠나지 않고 결과를 반환합니다. 확장 프로그램은 NSExtensionContext를 통해 입력 데이터를 받고 수정된 콘텐츠를 반환할 수 있습니다.
Action Extension은 iOS 8에서 앱 확장 아키텍처의 일부로 등장했습니다. 주요 특징은 확장 프로그램에 자체 인터페이스가 없으며(선택 사항) 호스트 앱의 컨텍스트에서 실행된다는 것입니다. 사용자가 현재 화면을 떠나지 않으므로 인지적 마찰이 최소화됩니다. Apple에 따르면 Action Extension은 호스트 앱 콘텐츠를 동시에 읽고 수정할 수 있는 유일한 확장 유형입니다(결과 반환과 함께 NSExtensionContext를 통해).
Action Extension은 다양한 시나리오에서 사용됩니다. 브라우저에서 텍스트 번역, 웹 페이지에서 PDF 생성, 갤러리의 사진에 필터 적용, 모든 텍스트 필드에서 맞춤법 검사, URL 단축, 텍스트 암호화 및 북마크 추가 등이 있습니다. 다용도성 덕분에 Action Extension은 “유틸리티” 및 “생산성” 카테고리 앱에서 인기 있는 도구입니다.
Action Extension과 Share Extension은 종종 혼동되지만 그 목적은 근본적으로 다릅니다. Share Extension은 호스트 앱에서 사용자 앱으로 콘텐츠를 보내고, Action Extension은 콘텐츠를 처리하여 반환합니다. 이 차이는 아키텍처, 사용자 경험 및 Info.plist 구성 요구 사항에 영향을 미칩니다.
| 특성 | Action Extension | Share Extension |
|---|---|---|
| 목적 | 콘텐츠 변환 | 앱으로 콘텐츠 전송 |
| 인터페이스 | 선택 사항(사용자 정의) | SLComposeServiceViewController |
| 데이터 반환 | 예, completeRequest를 통해 | 아니요 |
| 컨텍스트 | 호스트 앱에 유지 | 확장 프로그램으로 전환 |
| 메뉴 위치 | Action Sheet(상단) | Share Sheet(하단) |
| 일반적인 작업 | 번역, 수정, 필터 | 저장, 게시 |
Action Extension은 “공유” 버튼 또는 “...”을 탭하면 작업 메뉴(Action Sheet)에 나타납니다. iOS는 자동으로 Action Extensions를 시트 상단(작업)에, Share Extensions를 하단(앱)에 배치합니다. 사용자 시나리오: 텍스트 선택 → “작업” 탭 → 사용자의 Action Extension 선택 → 앱 전환 없이 처리된 결과 수신.
Action Extension은 Xcode의 타겟, 인터페이스 표시를 위한 UIViewController(선택 사항), 데이터 입출력을 위한 NSExtensionContext 및 Info.plist 구성으로 구성됩니다. 아키텍처는 Share Extension보다 간단합니다. 필수 compose 인터페이스가 없으며 확장 프로그램이 UI 없이 완전히 작동할 수 있습니다.
타겟 — 메인 앱에서 상속된 식별자를 가진 별도의 번들입니다. UIViewController — 진행 상황, 설정 또는 결과를 표시하는 선택적 인터페이스입니다. NSExtensionContext — 입력 데이터(inputItems)와 결과 반환을 위한 completeRequest 메서드가 있는 컨테이너입니다. Info.plist — NSExtensionActivationRule 및 지원되는 콘텐츠 유형을 지정하는 속성(NSExtensionAttributes)을 통한 활성화 구성입니다.
Action Extension은 extensionContext?.inputItems를 통해 입력 데이터를 받습니다(NSExtensionItem 배열). 각 항목에는 데이터와 UTI가 있는 첨부 파일이 포함됩니다. 처리 후 확장 프로그램은 출력 NSExtensionItem 배열로 completeRequest(returningItems:)를 호출합니다. 호스트 앱은 처리된 데이터를 받아 표시합니다. 비동기 모델: 확장 프로그램은 최대 30초 동안 컨텍스트를 유지하면서 장기 실행 작업을 수행할 수 있습니다.
선택한 텍스트를 번역하기 위해 Swift로 Action Extension을 만드는 방법을 살펴보겠습니다. 확장 프로그램이 호스트 앱에서 텍스트를 받아 번역 서버로 보내고 결과를 반환합니다. ActionViewController는 Xcode가 타겟을 추가할 때 생성하는 기본 컨트롤러입니다.
import UIKit
import MobileCoreServices
class ActionViewController: UIViewController {
@IBOutlet var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
extractTextAndTranslate()
}
func extractTextAndTranslate() {
guard let item = extensionContext?.inputItems.first
as? NSExtensionItem
else { return }
for attachment in item.attachments ?? [] {
attachment.loadItem(
forTypeIdentifier: kUTTypePlainText as String
) { [weak self] (text, error) in
guard let inputText = text as? String else { return }
TranslationService().translate(inputText, from: "en", to: "ru") {
translated in
DispatchQueue.main.async {
self?.resultLabel?.text = translated
}
}
}
}
}
}
처리 후 확장 프로그램은 결과를 호스트 앱으로 반환합니다. 출력 데이터가 있는 completeRequest는 확장 프로그램이 UI를 표시하지 않고 즉시 처리된 콘텐츠를 반환하는 대체 시나리오입니다.
// Returning processed text to host app
let resultItem = NSExtensionItem()
let resultData = translated.data(using: .utf8)!
let attachment = NSItemProvider(
item: resultData,
typeIdentifier: kUTTypePlainText as String
)
resultItem.attachments = [attachment]
extensionContext?.completeRequest(
returningItems: [resultItem], completionHandler: nil
)
Action Extension은 UI 있음과 없음의 두 가지 모드로 작동할 수 있습니다. UI 없는 모드에서는 확장 프로그램이 완전히 백그라운드에서 작업을 수행하고 처리 직후 completeRequest를 호출합니다. UI 모드에서는 확장 프로그램이 컨트롤러를 표시하고 사용자가 작업을 확인한 후 completeRequest가 결과를 보냅니다. 모드 선택은 작업의 복잡성과 사용자 입력 필요성에 따라 달라집니다.
loadItem(forTypeIdentifier:) 메서드는 비동기적으로 작동합니다. 데이터는 클 수 있습니다(이미지, 비디오). NSItemProvider가 스트리밍과 캐싱을 관리합니다. 이미지에는 kUTTypeImage, 파일에는 kUTTypeFileURL을 사용하세요. 중요: loadItem은 백그라운드 스레드에서 호출될 수 있습니다. DispatchQueue.main을 통해서만 UI를 업데이트하세요.
Action Extension은 NSExtensionItem 배열로 completeRequest를 통해 처리된 데이터를 반환합니다. 각 항목은 출력 데이터 유형에 해당합니다. 호스트 앱은 원본 콘텐츠를 처리된 콘텐츠로 대체할 수 있습니다. 예를 들어 원본 이미지를 필터링된 이미지로 대체할 수 있습니다. NSExtensionItem은 입력과 동일한 UTI와 추가 UTI(예: 웹 콘텐츠용 public.html)를 지원합니다.
Action Extension은 단순한 유틸리티부터 복잡한 비즈니스 워크플로우까지 수십 가지 시나리오에서 사용됩니다. 전형적인 예로는 텍스트, 그래픽, 파일 작업 및 웹 콘텐츠 통합이 있습니다.
텍스트용 Action Extension: 번역, 맞춤법 검사, 문자 수 계산, 대소문자 변경, 암호화, 텍스트에서 QR 코드 생성. 사용자는 텍스트 필드가 있는 모든 앱(Safari, Notes, Mail)에서 텍스트를 선택하고 한 번의 탭으로 작업을 수행합니다. 코드 구문 강조, Markdown 서식 및 URL 단축은 고급 사용자를 위한 인기 있는 Action Extension 예시입니다.
이미지용 Action Extension: 필터 적용, 자르기, 크기 조정, 형식 변환(HEIC에서 JPEG), 워터마크 추가, 텍스트 인식(OCR) 및 압축. 이미지 처리는 빨라야 합니다. 사용자는 2–3초 내에 결과를 기대합니다. 무거운 작업에는 GPU의 Core Image 또는 백그라운드 큐를 사용하세요.
URL용 Action Extension: 웹 페이지에서 PDF 생성, Pocket/Pinterest에 저장, 사이트 속도 확인, 페이지 보관, Open Graph 메타데이터 가져오기, 페이지 스크린샷 생성. PDF 생성은 가장 많이 요구되는 시나리오 중 하나입니다. 사용자가 타사 서비스를 열지 않고 웹 페이지를 PDF로 변환합니다.
자주 묻는 질문
Share Extension은 호스트 앱에서 사용자 앱으로 콘텐츠를 보냅니다. Action Extension은 콘텐츠를 그 자리에서 처리하고 결과를 반환합니다. Share는 전송, Action은 변환입니다. 이 근본적인 차이가 아키텍처와 UX를 결정합니다.
네. 작업에 사용자 입력이 필요하지 않은 경우(예: 문자 수 계산), 확장 프로그램이 백그라운드에서 실행하고 completeRequest를 통해 즉시 결과를 반환할 수 있습니다. Info.plist에서 NSExtensionActivationSupportsWebURL 또는 데이터 유형과 일치하는 다른 UTI를 지정해야 합니다.
UIActivityViewController 또는 표준 액션 컨트롤러를 지원하는 모든 앱에서 나타납니다. 여기에는 Safari, 사진, 파일, 메모, 메일 및 수천 개의 타사 앱이 포함됩니다. Action Extension은 iOS 표준 액션 메커니즘을 사용하지 않는 앱에서는 작동하지 않습니다.
extensionContext.completeRequest(returningItems:)를 NSExtensionItem 배열과 함께 사용합니다. 각 출력 항목에는 처리된 데이터가 있는 NSItemProvider가 포함됩니다. 호스트 앱은 UIActivityViewController 델리게이트 또는 유사한 콜백에서 결과를 받습니다.
확장 프로그램은 최대 30초 동안 실행되며, 이후 iOS가 강제로 종료합니다. 메인 앱에 직접 접근할 수 없으며 App Groups을 통해서만 가능합니다. Action Extension은 완료 후 백그라운드 작업을 수행할 수 없습니다. 장기 실행 작업의 경우 다음 실행 시 알림과 함께 백그라운드 NSURLSession을 사용하세요.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.