使用自定义图标显示对话框的AppleScript

5
有没有办法在 AppleScript 的 display dialog 和通知中使用自定义图标?
在 AppleScript 文档中,关于 display dialog,它提到:
- with icon (text | integer):要显示的图标的资源名称或 ID。 - with icon (stop | note | caution):要显示的图标类型。您可以指定以下常量之一: - stop (或 0):显示一个停止图标。 - note (或 1):显示应用程序图标。 - caution (或 2):显示带有应用程序图标徽章的警告图标。 - with icon (alias | file):指定 .icns 文件的别名或文件说明符。
因此,似乎可以使用自己的图标,但我无法使以下代码工作。
display dialog "Text" with icon "/Users/user/Desktop/asd.icns"

我遇到了以下错误:“找不到资源。”
目标是不使用显示对话框,而改用显示通知。
4个回答

6

首先,使用 display notification 无法显示自定义图标。原因是通知与目标应用程序密切相关。由于 AppleScript 脚本和 applet 在通知框架中不属于应用程序,因此通知与当前应用程序(AppleScript Runner)相关联。


但是,您可以使用 display dialog 显示自定义图标。

下面这行代码:

with icon (alias | file) 指定 .icns 文件的别名或文件说明符。

意思很明确:该参数必须是别名或文件说明符,而不是 POSIX 或 HFS 字符串路径。


或者

display dialog "Text" with icon alias ((path to desktop as text) & "asd.icns")

或者

display dialog "Text" with icon file ((path to desktop as text) & "asd.icns")

path to desktop as text 表示当前用户桌面的 HFS 路径:

"Macintosh HD:Users:user:Desktop:"


这似乎不起作用。我认为它在通知中也不会起作用。 - WalterBeiter
它确实有效,你是对的,它只能与display dialog一起使用,而不能与display notification一起使用,因为后者使用AppleScript运行器应用程序作为目标,并且不提供icon参数。 - vadian
1
你不需要这样搞定规范。如果你有一个posix路径,只需使用“POSIX文件”命令:例如,with icon POSIX file "/Users/user/Desktop/asd.icns" - Ted Wrigley
@TedWrigley 我讨厌 POSIX 文件 和在用户区硬编码路径。 - vadian

3
你的路径规范有误。如果你有一个指向icns文件的posix路径,请使用POSIX file类型转换:
display dialog "Text" with icon POSIX file "/Users/user/Desktop/asd.icns"

这将把字符串路径强制转换为系统可理解的文件引用,并且可以正常工作。

如果你正在使用JavaScript,可以使用withIcon: Path("/Users/user/Desktop/asd.icns") - Thomas Hallgren

2
请注意,虽然这个问题已经三年前了,但我碰巧在寻找类似问题的解决方案时找到了它。我的需求是显示警报而不是... 通知,但问题相同,因为显示警报没有自定义图标选项。
如另一个答案中所述,AppleScript至少有三种交互式消息类型命令:显示对话框显示警告显示通知,可能还有其他命令。奇怪的是,只有第一种命令有添加自定义图标选项,我真的不明白为什么这样做,因为让它们保持一致很简单。
毋庸置疑,这个问题以及@vadian的回答启发了我的解决方案——让我意识到了一个“duh”时刻。如果这是一个解决办法,那么我会把它发布出来......
如果要显示的图标属于一个应用程序,您可以告诉该应用程序显示通知,无论您的脚本在做什么其他事情。
您的脚本可以针对其他应用程序、系统事件、它本身(如果您的脚本作为其自己的应用程序保存),或其他任何东西进行所需的操作。在所有这些事情中,您可以添加一行代码,如下所示:
tell application "MyApp" to display notification ...

通知将具有“我的应用程序”的图标,如果有的话,通知的结果将返回到脚本的其余部分,然后您的脚本将在任何其他tell语句或上下文中继续执行。
如果您的图标不是应用程序的图标,则我认为有方法可以创建一个带有您喜欢的任何图标的空应用程序,该应用程序可以以此方式运行。尽管这有点笨拙,但这取决于您有多想要它,这是一种选择-尽管我不会在此扩展。
如果感兴趣,可以详细了解我的具体情况(但不特别添加到上述解决方案中,只涵盖我如何到达那里):
我正在编写一个脚本,在用户确认后退出并重新打开另一个应用程序。但是,假设我只想像本问题一样提供通知。
选项:
1.显示对话框-display dialog-具有提供自定义图标的选项,但缺少其他两个选项的功能。
2.显示警报-display alert-没有自定义图标,但具有其他所需的功能,在我的情况下是message参数,它在主要文本下方添加了额外的较小说明文字。
3.显示通知-display notification-没有自定义图标,但具有本问题发布者所需的其他功能。
在我的情况下,我想要警报,因为我想要额外的message参数(但这也适用于通知)。
在我的情况下,理想情况下,警报的图标应该是我重新启动的应用程序的图标,但是当脚本退出并且它终止脚本的运行时,我无法告诉应用程序本身显示警报并重新启动。如果我告诉System Events或脚本本身做所有这些事情,那么它可以独立于应用程序退出和重新打开应用程序,但警报具有其自身的通用图标或System Events图标。
但是,如果我执行上述操作-让我的脚本执行所有操作,但让它告诉相关应用程序显示警报(并仅如上所述),则警报将具有相关应用程序的图标,但脚本仍然会在该警报之外独立于应用程序执行其任务。
解决了我的问题。可能会解决此问题,也可能不会。

1

@DavidT的答案是一个完美的解决方案,当你的脚本由另一个应用程序控制时。然而,自从那时以来,在Mac OS上有些事情发生了变化。

值得注意的是,如果您使用tell application "MyApp" to display alert ...运行您的脚本,您将促使用户授予您的应用程序控制自身的权限,至少从Catalina开始。这不仅会让用户感到烦恼,因为它是一个新的权限请求,而且看起来有点愚蠢,因为对话框要求用户允许"MyApp"控制"MyApp",如果用户拒绝,您的脚本将失败。

为避免权限请求,只需使用tell me to display alert ...即可正常工作。

您可能会遇到的另一个问题是,如果您的脚本作为root启动,osascript可能会抛出异常。我在这里找到了一个不错的解决方法。

这是如何使用正确用户启动对话框的小例子:

uid=determineUserIdFunction(...)
launchctl asuser $uid /usr/bin/osascript <<-EOS
    tell me to display dialog "Now you see me" buttons {"OK"} default button 1 with title "WARNING!"
EOS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接