Я создаю небольшое приложение в node.js, которое использует execa
для чтения операторов печати, скомпилированных из приложения Swift. Идея аналогична Синдре Сорхусу (кто еще !?) не беспокоить
Хотя я не программист Swift, я собрал довольно простое решение. Двоичный файл компилируется путем запуска swift build --configuration=release
из CL для использования в приложении узла. Он также прекрасно компилируется (без CLI-части) на игровой площадке Swift из XCode, и я вижу, что поступают правильные операторы печати.
import Cocoa
var isLocked:Bool = false
DistributedNotificationCenter.default().addObserver(forName: .init("com.apple.isScreenLocked"), object: nil, queue: nil) { notification in
print("Screen is locked")
isLocked = true
}
DistributedNotificationCenter.default().addObserver(forName: .init("com.apple.isScreenUnlocked"), object: nil, queue: nil) { notification in
print("Screen is unlocked")
isLocked = false
}
struct CLI {
static var standardInput = FileHandle.standardInput
static var standardOutput = FileHandle.standardOutput
static var standardError = FileHandle.standardError
static let arguments = Array(CommandLine.arguments.dropFirst(1))
}
switch CLI.arguments.first {
case "status":
print(isLocked)
default:
print("Unsupported command", to: .standardError)
exit(1)
}
// Some other functions omitted for brevity
Теперь, когда я запускаю приведенный ниже код из Node.js, Кажется, все работает нормально. Однако по какой-то причине наблюдатель не получает уведомление.
'use strict';
const execa = require('execa');
const electronUtil = require('electron-util/node');
const binary = path.join(electronUtil.fixPathForAsarUnpack(__dirname), 'IsLockedOrNot');
setInterval(async () => {
const {stdout} = await execa(binary, ['status']);
console.log(stdout) // keeps logging false, also when screen is locked
}, 1000)
Есть ли у кого-нибудь идеи, ПОЧЕМУ уведомления не принимаются в этом сценарии? Я пробовал разные вещи, такие как явное отключение спящего режима shell.exec('sudo pmset -a disablesleep 1')
и компиляция приложения с флагом --disable-sandbox
. Не повезло, однако, пока не знаю ..