Can i use OSX native API's in electron

14
3个回答

21

我知道我的回答有点晚了,但你有几种选择:

  • 本地的 Node 模块 允许你使用 C++ 和 ObjectiveC(或 Swift)编写代码,并使用 V8 将其作为 API 暴露给 Node.js。这样做非常灵活和强大,但需要最多的开发时间。

  • NodObjC 是一个本地的 Node 模块,允许你与 ObjC 运行时进行交互。我从未使用过它,但它看起来是一个很不错的项目,可以简化你所要做的任何事情。另一个类似的选项是 node-ffi。不过要注意,你提到的那个框架看起来像是 ObjC 的 API,不确定是否适用于你特定的用例。

  • 对于一些简单的事情,你可以使用 node-applescript。我只是稍微尝试了一下 applescript,但我惊讶于它能做到的一些事情。例如,你可以使用它来设置你的应用程序在登录时启动(参见 node-auto-launch)。虽然与上述选项相比有限制,但如果它可以达到你想要的效果,那么这个方法更为简单,而且不需要编译,这很好。请注意,这将使用 child_process 在后台生成一个新进程来运行 applescript。可能需要考虑一些因素。

  • 如果 OSX API 有一个很好的 CLI,你也可以只使用 Node 的 child_process 模块。这样做的好处是简单易懂,缺点是你可能需要将它输出的字符串解析为有意义的数据结构,这在我的经验中可能会有些困难。


你的第一个要点提到了Objective-C和Swift...如何在Swift中使用本地模块?我只看到支持C++。 - CamHart
@CamHart 嗯,我记得曾经看到有人使用过Swift。看起来可能可以通过https://github.com/noppoMan/node-native-extension-in-swift?的方式实现。 - ccnokes
https://github.com/LinusU/swift-napi-bindings 似乎也能解决问题。 - CamHart

1
你可以使用 ffi 直接从 JavaScript 调用本地库。

Node-ffi 可以在 Electron JS 中使用吗? - Mobigital
1
是的,你可以这样做。但是这可能会相当复杂,但它会起作用。你必须记住,这只适用于OSX,并且在其他系统上具有平台相关的解决方案。此外,如果它们不同,你必须为Electron版本而不是本地Node.js版本构建它。就像本地模块一样。 - justin.m.chase

0

你还可以使用child_process的exec函数在你的Electron应用程序中执行脚本或终端命令。

你也可以轻松地检查你的应用程序运行在哪个平台上:

var isWin = /^win/.test(process.platform);
  if(isWin){
    //windows
  }else{
    //macos
  }

在构建完成后,您还可以执行使用Swift中的OSX本机API的OSX应用程序所创建的脚本:

 exec(path.join(__dirname, './build-scripts/Network -agr1 ' + value1 + ' -agr2 ' + value2),
      function (error, stdout, stderr) {
        console.log('stdout: ' + stdout);
        console.log('stderr: ' + stderr);
        if (error !== null) {
          console.log("Fail to execute script"+ error);
        } else {
          console.log("ok")
        }
      }); 

挑剔一点(抱歉)...process.platform 只能返回以下值:darwinfreebsdlinuxsunoswin32。因此,检查是否为 Windows 就像这样简单:process.platform === 'win32'。请参见 https://nodejs.org/api/process.html#process_process_platform。 - ccnokes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接