Не получает DistributedNotificationCenter в инструменте командной строки Swift - PullRequest
0 голосов
/ 22 марта 2020

Я создаю небольшое приложение в 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. Не повезло, однако, пока не знаю ..

...