Share Extension es una extensión de iOS que añade tu aplicación al menú Compartir del sistema. El usuario puede enviar contenido desde Safari, Fotos, Archivos o cualquier otra aplicación directamente a la tuya — sin copiar ni cambiar entre ventanas. Según Apple (2024), las aplicaciones con Share Extension reciben un 35% más de contenido de usuario que las aplicaciones sin capacidad de compartir. La extensión procesa texto, imágenes, vídeo, URL y archivos mediante una interfaz unificada NSExtensionItem.
Puntos clave
Share Extension es un tipo de extensión de iOS que aparece en el menú Compartir del sistema al seleccionar contenido en cualquier aplicación. El usuario resalta texto en Safari, pulsa Compartir y ve tu aplicación en la lista de acciones disponibles. Tras la selección, el contenido se pasa a la extensión para procesarlo: guardarlo, publicarlo, enviarlo o transformarlo.
A diferencia de Action Extension, Share Extension se especializa en recibir contenido de aplicaciones externas. Action Extension, por el contrario, envía datos desde tu aplicación hacia fuera. Share Extension es un punto de entrada de contenido de usuario, un elemento clave para la adquisición de usuarios: los usuarios prueban tu aplicación a través de Share Extension sin instalarla por completo. App Store prohíbe las aplicaciones cuya única función es mostrar anuncios mediante Share Extension (App Store Review Guideline 4.2).
Share Extension reduce la barrera de entrada: los usuarios envían contenido a tu aplicación desde un contexto familiar — navegador, galería, gestor de archivos. Según Branch (2024), las aplicaciones con Share Extension muestran una retención un 28% mayor en el día 7. Un efecto adicional es la viralidad: cada vez que un usuario ve tu aplicación en la hoja Compartir, se produce branding pasivo sin gasto en publicidad.
El mecanismo de Share Extension se basa en la transferencia de contenido mediante contenedores del sistema NSExtensionItem. La aplicación anfitriona (Safari, Fotos) empaqueta el contenido seleccionado en un NSExtensionItem con un tipo especificado (public.image, public.url, public.plain-text). El sistema pasa este contenedor a la extensión, que extrae los datos mediante extensionContext.inputItems.
Share Extension se ejecuta en un proceso separado con tiempo de ejecución limitado — aproximadamente 30 segundos para procesar. La extensión no debe realizar operaciones largas síncronas. Para subir archivos grandes, usa NSURLSession con configuración en segundo plano. SLComposeServiceViewController es la clase base para Share Extension con vista previa del contenido y botón de envío.
iOS utiliza Uniform Type Identifiers (UTI) para determinar el tipo de contenido que se transfiere. Los principales UTI para Share Extension: public.image (fotos, capturas de pantalla), public.url (enlaces), public.plain-text (texto), public.video (archivos de vídeo) y public.file-url (archivos). La extensión registra los UTI compatibles en Info.plist mediante la clave NSExtensionActivationRule.
Share Extension consta de tres componentes: el target en Xcode, SLComposeServiceViewController y la configuración de Info.plist. La arquitectura determina qué tipos de contenido se procesan, cómo se muestra la interfaz y dónde se guardan los datos.
| Componente | Función | Características |
|---|---|---|
| Target | Target de la extensión en Xcode | Bundle separado con un identificador |
| ViewController | Interfaz y lógica de procesamiento | SLComposeServiceViewController o personalizado |
| Info.plist | Configuración de activación y UTI | NSExtensionActivationRule con predicados |
| App Groups | Almacenamiento compartido con la aplicación | UserDefaults suite para transferencia de datos |
El elemento clave de configuración de Share Extension es la regla de activación. Determina en qué condiciones aparece la extensión en la hoja Compartir. La regla se define en Info.plist como un diccionario con restricciones: número máximo de imágenes, longitud mínima de texto, presencia obligatoria de URL. La regla estándar activa la extensión para un solo tipo de contenido cualquiera.
// Info.plist — NSExtensionActivationRule para Share Extension
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>5</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
Veamos un ejemplo práctico de creación de una Share Extension en Swift para una aplicación de marcadores. La extensión recibe una URL desde Safari, muestra una interfaz de vista previa y guarda el enlace en App Group. SLComposeServiceViewController proporciona una interfaz de usuario ya preparada con un campo de texto y un botón de Publicar.
import Social
import MobileCoreServices
class ShareViewController: SLComposeServiceViewController {
override func isContentValid() -> Bool {
return !(contentText?.isEmpty() ?? true)
}
override func didSelectPost() {
guard let item = extensionContext?.inputItems.first as? NSExtensionItem
else { return }
for attachment in item.attachments ?? [] {
attachment.loadItem(forTypeIdentifier: kUTTypeURL as String) {
[weak self] (item, error) in
if let url = item as? URL {
BookmarkService().save(url, title: self?.contentText)
}
self?.extensionContext?.completeRequest(
returningItems: [], completionHandler: nil)
}
}
}
}
Tras enviar el contenido, la extensión finaliza llamando a completeRequest — este es un paso obligatorio; sin él, el sistema no liberará el proceso de la extensión. Importante: Share Extension se ejecuta en un entorno limitado con acceso restringido a la red y al sistema de archivos — usa sesiones en segundo plano para subir contenido.
Share Extension debe manejar correctamente diferentes tipos de datos de entrada: texto, imágenes, vídeo, URL y archivos. Cada tipo usa su propio UTI y método de extracción. Manejo universal — iterando por attachment.attachments con comprobaciones hasItemConformingToTypeIdentifier.
Las imágenes se pasan como public.image con la posibilidad de obtenerlas mediante UIImage o Data. Para imágenes grandes, usa jpegData(compressionQuality:) antes de guardarlas. Share Extension no debe modificar la imagen original sin permiso explícito del usuario. Se recomienda guardar el original en App Group y crear una vista previa para mostrarla en la interfaz.
Safari y otros navegadores pasan las URL como public.url y el texto seleccionado como public.plain-text. Un único NSExtensionItem puede contener ambos tipos simultáneamente — la URL de la página y el texto seleccionado en ella. Share Extension debe comprobar todos los attachments y extraer los datos relevantes. Escenario combinado: guardar la URL como marcador y el texto como nota adjunta.
Share Extension y la aplicación principal se ejecutan en procesos diferentes y no comparten acceso al sistema de archivos. El intercambio de datos utiliza el mecanismo de App Groups: un contenedor compartido con un identificador group.*. Tras guardar datos en App Group, la extensión notifica a la aplicación mediante CFNotificationCenter o Darwin Notify.
Los App Groups se activan en las Capacidades del target: selecciona App Groups y añade un identificador (por ejemplo, group.com.example.myapp). Ambos targets — la aplicación principal y la extensión — deben tener acceso al mismo grupo. UserDefaults suite permite leer y escribir datos en el almacenamiento compartido con una sobrecarga mínima.
// Guardar datos en App Group desde Share Extension
let sharedDefaults = UserDefaults(suiteName: "group.com.example.myapp")
let bookmark: [String: Any] = [
"url": url.absoluteString,
"title": contentText ?? "",
"date": Date().timeIntervalSince1970
]
sharedDefaults?.set(bookmark, forKey: "bookmark_\(Date().timeIntervalSince1970)")
sharedDefaults?.synchronize()
Preguntas frecuentes
Share Extension recibe contenido de otras aplicaciones en la tuya. Action Extension, por el contrario, realiza una acción sobre el contenido dentro de la aplicación anfitriona — traducir texto, modificar una imagen. Share Extension es recepción, Action Extension es transformación.
Depende del tipo de contenido que maneje tu aplicación. Para marcadores — public.url. Para un editor de fotos — public.image. Para notas — public.plain-text. Para varios tipos, usa NSExtensionActivationRule con una combinación de predicados AND/OR.
Una causa común es una regla NSExtensionActivationRule incorrecta o una discrepancia de UTI. Verifica en Info.plist: la regla de activación debe coincidir con el tipo de contenido probado. También asegúrate de que la extensión esté activada en Ajustes → tu aplicación → Siri y Buscar. Xcode clean build a menudo resuelve el problema.
El sistema asigna aproximadamente 30 segundos para la ejecución. Después, iOS finaliza forzosamente el proceso de la extensión. Para operaciones de larga duración, usa una NSURLSession en segundo plano y maneja el resultado en el siguiente inicio de la aplicación.
Sí, en lugar de SLComposeServiceViewController puedes usar un UIViewController normal. En este caso, controlas completamente la interfaz. Sin embargo, debes implementar los botones de enviar y cancelar tú mismo. Interfaz personalizada se recomienda para escenarios no estándar de procesamiento de contenido.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también