Как выполнить запуск загрузки launchctl в приложении Macosx с помощью swift? - PullRequest
0 голосов
/ 11 марта 2020

Я хочу разработать приложение MacOS для управления некоторыми своими собственными процессами. Я думал, что должен использовать launchd, но я обнаружил, что когда я использую launchd для запуска процесса, он всегда терпит неудачу. Ошибка выглядит следующим образом:

0:86: execution error: 2020-03-11 17:15:02.213472+0800 launchctl[9835:373247] [All] launchctl start: launchctl start com.example.myprocess (3)

Я закрыл песочницу. Я использовал Apple Script, чтобы подать заявку на root разрешения. Как:

do shell script \"launchctl start com.example.myprocess\" with administrator privileges

Как мне с этим бороться, спасибо.

Вот мой быстрый код:

Button(action: {
//    let bundle = Bundle.main
//    let cmd = bundle.path(forResource: "test", ofType: "sh")!
//    let cmd = "launchctl load ~/Library/LaunchAgents/com.example.myprocess.plist"
    let cmd  = "launchctl start com.example.myprocess"
    let process = Process()
    process.launchPath = "/usr/bin/osascript"
    let arg = String.init(format: "do shell script \"%@\" with administrator privileges with prompt \"XXXXX\"", cmd)
    print(arg)
    process.arguments = ["-e", arg]
    process.launch()
    process.waitUntilExit()
    print("status: ", process.terminationStatus)
}) {
    Text("Start")
}.disabled(isRunning).padding(.trailing)

Вот мой plist-код:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.example.myprocess</string>
        <key>ProgramArguments</key>
        <array>
            <string>/Users/tang/bin/myprocess</string>
            <string>start</string>
        </array>
        <key>StandardOutPath</key>
        <string>/Users/tang/myprocess.log</string>
        <key>StandardErrorPath</key>
        <string>/Users/tang/myprocess.log</string>
        <key>WorkingDirectory</key>
        <string>/Users/tang/</string>
    </dict>
</plist>

1 Ответ

0 голосов
/ 27 марта 2020

Приложение, которое я разработал с использованием QT, может легко вызывать сценарии оболочки и выполнять команды launchd. Это исходный код моего демо-приложения: https://github.com/yiwenlong/launchduidemo

...