2017-08-10 144 views
3

我想嵌入一个Finder Sync扩展用Swift写在我的应用程序中用Electron编写。我如何设法让他们一起工作并相互沟通?我已阅读Apple documentation,但它仅解释如何将目标添加到本机应用程序。我还注意到,我可以使用electron builder手动将.appex编译文件(由XCode生成)注入应用程序Plugins文件夹中。 如何在XCode中开发和测试扩展并将其正确嵌入到自定义Electron应用程序中? 有什么建议吗?如何在电子应用程序中嵌入mac应用程序扩展?

非常感谢您的任何建议

+1

您是否尝试过将您的appex复制粘贴到Electron应用程序的Plugins文件夹中?只要您的扩展程序根据文档进行了配置,它应该与您的主应用程序一起启动(可能需要对其进行签名才能自动启动)。要进行测试,请确保您的扩展程序在系统偏好设置 - >扩展程序中可见并启用。然后将您的调试器附加到XCode中的Finder Sync进程。 – dejuknow

+0

是的!如果在扩展程序正确启动时写入'.plist'文件,则此方法正常工作。剩下的唯一问题是如果文档指定唯一允许的方法是扩展ObjectiveC/Swift中的'FIFinderSync'类,那么如何让主应用程序与扩展进行通信。我怎样才能在'.appex'扩展中引发一个JS事件? –

+0

您将需要使用某种形式的进程间通信。我对Electron API并不熟悉,但你应该能够使用套接字来处理IPC:https://nodejs.org/api/net.html#net_class_net_socket – dejuknow

回答

0

如何嵌入的电子应用程序在Mac应用程序扩展?

我将其编译为一个独立的二进制和包括它在一些目录,从使用child_process.execFile

执行与的execfile二进制时,可以使用参数的电子应用程序来执行,这里是一个例子(使用诺)

const util = require('util'); 
const execFile = util.promisify(require('child_process').execFile); 
async function FinderSyncExtPlugin(ARGUMENTS) { 
    const { stdout } = await execFile('YourBinary', ARGUMENTS); 
    console.log(stdout); 
} 
FinderSyncExtPlugin(['argument1','argument2','...']); 

然后,您可以使用标准输出知道所请求的操作的状态/结果。

+0

无法将finder扩展程序编译为独立二进制文件,因为它是由Xcode自动生成的,/ObjC项目使用不同的目标。您的方法仍然可以正常使用命令行MacOS应用程序,但不适用于我的具体情况... –

1

在您的Electron根文件夹中创建PlugIns文件夹。

.appex文件复制到PlugIns文件夹中。

如果您使用的电子制造商,修改的package.json文件 - 添加: "extraFiles": ["PlugIns/"]“陆委会”部分。

构建。 内容你的应用程序包将包含PlugIns文件夹和你的appex文件,并且appex将被加载到你的应用程序的进程中。

+0

您是对的。我已经设法实施这个月前。也许我会发布一个完整的答案,就我迄今为止的做法。 –

+0

基本上你是投入是正确的。在运行时,我发现使扩展与Electron应用程序通信的唯一方式是使用Socket.io在回送接口上实现IPC。实际上,我在Swift中实现了同步扩展,将它构建在一个appex文件中,并按照您在答案中提到的步骤将其包装在Electron中。现在我通过Socket.io控制它的行为。这可能是一种解决方法,但现在它工作得很好。如果你找到了更好的解决方案,我全是耳朵! :) –

相关问题