Расширение приложения 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, а не фактическим размещенным контентом.