【问题标题】:Restart Dock from app从应用程序重新启动 Dock
【发布时间】:2015-07-14 20:49:36
【问题描述】:

我有一个需要重新启动停靠应用程序的应用程序。我用两个 Apple Script 都试过了:

var errorDict: NSDictionary? = nil
let appleScript = NSAppleScript(source: "tell application \"Dock\" to quit")
var error = appleScript?.executeAndReturnError(&errorDict)

if let errorDict = errorDict {
    println("An error occured: \(errorDict)")
}

...和NSTask

let task = NSTask()
task.launchPath = "/usr/bin/killall"
task.arguments = ["Dock"]
task.launch()

...还有另一个NSTask

func restartFinder () {
    let task = NSTask()
    task.launchPath = "/bin/bash"
    task.arguments = ["killall Dock"]
    task.launch()
}

但是,似乎不允许我的应用重新启动它。我想将我的应用程序发布到 AppStore,但如何重新启动扩展坞?

使用 Apple 脚本时出错:

An error occured: {
    NSAppleScriptErrorAppName = Dock;
    NSAppleScriptErrorBriefMessage = "Application isn\U2019t running.";
    NSAppleScriptErrorMessage = "Dock got an error: Application isn\U2019t running.";
    NSAppleScriptErrorNumber = "-600";
    NSAppleScriptErrorRange = "NSRange: {27, 4}";
}

使用NSTask时出错:

killall: warning: kill -TERM 255: Operation not permitted

更新
我也用STPrivilegedTask 尝试过,这对我也不起作用。我也没有获得授权窗口。

【问题讨论】:

  • 您无法从沙盒应用程序中执行此操作。你想完成什么?
  • 我正在尝试重新启动 Dock,因为我使用 CFPreferencesSetAppValue 将密钥 mcx-expose-disabled 更改为 com.apple.dock。要使更改生效,我需要重新启动 Dock。
  • 据我所知,您也无法从沙盒应用程序写入 Dock 首选项?
  • 这似乎工作得很好,或者 CFPreferencesSetAppValue 为我的应用程序单独保存值。每次应用重启后,它都会记住最新的设置。
  • 尝试自己强制退出 Dock,或从终端运行 defaults read com.apple.dock,以查看是否实际应用了任何内容,但我强烈怀疑您正在将首选项写入您的应用沙箱。允许沙盒应用修改另一个应用的首选项将是一个巨大的安全漏洞。

标签: macos swift applescript nstask


【解决方案1】:

我会尝试使用 Applescript,但改为这样:

var errorDict: NSDictionary? = nil
let appleScript = NSAppleScript(source: "do shell script \"killall Dock\" with administrator " +
"privileges")
var error = appleScript?.executeAndReturnError(&errorDict)

if let errorDict = errorDict {
    println("An error occured: \(errorDict)")
}

这样,它以管理员权限执行 shell 脚本(就像通过终端一样)。问题是因为这是一个通常只能由系统或用户完成的任务,它需要你输入管理员密码。

【讨论】:

  • 谢谢。但是,这给了我以下错误:NSAppleScriptErrorMessage = "The administrator user name or password was incorrect.";NSAppleScriptErrorRange = "NSRange: {0, 60}";
  • 是否提示您喜欢“Myapp 请求进行更改”。并询问您的密码?您可能想尝试“以管理员权限删除”
  • 或者,您的密码有误吗?也许您没有管理权限?
  • 我没有得到一个身份验证窗口,我希望得到它。
  • 因此,您使用的代码是我建议的没有管理权限部分的代码,它没有为您提供身份验证窗口,而是引发了该错误。看到developer.apple.com/library/mac/technotes/tn2065/_index.html,看来需要加个用户名参数为“root”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多