App Extension Swift:从没有 javascript 的任何应用程序中获取 url

Posted

技术标签:

【中文标题】App Extension Swift:从没有 javascript 的任何应用程序中获取 url【英文标题】:App Extension Swift: get url from any app without javascript 【发布时间】:2015-12-07 18:49:39 【问题描述】:

我想通过每个应用程序中的操作扩展来获取 url,而不仅仅是 safari。例如,在 twitter.app 中,当您长按链接时,共享表会打开,并且扩展程序可以使用该 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")
    

我想通过每个应用程序中的共享表获取 url,而不需要 javascript 文件。

提前致谢

【问题讨论】:

不知道你要什么! 我想通过每个应用程序中的共享表获取 url,而不需要 javascript 文件什么 url,什么应用程序,什么 javascript 文件?? 你能解决这个问题吗?我需要完全相同的东西...... 【参考方案1】:

如果您只需要 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 用户页面的链接,而不是实际发布的内容。

【讨论】:

以上是关于App Extension Swift:从没有 javascript 的任何应用程序中获取 url的主要内容,如果未能解决你的问题,请参考以下文章

Swift之利用API可用性解决App Extension无法编译

Swift 在 App 和 Today Extension 之间共享 CoreData [重复]

利用Swift API可用性解决App Extension无法编译

“错误”的使用 Swift 中的 Extension

正则表达式:从没有文件扩展名的 URL 捕获文件名

在 Share Extension (Swift) 中处理 NSItemProvider 数据类型