我正试图找到一种方法来列出我的macOS Electron应用程序中所有已安装的Web浏览器。最好的方法是什么?或者......我很乐意维护可能的浏览器列表,但需要一种方法来检查它们是否存在。
答案 0 :(得分:1)
您需要create a child process执行命令以接收当前安装的应用程序。 Luckely 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}`);
});