Action Extension est une extension iOS qui exécute des actions personnalisées sur le contenu d'autres applications sans changer de contexte. Contrairement à Share Extension qui envoie des données vers une autre application, Action Extension transforme le contenu sur place : traduit du texte, modifie les filtres d'image, vérifie l'orthographe ou génère un PDF. Selon Apple (2024), Action Extension est le deuxième type d'extension le plus populaire après Share Extension, utilisé dans 42 % des applications de la catégorie « Productivité ». L'action instantanée sans lancer l'application principale est l'avantage clé pour l'utilisateur.
Points clés
Action Extension est un type d'extension iOS qui permet d'effectuer des actions sur le contenu directement dans le contexte de l'application hôte. L'utilisateur sélectionne du texte dans Safari, appuie sur « Actions » et choisit, par exemple, « Vérifier l'orthographe » — l'extension traite le texte et retourne le résultat sans quitter le navigateur. L'extension reçoit les données d'entrée via NSExtensionContext et peut retourner le contenu modifié.
Action Extension est apparue dans iOS 8 dans le cadre de l'architecture des extensions d'applications. Sa caractéristique clé est que l'extension n'a pas sa propre interface (facultative) et s'exécute dans le contexte de l'application hôte. L'utilisateur ne quitte pas l'écran actuel, ce qui garantit une friction cognitive minimale. Selon Apple, Action Extension est le seul type d'extension qui peut lire et modifier simultanément le contenu de l'application hôte (via NSExtensionContext avec retour de résultat).
Action Extension est utilisée dans divers scénarios : traduire du texte dans le navigateur, créer un PDF à partir d'une page web, appliquer un filtre à une photo dans la galerie, vérifier l'orthographe dans n'importe quel champ de texte, raccourcir une URL, chiffrer du texte et ajouter des favoris. La polyvalence fait d'Action Extension un outil populaire pour les applications des catégories « Utilitaires » et « Productivité ».
Action Extension et Share Extension sont souvent confondues, mais leurs objectifs sont fondamentalement différents. Share Extension envoie le contenu de l'application hôte vers votre application ; Action Extension traite le contenu et le retourne. La différence affecte l'architecture, l'expérience utilisateur et les exigences de configuration Info.plist.
| Caractéristique | Action Extension | Share Extension |
|---|---|---|
| Objectif | Transformation de contenu | Transfert de contenu vers l'application |
| Interface | Facultative (personnalisée) | SLComposeServiceViewController |
| Retour des données | Oui, via completeRequest | Non |
| Contexte | Reste dans l'application hôte | Passe à l'extension |
| Position dans le menu | Action Sheet (partie supérieure) | Share Sheet (partie inférieure) |
| Action typique | Traduction, correction, filtre | Enregistrement, publication |
Action Extension apparaît dans le menu d'actions (Action Sheet) lors de l'appui sur le bouton « Partager » ou « ... ». iOS place automatiquement les Action Extensions dans la partie supérieure de la feuille (actions) et les Share Extensions dans la partie inférieure (applications). Scénario utilisateur : a sélectionné du texte → a appuyé sur « Actions » → a choisi votre Action Extension → a reçu le résultat traité sans changer d'application.
Action Extension se compose d'une cible dans Xcode, d'un UIViewController pour afficher l'interface (facultatif), de NSExtensionContext pour l'entrée/sortie de données et de la configuration Info.plist. L'architecture est plus simple que celle de Share Extension : il n'y a pas d'interface de composition obligatoire et l'extension peut fonctionner entièrement sans UI.
Cible — un bundle séparé avec un identifiant hérité de l'application principale. UIViewController — interface facultative pour afficher la progression, les paramètres ou les résultats. NSExtensionContext — un conteneur avec les données d'entrée (inputItems) et la méthode completeRequest pour retourner les résultats. Info.plist — configuration d'activation via NSExtensionActivationRule et attributs (NSExtensionAttributes) pour spécifier les types de contenu pris en charge.
Action Extension reçoit les données d'entrée via extensionContext?.inputItems — un tableau de NSExtensionItem. Chaque élément contient des pièces jointes avec des données et des UTI. Après le traitement, l'extension appelle completeRequest(returningItems:) avec un tableau de NSExtensionItem de sortie. L'application hôte reçoit les données traitées et les affiche. Modèle asynchrone : l'extension peut effectuer des opérations longues, en maintenant le contexte jusqu'à 30 secondes.
Voyons comment créer une Action Extension en Swift pour traduire du texte sélectionné. L'extension reçoit le texte de l'application hôte, l'envoie à un serveur de traduction et retourne le résultat. ActionViewController est le contrôleur de base créé par Xcode lors de l'ajout d'une cible.
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
}
}
}
}
}
}
Après le traitement, l'extension retourne le résultat à l'application hôte. completeRequest avec des données de sortie est un scénario alternatif où l'extension n'affiche pas d'interface utilisateur mais retourne immédiatement le contenu traité.
// 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 peut fonctionner dans deux modes : avec UI et sans UI. En mode sans UI, l'extension effectue l'action entièrement en arrière-plan et appelle completeRequest immédiatement après le traitement. En mode avec UI, l'extension affiche un contrôleur, l'utilisateur confirme l'action et ensuite seulement completeRequest envoie le résultat. La sélection du mode dépend de la complexité de l'action et de la nécessité d'une saisie utilisateur.
La méthode loadItem(forTypeIdentifier:) fonctionne de manière asynchrone — les données peuvent être volumineuses (images, vidéos). NSItemProvider gère le streaming et la mise en cache. Pour les images, utilisez kUTTypeImage, pour les fichiers, utilisez kUTTypeFileURL. Important : loadItem peut être appelé sur un thread d'arrière-plan — mettez à jour l'interface utilisateur uniquement via DispatchQueue.main.
Action Extension retourne les données traitées via completeRequest avec un tableau de NSExtensionItem. Chaque élément correspond au type de données de sortie. L'application hôte peut remplacer le contenu original par le contenu traité — par exemple, remplacer l'image originale par une image filtrée. NSExtensionItem prend en charge les mêmes UTI qu'en entrée, plus des UTI supplémentaires (par exemple, public.html pour le contenu web).
Action Extension est utilisée dans des dizaines de scénarios — des utilitaires simples aux flux de travail d'entreprise complexes. Les exemples classiques couvrent les opérations textuelles, graphiques et de fichiers, ainsi que l'intégration de contenu web.
Action Extension pour le texte : traduction, vérification orthographique, comptage de caractères, changement de casse, chiffrement, génération de code QR à partir de texte. L'utilisateur sélectionne du texte dans n'importe quelle application avec un champ de texte (Safari, Notes, Mail) et effectue l'action en un seul appui. La coloration syntaxique du code, le formatage Markdown et le raccourcissement d'URL sont des exemples populaires d'Action Extension pour les utilisateurs avancés.
Pour les images, Action Extension propose : application de filtres, recadrage, redimensionnement, conversion de formats (HEIC en JPEG), ajout de filigrane, reconnaissance de texte (OCR) et compression. Le traitement d'images doit être rapide — l'utilisateur s'attend à un résultat en 2 à 3 secondes. Pour les opérations lourdes, utilisez Core Image sur le GPU ou des files d'attente en arrière-plan.
Action Extension pour les URL : créer un PDF à partir d'une page web, enregistrer dans Pocket/Pinterest, vérifier la vitesse du site, archiver une page, obtenir les métadonnées Open Graph, générer une capture d'écran de la page. La génération de PDF est l'un des scénarios les plus demandés : l'utilisateur convertit une page web en PDF sans ouvrir de services tiers.
Questions fréquentes
Share Extension envoie le contenu de l'application hôte vers votre application. Action Extension traite le contenu sur place et retourne le résultat. Share — transfert, Action — transformation. Cette différence fondamentale détermine l'architecture et l'UX.
Oui. Si l'action ne nécessite pas de saisie utilisateur (par exemple, le comptage de caractères), l'extension peut l'effectuer en arrière-plan et retourner immédiatement le résultat via completeRequest. Dans Info.plist, vous devez spécifier NSExtensionActivationSupportsWebURL ou une autre UTI correspondant au type de données.
Dans toutes les applications qui prennent en charge UIActivityViewController ou les contrôleurs d'action standard. Cela inclut Safari, Photos, Fichiers, Notes, Mail et des milliers d'applications tierces. Action Extension ne fonctionne pas dans les applications qui n'utilisent pas les mécanismes d'action standard d'iOS.
Via extensionContext.completeRequest(returningItems:) avec un tableau de NSExtensionItem. Chaque élément de sortie contient un NSItemProvider avec les données traitées. L'application hôte reçoit le résultat dans le délégué UIActivityViewController ou un callback similaire.
L'extension s'exécute jusqu'à 30 secondes, après quoi iOS la termine de force. Il n'y a pas d'accès direct à l'application principale — seulement via App Groups. Action Extension ne peut pas effectuer de tâches en arrière-plan après la fin. Pour les opérations longues, utilisez NSURLSession en arrière-plan avec une notification au prochain démarrage.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi