Share Extension est une extension iOS qui ajoute votre application au menu Partager du système. L'utilisateur peut envoyer du contenu depuis Safari, Photos, Fichiers ou toute autre application directement dans la vôtre — sans copier ni changer de fenêtre. Selon Apple (2024), les applications avec Share Extension reçoivent 35% de contenu utilisateur en plus que les applications sans capacité de partage. L'extension traite le texte, les images, les vidéos, les URL et les fichiers via une interface unifiée NSExtensionItem.
Points clés
Share Extension est un type d'extension d'application iOS qui apparaît dans le menu Partager du système lors de la sélection de contenu dans n'importe quelle application. L'utilisateur surligne du texte dans Safari, appuie sur Partager et voit votre application dans la liste des actions disponibles. Après la sélection, le contenu est transmis à l'extension pour traitement : sauvegarde, publication, envoi ou transformation.
Contrairement à Action Extension, Share Extension est spécialisée dans la réception de contenu provenant d'applications externes. Action Extension, quant à elle, envoie des données de votre application vers l'extérieur. Share Extension est un point d'entrée pour le contenu utilisateur, un élément clé de l'acquisition d'utilisateurs : les utilisateurs testent votre application via Share Extension sans l'installer complètement. L'App Store interdit les applications dont la seule fonction est d'afficher des publicités via Share Extension (App Store Review Guideline 4.2).
Share Extension abaisse la barrière d'entrée : les utilisateurs envoient du contenu à votre application depuis un contexte familier — navigateur, galerie, gestionnaire de fichiers. Selon Branch (2024), les applications avec Share Extension affichent une rétention 28% plus élevée au 7e jour. Un effet supplémentaire est la viralité : chaque fois qu'un utilisateur voit votre application dans la feuille Partager, un branding passif se produit sans dépenses publicitaires.
Le mécanisme de Share Extension repose sur le transfert de contenu via des conteneurs système NSExtensionItem. L'application hôte (Safari, Photos) empaquette le contenu sélectionné dans un NSExtensionItem avec un type spécifié (public.image, public.url, public.plain-text). Le système transmet ce conteneur à l'extension, qui extrait les données via extensionContext.inputItems.
Share Extension s'exécute dans un processus séparé avec un temps d'exécution limité — environ 30 secondes pour le traitement. L'extension ne doit pas effectuer d'opérations synchrones longues. Pour télécharger des fichiers volumineux, utilisez NSURLSession avec une configuration en arrière-plan. SLComposeServiceViewController est la classe de base pour Share Extension avec un aperçu du contenu et un bouton d'envoi.
iOS utilise les Uniform Type Identifiers (UTI) pour déterminer le type de contenu transféré. Les principales UTI pour Share Extension : public.image (photos, captures d'écran), public.url (liens), public.plain-text (texte), public.video (fichiers vidéo) et public.file-url (fichiers). L'extension enregistre les UTI prises en charge dans Info.plist via la clé NSExtensionActivationRule.
Share Extension se compose de trois composants : la cible Xcode, SLComposeServiceViewController et la configuration Info.plist. L'architecture détermine quels types de contenu sont traités, comment l'interface est affichée et où les données sont sauvegardées.
| Composant | Fonction | Caractéristiques |
|---|---|---|
| Target | Cible de l'extension dans Xcode | Bundle séparé avec un identifiant |
| ViewController | Interface et logique de traitement | SLComposeServiceViewController ou personnalisé |
| Info.plist | Configuration d'activation et UTI | NSExtensionActivationRule avec prédicats |
| App Groups | Stockage partagé avec l'application | Suite UserDefaults pour le transfert de données |
L'élément clé de la configuration de Share Extension est la règle d'activation. Elle détermine dans quelles conditions l'extension apparaît dans la feuille Partager. La règle est définie dans Info.plist sous forme de dictionnaire avec des contraintes : nombre maximum d'images, longueur minimale du texte, présence obligatoire d'une URL. La règle standard active l'extension pour un seul type de contenu quelconque.
// Info.plist — NSExtensionActivationRule pour Share Extension
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>5</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
Prenons un exemple pratique de création d'une Share Extension en Swift pour une application de signets. L'extension reçoit une URL de Safari, affiche une interface d'aperçu et sauvegarde le lien dans App Group. SLComposeServiceViewController fournit une interface utilisateur prête à l'emploi avec un champ de texte et un bouton Publier.
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)
}
}
}
}
Après l'envoi du contenu, l'extension se termine en appelant completeRequest — c'est une étape obligatoire ; sans elle, le système ne libérera pas le processus de l'extension. Important : Share Extension s'exécute dans un environnement limité avec un accès restreint au réseau et au système de fichiers — utilisez des sessions en arrière-plan pour le téléchargement de contenu.
Share Extension doit gérer correctement différents types de données d'entrée : texte, images, vidéo, URL et fichiers. Chaque type utilise sa propre UTI et méthode d'extraction. Traitement universel — en itérant sur attachment.attachments avec des vérifications hasItemConformingToTypeIdentifier.
Les images sont transmises en tant que public.image avec la possibilité de les récupérer via UIImage ou Data. Pour les grandes images, utilisez jpegData(compressionQuality:) avant de sauvegarder. Share Extension ne doit pas modifier l'image originale sans l'autorisation explicite de l'utilisateur. Il est recommandé de sauvegarder l'original dans App Group et de créer un aperçu pour l'affichage dans l'interface.
Safari et les autres navigateurs transmettent les URL en tant que public.url et le texte sélectionné en tant que public.plain-text. Un seul NSExtensionItem peut contenir les deux types simultanément — l'URL de la page et le texte sélectionné dessus. Share Extension doit vérifier toutes les pièces jointes et extraire les données pertinentes. Scénario combiné : sauvegarder l'URL comme signet et le texte comme note qui y est attachée.
Share Extension et l'application principale s'exécutent dans des processus différents et n'ont pas d'accès partagé au système de fichiers. L'échange de données utilise le mécanisme des App Groups : un conteneur partagé avec un identifiant group.*. Après avoir sauvegardé des données dans App Group, l'extension notifie l'application via CFNotificationCenter ou Darwin Notify.
Les App Groups sont activés dans les Capacités de la cible : sélectionnez App Groups et ajoutez un identifiant (par exemple, group.com.example.myapp). Les deux cibles — l'application principale et l'extension — doivent avoir accès au même groupe. La suite UserDefaults permet de lire et d'écrire des données dans le stockage partagé avec une surcharge minimale.
// Sauvegarde des données dans App Group depuis 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()
Questions fréquentes
Share Extension reçoit du contenu d'autres applications dans la vôtre. Action Extension, en revanche, effectue une action sur le contenu au sein de l'application hôte — traduire du texte, modifier une image. Share Extension est la réception, Action Extension est la transformation.
Cela dépend du type de contenu que votre application traite. Pour les signets — public.url. Pour un éditeur de photos — public.image. Pour les notes — public.plain-text. Pour plusieurs types, utilisez NSExtensionActivationRule avec une combinaison de prédicats AND/OR.
Une cause fréquente est une règle NSExtensionActivationRule incorrecte ou une incompatibilité d'UTI. Vérifiez dans Info.plist : la règle d'activation doit correspondre au type de contenu testé. Assurez-vous également que l'extension est activée dans Réglages → votre application → Siri et Recherche. Xcode clean build résout souvent le problème.
Le système alloue environ 30 secondes pour l'exécution. Après cela, iOS met fin de force au processus de l'extension. Pour les opérations de longue durée, utilisez une NSURLSession en arrière-plan et gérez le résultat au prochain lancement de l'application.
Oui, au lieu de SLComposeServiceViewController, vous pouvez utiliser un UIViewController standard. Dans ce cas, vous contrôlez entièrement l'interface. Cependant, vous devez implémenter vous-même les boutons d'envoi et d'annulation. L'interface personnalisée est recommandée pour les scénarios de traitement de contenu non standard.
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