【问题标题】:How to listen for, and act upon, a Mac notification using Automator?如何使用 Automator 收听 Mac 通知并采取行动?
【发布时间】:2021-12-07 16:06:48
【问题描述】:

是否可以在 Mac 上监听特定通知并使用 Automator 对其进行操作?

我经常使用运行后台作业的应用程序,然后在完成时发送通知。作业完成后应用程序保持打开状态,因此我想在收到通知时使用 Automator 退出应用程序。

如果在 Automator 中无法做到这一点,我还有其他方法可以做到这一点吗?

更多上下文:应用程序实际上是由使用 Automator 创建的文件夹操作启动的。它检测何时插入特定的 SD 卡并在该 SD 卡上运行备份应用程序。那么,也许我可以在文件夹操作工作流程中添加一些可以检测通知的内容?

【问题讨论】:

  • Automator 更像是一种批处理类型的东西,因此在工作流程完成后它不会保持打开状态。后台应用发送什么样的通知?
  • @red_menace 它向通知中心发送一条消息,只是说“备份已完成”。我希望我可以在 Automator 中构建一些东西来响应通知,例如我所做的响应文件夹更改的文件夹操作。
  • apple.stackexchange.com 上提问可能会得到更好的结果。

标签: macos automator notificationcenter


【解决方案1】:

虽然在 macOS 中查询包含通知的 sqlite 数据库当然是可能的,但在我看来,这似乎是一条不必要的复杂路线,我会先尝试以下...

在您的工作流程中,在最后添加一个“运行 Shell 脚本”操作,其中包含如下内容:

while [ $(ps -e | grep "[N]ameOfBackgroundProcess" | wc -l) -gt 0 ]; do
    sleep 3
done
killall "NameOfAppToQuit" 1&>2 /dev/null

while 循环检查后台作业是否仍在运行。

ps -e 列出所有正在运行的进程。

grep "[N]ameOf..." 获取包含名称的所有行。第一个字母周围的括号将 grep 进程本身排除在输出之外。

wc -l 计算行数。

-gt 0 检查数字是否大于零。

当循环完成时,这意味着进程已经退出,所以我们用killall退出应用程序。

至于通知路由……

我还没有弄清楚一切,但这可能会给你一个良好的开端:

#!/usr/bin/env bash

# Get the directory of the Notification Center database (works for me in Big Sur):
db_dir=$(lsof -p $(ps aux | grep -m1 usernoted | awk '{ print $2 }')| awk '{ print $NF }' | grep 'db2/db$' | xargs dirname)

# Get the app_id:
app_id=$(sqlite3 "$db_dir"/db 'SELECT app_id FROM app WHERE identifier="com.example.identifier";')

# Get relevant records:
sqlite3 "$db_dir"/db "SELECT * FROM record WHERE app_id='$app_id';"

# And this is where I leave you.

要在 GUI 中浏览数据库,请尝试 https://sqlitebrowser.org/

【讨论】:

    猜你喜欢
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多