【问题标题】:How to get a iOS share extension to get web page content from Safari instead of URL如何获取 iOS 共享扩展以从 Safari 而不是 URL 获取网页内容
【发布时间】:2019-03-28 18:58:23
【问题描述】:

我有一个用 swift 编写的有效共享扩展。当我从 Safari 测试共享操作时,我总是只获得 URL 类型 (kUTTypeURL)。

我想要的是获得用户正在查看的某种形式的渲染版本(PDF 或 HTML?)。由于身份验证问题等原因,无法使用 URL 并在 web 视图中打开它。

我尝试了许多不同的激活规则,但没有任何变化。这是我目前正在使用的:

            <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationSupportsFileWithMaxCount</key>
            <integer>1</integer>
            <key>NSExtensionActivationSupportsImageWithMaxCount</key>
            <integer>20</integer>
            <key>NSExtensionActivationSupportsMovieWithMaxCount</key>
            <integer>0</integer>
            <key>NSExtensionActivationSupportsText</key>
            <true/>
            <key>NSExtensionActivationSupportsWebPageWithMaxCount</key>
            <integer>1</integer>
            <key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
            <integer>1</integer>
        </dict>

我的控制器看起来像这样 - 从 Safari 运行时,它总是只有一种附件类型 - URL:

   override func didSelectPost() {


    if let item = extensionContext?.inputItems.first as? NSExtensionItem {
        if let attachments = item.attachments {
            for attachment: NSItemProvider in attachments {
                if attachment.hasItemConformingToTypeIdentifier(kUTTypePropertyList as String) {
                    attachment.loadItem(forTypeIdentifier: kUTTypePropertyList as String, options: nil, completionHandler: { (data, error) in
                        // Do stuff with this content now
                        self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
                    })
                }
                if attachment.hasItemConformingToTypeIdentifier(kUTTypeURL as String) {
                    attachment.loadItem(forTypeIdentifier: kUTTypeURL as String, options: nil, completionHandler: { (url, error) in
                        if let shareURL = url as? NSURL {
                            // Do stuff with your URL now.
                        }
                        self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
                    })
                }
            }
        }
    }
}

我见过的其他方法使用 javascript 文件来遍历 DOM,但没有看到好的示例,我不清楚这是否会对我有所帮助。

【问题讨论】:

    标签: ios swift ios8-share-extension


    【解决方案1】:

    关键在于在你的 info.plist 文件中使用这一行:

        <key>NSExtensionAttributes</key>
        <dict>
            <key>NSExtensionJavaScriptPreprocessingFile</key>
            <string>Action</string>
            <key>NSExtensionActivationRule</key>
            ...your should be fine...
        </dict>
    

    NSExtensionJavaScriptPreprocessingFile,您指定包含javascript 文件的.js 文件的名称,该文件必须包含名为ExtensionPreprocessingJS 的全局对象。然后,您应该在您的代码中搜索符合 kUTTypePropertyList 的项目(而且您似乎已经在查看您的代码)。

    这是您应该做的简短列表,询问您是否需要更多内容,如果您也从这里开始,很容易在互联网上找到更多数据。

    【讨论】:

    • 这将让我编写可以遍历 DOM 的 javascript,但随后需要将其呈现为某种形式以匹配用户所看到的内容。这一切都可以在 Javascript 中实现吗?
    • 我不太明白你的问题,你可以根据你对JavaScript的需要返回outerHTML或innerText,所以实现你想要的没有任何限制。
    • 我在页面的渲染版本之后。即用户正在查看的内容。不是原始 HTML。我想这意味着使用类似 jsPDF 的东西,但我认为这不是为任何可能的网页提供 WYSIWYG 渲染的通用解决方案
    • @Matt__C 你能用 API 定义“页面的渲染版本”吗?我认为iOS中没有类似的东西。这不是原始站点 HTML,而是由浏览器解析的 HTML(在该过程中修复了 HTML 中的一些错误),并且它被转换为 web 视图,而没有任何其他可以使用的中间格式。如果你愿意,你可以使用一些像 Kanna 这样的 cocoapods 将其转换为某种层次结构。
    • 我只是希望来自 Safari 的共享能够提供用户所看到的内容,而不是 URL。 iOS 中的其他应用程序提供此功能,为什么 Safari 不提供?获取用户正在查看的页面的 HTML 也不一定提供,这取决于页面的呈现方式。如果这是不可能的,那也是一个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多