是否有方法使用自定义图标与applescript显示对话框和通知?
在AppleScript文档中,它提到了显示对话框:
with icon
(文本整型) 要显示的图标的资源名称或ID。要显示的图标类型,with icon
(停止\注意到警告)。您可以指定下列常量之一:
with icon
(别名)指定.icns文件的别名或文件说明符。
这样它就像你可以使用你自己的图标一样,但是我不能让下面的代码工作。
display dialog "Text" with icon "/Users/user/Desktop/asd.icns"
它会得到以下错误:“资源未找到”。
目标是不使用显示对话框,而是使用显示通知。
发布于 2017-12-20 18:32:07
首先,您不能用display notification
显示自定义图标。原因是通知与目标应用程序密切相关。由于AppleScript脚本和applet不是Notification的应用程序,所以通知与current application
( AppleScript Runner )相关。
但您可以使用display dialog
显示自定义图标。
线
with icon
(别名)指定.icns文件的别名或文件说明符。
它的意思是:参数必须是alias
或file
说明符,而不是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:"
发布于 2020-08-17 16:59:47
三年前我就注意到了这个问题,但我偶然发现了这个问题,我正在寻找一个类似问题的解决方案。我的需要display alert
而不是... notification
,但问题是一样的,因为display alert
没有自定义图标选项。
正如在另一个答案中所指出的,AppleScript至少有三个交互式消息类型命令:display dialog
、display alert
、display notification
以及其他命令。似乎奇怪的是,只有第一个可以选择添加一个自定义图标。我真的不明白为什么要让他们保持一致是很简单的。
不用说,这个问题和@vadian的回答启发了我的解决方案--当我意识到这一点的时候,对我来说是一个“该死”的时刻。这可能是这个问题的解决办法,也可能不是。如果它是..。
如果该图标属于一个应用程序,您可以告诉该应用程序显示通知,而不管您的脚本正在做什么。
您的脚本可以对任何其他应用程序、系统事件或自身(如果您的脚本保存为自己的应用程序)或其他任何东西做它需要做的任何事情。在所有这些过程中,您可以有一行内容:
tell application "MyApp" to display notification ...
通知将具有My App
的图标,通知的结果(如果有的话)将返回给脚本的其余部分,然后脚本将在任何其他tell语句或上下文中继续运行。
如果你的图标不是一个应用程序的图标,那么我相信有一些方法可以用你喜欢的图标来创建一个空的应用程序,它可以这样做。诚然,这是个模棱两可的说法,但取决于你有多想这样做,这是一种选择--尽管不是我会在这里详述的。
如果感兴趣的话,请详细介绍一下我的具体案例(但没有特别添加到上面的解决方案中,只是介绍了我是如何实现的):
我正在编写一个脚本,在用户确认后退出并重新打开另一个应用程序。但是,假设我只是想按照这个问题提供一个通知。
选项:
1. display dialog
-有提供自定义图标的选项,但缺乏其他两个选项的功能。
2. display alert
-没有自定义图标,但是有其他需要的特性,在我的例子中,message
参数在主文本下面添加了额外的更小的解释性文本。
3. display notification
-没有自定义图标,但有其他特性,如本问题的海报所要求的。
在我的例子中,我需要警报,因为我需要额外的消息参数(但这也适用于通知)。
在我的例子中,理想情况下,警报的图标应该是我重新启动的应用程序的图标,但我不能告诉应用程序本身显示警报,然后重新启动,因为脚本在退出时失去了与应用程序的连接,并且终止了脚本的运行。
如果我告诉系统事件或脚本本身做所有这一切,那么它可以退出并重新打开应用程序独立于应用程序,但警报有其自身的通用图标或系统事件图标。
然而,如果我做上面所描述的--让我的脚本做它所有的事情,但是让它告诉所讨论的应用程序显示警报(就像上面所描述的那样),那么这个警报就有了这个应用程序的图标,但是这个脚本仍然独立于该警报之外的应用程序来执行它的内容。
解决了我的问题。可能解决也可能不解决这个问题。
发布于 2021-01-23 17:10:50
@DavidT的答案是一个完美的解决方案,当您的脚本被另一个应用程序控制时。然而,从那时起,Mac上的情况发生了一些变化。
值得注意的是,如果您使用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
https://stackoverflow.com/questions/47911943
复制相似问题