【问题标题】:Using Electron / Node.js, how can I detect all installed browsers on macOS?使用 Electron / Node.js,如何检测 macOS 上所有已安装的浏览器?
【发布时间】:2017-11-26 21:38:27
【问题描述】:

我正在尝试找到一种方法来列出我的 macOS Electron 应用程序中所有已安装的网络浏览器。最好的方法是什么?或者...我很乐意维护一个可能的浏览器列表,但需要一种方法来检查它们是否存在。

【问题讨论】:

  • 也许this applescriptpackage 的组合可以为您执行这些操作。
  • 为什么不使用名为 'fetch-installed-software' 的 npm 包?
  • fetch-installed-software 仅支持 Windows,现在看起来没有维护。我现在使用 mdfind 'kMDItemContentType == "com.apple.application-bundle" && kMDItemCFBundleIdentifier == "${appId}"' 通过捆绑 ID 检测浏览器。

标签: node.js macos electron


【解决方案1】:

您需要create a child process 执行命令以接收当前安装的应用程序。幸运的是,macOS 提供了 system_profiler 实用程序来执行此操作,甚至更好的是它允许通过 -xml 参数导出 XML。但请注意,它还不是最快的功能。

您需要从子进程回调中获取缓冲区块,将其编码为 utf-8,然后通过 xml2js 之类的内容解析 XML 字符串。之后就是简单的检查一下浏览器的属性有没有检查。

Will Stone 更新了代码

import jp from 'jsonpath' // for easier json traversal

import { spawn } from 'child_process'
import parser from 'xml2json'

const sp = spawn('system_profiler', ['-xml', 'SPApplicationsDataType'])

let profile = ''

const browsers = [
  'Brave',
  'Chromium',
  'Firefox',
  'Google Chrome',
  'Maxthon',
  'Opera',
  'Safari',
  'SeaMonkey',
  'TorBrowser',
  'Vivaldi'
]

sp.stdout.setEncoding('utf8')
sp.stdout.on('data', data => {
  profile += data // gather chunked data
})

sp.stderr.on('data', data => {
  console.log(`stderr: ${data}`)
})

sp.on('close', code => {
  console.log(`child process exited with code ${code}`)
})

sp.stdout.on('end', function() {
  profile = parser.toJson(profile, { object: true })
  const installedBrowsers = jp
    .query(profile, 'plist.array.dict.array[1].dict[*].string[0]')
    .filter(item => browsers.indexOf(item) > -1)
  console.log(installedBrowsers)
  console.log('Finished collecting data chunks.')
})

初始代码:

const { spawn } = require('child_process');
const parser = new xml2js.Parser();
const sp = spawn('system_profiler', ['-xml', 'SPApplicationsDataType']);

sp.stdout.on('data', (data) => {
  parser.parseString(data, function(err, result){
    console.log(result)
  });
});

sp.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

sp.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

【讨论】:

  • 感谢您的回答,但是这不会返回有关已安装浏览器的信息。我错过了什么吗?
  • 对不起我的错误我应该更明确一点。 system_profiler 确实为您提供了所有已安装的软件,您可以检查 XML 返回是否包含google chromefirefox 节点等。您可以使用此命令system_profiler -xml SPApplicationsDataType 通过终端测试返回
  • 有趣。如果我通过终端运行它,那确实给了我安装的所有应用程序。但是,当从我的 Electron 应用程序中的 main.js 文件运行时,我得到的结果要少得多。
  • 如果你生成一个进程,你基本上做的和你把它输入到终端一样,这就是sp 变量所做的。正如您可以想象的那样,这将花费一些时间并且可能会失败,因此 sp 为stdoutstderrclose 提供了 3 个事件处理程序,如果一切正常,打印的缓冲区将转换为字符串并通过数据参数进行解析, xml2js 将为您将其传输到 JavaScript 对象中,然后您可以检查浏览器是否存在。
  • 太好了。将我的代码复制到您的答案中:我将删除我的代码,并将您的答案标记为正确(正如您所做的大部分工作一样,并为我指明了正确的方向)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多