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

时间:2015-12-07 18:49:40

标签: ios swift ios-sharesheet

我希望通过每个应用中的动作扩展来获取网址,而不仅仅是Safari。例如,在twitter.app中,当您长按链接时,共享表打开,扩展名可以使用该URL。如果可能的话我想在没有javascript文件的情况下这样做。

目前我正在使用js文件来获取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")
    }

我想在每个应用中通过共享表获取网址,而无需使用javascript文件。

提前致谢

1 个答案:

答案 0 :(得分:6)

如果您只需要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上可选择的许多链接都是Tweets和Twitter用户页面的链接,而不是实际发布的内容。