如何在Swift“ Share App Extension”中获取附件的(NSItemProvider)文件路径?

时间:2018-11-20 12:21:26

标签: swift macos electron

注意:我对Swift编程 非常新(仅限2天),并且我正在将这段代码作为ElectronJS项目。因此,请不要介意我对语言基础知识的无知。谢谢。

我创建了一个包含Share App Extension的Swift应用。

要求

  1. Share App Extension应该能够将共享文件的absolute file path发送到容器应用,即,如果用户在Finder中选择a file (abc.txt) from Desktop并共享到我的应用程序,那么Share App Extension应该能够以

    的格式获取文件路径
    /users/userName/Desktop/abc.txt
    

    我在这里遇到的困难是如何获取与Share App Extension共享的文件的文件路径。如何获取NSExtensionItem可用的Share App Extension中附件的文件路径,或者可以从其他对象获得附件的文件路径?

    (我能够成功使用App GroupsShare App ExtensionApplication之间共享数据)

  2. 在最终项目中,Share App Extension成为了ElectronJS项目的一部分,如前所述。

    是否存在从Share App Extension到Electron应用程序的主/渲染器进程共享上述信息(附件的文件路径)的方法。

    < / li>

1 个答案:

答案 0 :(得分:1)

我正在分享以下解决方案。请记住,这些可能不是最好的解决方案,我愿意提出建议。

第1点的解决方案:

简报:如果用户在Finder的{​​{1}}中选择了要通过操作系统注册的应用程序的Share App Extension共享的文件,则该文件选择与extension context的选择匹配。这样做之后,Share App Extension会同时收到Share App Extensionextension contextNSExtensionItem对象包含NSExtensionItem对象,该对象是通过NSItemProvider共享的所有文件(附件)的对象。

现在,对于通过Share App Extension收到的每种项目类型,在查找函数通过Share App Extension可以识别的数据之后,可以使用UTI(统一类型标识符)来标识其数据。

补救措施:在这里,关键部分是要了解应该首先将其输入文件视为hasItemConforminToTypeIdentifier(_:)类型。然后,在kUTTypeURL对象的completionHandler方法的loadItem中,将得到NSItemProvider,这基本上是我正在寻找的文件路径。

第2点的解决方案:

简报NSURL可以用Swift编写,但是我们项目中的主应用程序却没有!主应用程序是用Share App Extension编写的,离与Swift集成起来还很遥远!除了用ElectronJS编写的应用程序能够以ElectronJS应用程序的形式打包之外,就语言和框架的相互影响而言,ElectronJS和Swift之间几乎没有可集成性。有关。

前提: 因此,前提是能够共享先前提取的文件路径,这些文件路径将从dmg(用Swift编写)传递到主应用程序(用ElectronJS编写)。现在,如果主应用程序是Cocoa应用程序,事情将会变得容易得多。如果它们都属于同一个Share App Extension,则使用Swift API,它们可能已同步读取/写入共享内存。但是,由于这些API在App group中不可用,因此出现了问题。一种补救方法是使用nodeJS库在ElectronJS应用程序中的沙盒环境中运行Swift代码。但是,沙盒环境在数据共享中呈现出自己的细微差别。因此,我暂时保留了这种方法。

因此,我现在选择的方法是使用ElectronJS共享此中间信息。 App Data Directory将在应用程序的Share App Extension目录中写入文件路径信息,而ElectronJS应用程序将使用nodeJs API访问此信息。请记住,这是一种非常原始的方法,需要付出艰辛的努力,但是针对此特定案例的要求无论如何都不需要严格的安全措施。

但是,我一直在积极寻求一种更好的方法来解决问题2。