Расширение приложения Swift: получить URL из любого приложения без JavaScript

Я хотел бы получить URL через расширение действия в каждом приложении, а не только в сафари. Например, в twitter.app при длительном нажатии на ссылку открываются общие таблицы, и расширения могут использовать URL-адрес. Если возможно, я хотел бы сделать это без файла JavaScript.

В настоящее время я использую файл js, чтобы получить URL в Safari, и это работает, но в других приложениях, таких как Twitter, появляется только черный экран.

    let extensionItem = extensionContext?.inputItems.first as! NSExtensionItem
    let itemProvider = extensionItem.attachments?.first as! NSItemProvider

    let propertyList = String(kUTTypePropertyList)
    if itemProvider.hasItemConformingToTypeIdentifier(propertyList) {
        itemProvider.loadItemForTypeIdentifier(propertyList, options: nil, completionHandler: { (item, error) -> Void in
            let dictionary = item as! NSDictionary
            NSOperationQueue.mainQueue().addOperationWithBlock {
                let results = dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as! NSDictionary
                let urlString = results["currentUrl"] as? String
                self.url = NSURL(string: urlString!)

                print(self.url)
            }
        })
    } else {
        print("error")
    }

Я хотел бы получить URL-адрес через общий лист в каждом приложении без необходимости JavaScript-файла.

заранее спасибо

1 ответ

Решение

Если вам нужен только URL-адрес, избавьтесь от файла предварительной обработки JS, поскольку он заменяет все другие вложения элемента расширения списком свойств.

Удалите NSExtensionJavaScriptPreprocessingFile в вашем Info.plist. Это должно выглядеть так:

<key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
            <string>1</string>
        </dict>
    </dict>

Затем, вместо того, чтобы запрашивать у вашего itemProvider список свойств, просто сделайте это:

if itemProvider.hasItemConformingToTypeIdentifier("public.url") {
     itemProvider.loadItemForTypeIdentifier(kUTTypeURL as String, options: nil, completionHandler: { (result: NSSecureCoding?, error: NSError!) in
          let url = result as? NSURL
          //assign url here
      })
 }

Если вам нужна какая-либо дополнительная информация, которую вы получали только от предварительной обработки JS (возможно, заголовок), вы можете загрузить URL-адрес в UIWebview и использовать:

let title = webView.stringByEvaluatingJavaScriptFromString("document.title")

Это будет работать с Twitter, но я не подтвердил никаких дополнительных приложений. Конечно, имейте в виду, что многие из ссылок, которые можно выбрать в Twitter, являются ссылками на твиты и пользовательские страницы Twitter, а не фактическим размещенным контентом.

Другие вопросы по тегам