Extensión de compartir iOS: get la URL de la página cuando se comparte a través del menu contextual en Safari

Lo que quiero

Estoy tratando de lograr el siguiente flujo de usuario:

  1. El usuario está navegando por una página web en iOS Safari.
  2. El usuario selecciona algo de contenido (text e imágenes) y espera que aparezca el menu contextual.
  3. El usuario selecciona el elemento "Compartir …".
  4. El usuario selecciona mi Extensión de la aplicación en el menu para compartir que aparece desde la parte inferior.
  5. El contenido seleccionado y la URL de la página web se comparte con un server remoto a través de una llamada HTT.

Lo que intenté

Hice una extensión Compartir a través de Xcode. Aquí está la sección NSExtension de mi 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> 

Aquí está el file test.js :

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

viewDidLoad el siguiente resultado: en viewDidLoad method extensionContext?.inputItems me proporcionaría varios elementos de input, a través de los cuales podría get el contenido seleccionado y la URL web.

Lo que sale mal

En viewDidLoad método extensionContext?.inputItems me proporciona solo un elemento: la representación de text sin formatting del contenido seleccionado (incluso cuando seleccioné imágenes y text al mismo time). Puedo vivir con text sin formatting, pero necesito la URL de la página web.

Mi pregunta

¿Cómo puedo get la URL de la página web abierta cuando uso una extensión Compartir para compartir el contenido seleccionado a través del menu contextual en iOS Safari?

Swift 3

Prueba algo parecido a:

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

"public.url" se puede replace con la cadena kUTTypeURL importada de MobileCoreServices

Para recuperar la URL con ese js, puedes probar este código:

 // For kUTTypePropertyList. import MobileCoreServices let propertyList = String(kUTTypePropertyList) let extensionContextItem = extensionContext?.inputItems.first as! NSExtensionItem let itemProvider = extensionContextItem.attachments?.first as! NSItemProvider if itemProvider.hasItemConformingToTypeIdentifier(propertyList) { itemProvider.loadItem(forTypeIdentifier: propertyList, options: nil, completionHandler: { (item, error) -> Void in guard let dictionary = item as? NSDictionary else { return } OperationQueue.main.addOperation { if let results = dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as? NSDictionary { if let url = results["URL"] as? String { print("URL: \(url)") } } } }) } 

Simplemente agréguelo al método viewDidLoad() de su controller de vista de extensión de Share.