注意:我对Swift编程 非常新(仅限2天),并且我正在将这段代码作为ElectronJS项目。因此,请不要介意我对语言基础知识的无知。谢谢。
我创建了一个包含Share App Extension
的Swift应用。
要求:
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 Groups
在Share App Extension
和Application
之间共享数据)
在最终项目中,Share App Extension
成为了ElectronJS项目的一部分,如前所述。
是否存在从Share App Extension
到Electron应用程序的主/渲染器进程共享上述信息(附件的文件路径)的方法。
答案 0 :(得分:1)
我正在分享以下解决方案。请记住,这些可能不是最好的解决方案,我愿意提出建议。
简报:如果用户在Finder
的{{1}}中选择了要通过操作系统注册的应用程序的Share App Extension
共享的文件,则该文件选择与extension context
的选择匹配。这样做之后,Share App Extension
会同时收到Share App Extension
和extension context
。 NSExtensionItem
对象包含NSExtensionItem
对象,该对象是通过NSItemProvider
共享的所有文件(附件)的对象。
现在,对于通过Share App Extension
收到的每种项目类型,在查找函数通过Share App Extension
可以识别的数据之后,可以使用UTI(统一类型标识符)来标识其数据。
补救措施:在这里,关键部分是要了解应该首先将其输入文件视为hasItemConforminToTypeIdentifier(_:)
类型。然后,在kUTTypeURL
对象的completionHandler
方法的loadItem
中,将得到NSItemProvider
,这基本上是我正在寻找的文件路径。
简报: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。