2017-08-10 103 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控制它的行爲。這可能是一種解決方法,但現在它工作得很好。如果你找到了更好的解決方案,我全是耳朵! :) –

相關問題