iOS 操作扩展,从 Safari 共享 PDF 失败

Posted

技术标签:

【中文标题】iOS 操作扩展,从 Safari 共享 PDF 失败【英文标题】:iOS Action Extension, share PDF from Safari fails 【发布时间】:2020-07-05 06:37:43 【问题描述】:

我有一个操作扩展,我正在尝试共享 PDF 文件。

我正在使用为我自动生成的 ActionRequestHandler.swift 的样板代码:

func beginRequest(with context: NSExtensionContext) 
    // Do not call super in an Action extension with no user interface
    self.extensionContext = context
    for item in context.inputItems as! [NSExtensionItem] 
            if let attachments = item.attachments 
                for itemProvider in attachments 
                ...
                ...
                
             
    

在其他应用中工作

当从除 Safari 之外的每个应用程序导出时,我得到的是:

没关系,我可以通过检查com.adobe.pdf 来验证它是pdf,然后我使用public.file-url 来获取共享文件。

Safari 失败

但是当从 Safari 导出时(无论我选择“自动”还是“Pdf”作为文件类型),我只会得到com.apple.property-list

更多信息

Dropbox 和 OneDrive 都可以工作,所以它可以通过某种方式实现。

我还意识到,从受某种登录保护的 url 共享 PDF 不适用于“Public.file-url”,因为无法从 swift-code 内部访问该 URL。

这使我认为 java-script 预处理器可能是要走的路?用 JS 获取 pdf-contents 并传递给代码?

问题

如何使用com.apple.property-list 获取文件? 还是我做的一些配置有问题,因为我得到了这个属性列表而不是 pdf/url 组合?

【问题讨论】:

您是否尝试在 for-each 循环中使用带有“public.file-url”标识符的“loadItem”加载项目? 是的,我使用了“hasItemConformingToTypeIdentifier”,它匹配“public.item”、“public.data”和“com.apple.property-list”。我猜前两个匹配是因为 property-list 有数据作为超类,而“public.item”似乎是通用的。 【参考方案1】:

虽然我没有设法找到原始问题的解决方案,但我确实设法解决了问题。

添加操作扩展时,可以选择Action type

呈现用户界面 没有用户界面

我选择了No user interface,因为那是我想要的。

这给了我一个Action.js 文件和ActionRequestHandler.swift

class ActionRequestHandler: NSObject, NSExtensionRequestHandling 
 ...

这些文件似乎适用于 Action.js 应该获取/操作源页面然后将信息发送到支持 Swift 代码的系统。如我最初的问题所述,从 Safari 共享 PDF 时,不会附加任何 PDF-URL。

可行的解决方案

如果我选择Presents user interface,我会得到另一个设置,ActionViewController.swift

class ActionViewController: UIViewController 
 
override func viewDidLoad() 
    super.viewDidLoad()

    // Get the item[s] we're handling from the extension context.

    for item in self.extensionContext!.inputItems as! [NSExtensionItem] 
        for provider in item.attachments! 
            if provider.hasItemConformingToTypeIdentifier(kUTTypePDF as String) 
                provider.loadItem(forTypeIdentifier: kUTTypePDF as String, options: nil, completionHandler:  (pdfUrl, error) in
                    OperationQueue.main.addOperation 
                            if let pdfUrl = pdfUrl as? URL 
                            // pdfUrl now contains the path to the shared pdf data
                    
                
          
      
 

此文件/解决方案按预期工作,extensionContext 填充有一个符合预期kUTTypePDFattachment

为什么这行得通,而“无 gui”方法却行不通,我不知道。错误或功能?

我没有在 Apple 的开发者部分找到任何关于它应该如何/为什么工作的文档,“共享扩展”文档非常简单。

【讨论】:

以上是关于iOS 操作扩展,从 Safari 共享 PDF 失败的主要内容,如果未能解决你的问题,请参考以下文章

从 iOS Safari 共享扩展打开主应用程序

iOS 共享扩展仅在 Safari 中显示

我应该使用操作扩展的共享扩展吗?

无法从项目中删除共享扩展,它仍然出现在 Safari 中

从 iOS Safari 抓取 URL

如何为 Safari 制作 iOS 应用程序扩展以投射视频