应用扩展 Swift:从没有 javascript 的任何应用中获取 url
App Extension Swift: get url from any app without javascript
我想通过每个应用程序中的操作扩展来获得 url,而不仅仅是 safari。例如,在 twitter.app 中,当您长按 link 时,共享 sheets 打开并且扩展可以使用 url。如果可能的话,我想在没有 javascript 文件的情况下进行。
目前我正在使用一个 js 文件在 safari 中获取 url 并且这有效,但在其他应用程序如 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")
}
我想通过每个应用程序中的共享 sheet 获得 url,而不需要 javascript 文件。
提前致谢
如果您只需要 URL,请删除 JS 预处理文件,因为它似乎会用 属性 列表替换所有其他扩展项附件。
删除 Info.plist 中的 NSExtensionJavaScriptPreprocessingFile。它应该是这样的:
<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 预处理中获得的任何其他信息(可能是标题),您可以在 UIWebview 中加载 url 并使用:
let title = webView.stringByEvaluatingJavaScriptFromString("document.title")
这将适用于 Twitter,但我尚未确认是否适用于任何其他应用程序。当然,请记住,Twitter 上的许多可选链接都是指向推文和 Twitter 用户页面的链接,而不是实际发布的内容。
我想通过每个应用程序中的操作扩展来获得 url,而不仅仅是 safari。例如,在 twitter.app 中,当您长按 link 时,共享 sheets 打开并且扩展可以使用 url。如果可能的话,我想在没有 javascript 文件的情况下进行。
目前我正在使用一个 js 文件在 safari 中获取 url 并且这有效,但在其他应用程序如 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")
}
我想通过每个应用程序中的共享 sheet 获得 url,而不需要 javascript 文件。
提前致谢
如果您只需要 URL,请删除 JS 预处理文件,因为它似乎会用 属性 列表替换所有其他扩展项附件。
删除 Info.plist 中的 NSExtensionJavaScriptPreprocessingFile。它应该是这样的:
<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 预处理中获得的任何其他信息(可能是标题),您可以在 UIWebview 中加载 url 并使用:
let title = webView.stringByEvaluatingJavaScriptFromString("document.title")
这将适用于 Twitter,但我尚未确认是否适用于任何其他应用程序。当然,请记住,Twitter 上的许多可选链接都是指向推文和 Twitter 用户页面的链接,而不是实际发布的内容。