2017-05-27 2 views
12

Ce que je veuxiOS Partager Extension: accéder à l'URL de la page lors du partage via le menu contextuel dans Safari

Je suis en train de réaliser le flux d'utilisateur suivant:

  1. utilisateur navigue sur une page Web iOS Safari.
  2. L'utilisateur sélectionne du contenu (texte et images) et attend que le menu contextuel apparaisse.
  3. L'utilisateur sélectionne l'élément "Partager ...".
  4. L'utilisateur sélectionne l'extension d'application dans le menu de partage qui provient du bas.
  5. Le contenu sélectionné et l'URL de la page Web sont partagés avec un serveur distant via un appel HTT.

Ce que j'essayé

J'ai fait une extension de l'action via Xcode. Voici la section NSExtension de mon info.plist:

<key>NSExtension</key> 
<dict> 
    <key>NSExtensionAttributes</key> 
    <dict> 
     <key>NSExtensionActivationRule</key> 
     <dict> 
      <key>NSExtensionActivationSupportsWebPageWithMaxCount</key> 
      <integer>1</integer> 
      <key>NSExtensionActivationSupportsText</key> 
      <true/> 
      <key>NSExtensionActivationSupportsWebURLWithMaxCount</key> 
      <integer>1</integer> 
     </dict> 
     <key>NSExtensionJavaScriptPreprocessingFile</key> 
     <string>test</string> 
    </dict> 
    <key>NSExtensionMainStoryboard</key> 
    <string>MainInterface</string> 
    <key>NSExtensionPointIdentifier</key> 
    <string>com.apple.share-services</string> 
</dict> 

Voici le fichier test.js:

var GetURL = function() {}; 
GetURL.prototype = { 
run: function(arguments) { 
    arguments.completionFunction({"URL": document.URL}); 
} 
}; 
var ExtensionPreprocessingJS = new GetURL; 

Je m'y attendais le résultat suivant: en viewDidLoad méthode extensionContext?.inputItems me fournirait plusieurs éléments d'entrée, par laquelle je serais capable d'obtenir le contenu sélectionné et l'URL Web.

ce qui va mal

Dans viewDidLoad méthode extensionContext?.inputItems me fournit un seul élément - la représentation de texte brut du contenu sélectionné (même lorsque je choisi des images et du texte en même temps). Je peux vivre avec du texte brut, mais j'ai besoin de l'URL de la page Web.

Ma question

Comment puis-je accéder à l'URL de la page Web ouverte lors de l'utilisation d'une extension de l'action de partager du contenu sélectionné via le menu contextuel dans iOS Safari?

Répondre

1

J'ai passé une partie importante de honteusement un après-midi à lire les docs sur ce sujet et à essayer différentes permutations d'extensions, comme je cherchais à faire exactement (je pense) ce que tu as essayé g à faire.

J'ai conclu que ce flux exact ne peut pas être atteint sur iOS. Si l'utilisateur sélectionne du texte et utilise le menu contextuel (c.-à-d. "Copier", "Rechercher", "Partager" ...), la seule chose que votre extension recevra est un NSItemProvider avec le texte sélectionné, c'est-à-dire plist avec les résultats du pré-traitement javascript.Lorsqu'ils sélectionnent Partager dans ce menu, l'extension s'affiche si et seulement si vous avez NSExtensionActivationSupportsText défini sur YES dans le fichier Info.plist de l'extension.

Pour exécuter le javascript de pré-traitement, une extension doit avoir NSExtensionActivationSupportsWebPageWithMaxCount définie sur une valeur supérieure à 0, conformément au code docs. Si une extension est appelée via le menu contextuel de texte sélectionné, ce fichier javascript ne s'exécute jamais.

Cependant, il est possible d'obtenir assez proche au débit désiré. Si l'utilisateur est en Safari, et sélectionne du texte, puis, au lieu de cliquer sur "Partager" dans le menu contextuel, appuie sur l'icône Partager en bas de l'interface utilisateur de Safari, le NSItemProvider revient comme un plist et le NSExtensionJavaScriptPreprocessingFile obtient courir. Mon fichier javascript se présente comme suit:

var Share = function() {}; 

Share.prototype = { 
    run: function(arguments) { 
    arguments.completionFunction({"URL": document.URL, "selectedText": document.getSelection().toString()}); 
    }, 
    finalize: function(arguments) { 
    // alert shared! 
    } 
}; 

var ExtensionPreprocessingJS = new Share 

ce qui signifie que l'objet plist retourné à l'extension a à la fois l'URL de la page et la selectedText. Si le seul but d'une extension est les URL de partage et que le texte brut sans URL n'est pas un cas d'utilisation sensé, vous ne devriez probablement pas avoir NSExtensionActivationSupportsText défini sur YES. Par exemple, une application comme Pocket l'a activée, mais si un utilisateur sélectionne du texte dans Safari et tente ensuite de partager via le menu contextuel, Pocket ne peut rien faire de significatif avec juste le texte en clair et aucune URL de page. un message d'erreur assez cryptique. J'ai aussi published the code for my extension aussi si vous voulez jeter un oeil.

2

Swift 3

Essayez quelque chose le long des lignes de:

override func didSelectPost() { 
    if let item = extensionContext?.inputItems.first as? NSExtensionItem, 
     let itemProvider = item.attachments?.first as? NSItemProvider, 
     itemProvider.hasItemConformingToTypeIdentifier("public.url") { 
     itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil) { (url, error) in 
      if let shareURL = url as? URL { 
       // do what you want to do with shareURL 
      } 
      self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil) 
     } 
    } 
} 

"public.url" peut être remplacé par le kUTTypeURL chaîne importée de MobileCoreServices

+0

Cela devrait être la réponse acceptée, cela fonctionne pour moi après l'application de la syntaxe Swfit3: itemProvider.loadItem (forTypeIdentifier: "public.url", options: nil, completionHandler: {(url, error) -> Annulation dans –

+0

@ YunCHEN merci pour le pourboire Réponse mise à jour à swift 3 –

+0

Vous êtes les bienvenus,;) –