找回密碼
 立即註冊
    查看: 143|回覆: 0

    可操作通知完整實作:通知上直接按按鈕,含 iOS 與 Android 的八處差異

    [複製鏈接]

    !lvup!   100%

    386

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22006063
    發表於 2026-9-21 08:38:54 | 顯示全部樓層 |閱讀模式
    一般的推播只能看。可操作通知(actionable notification)可以在通知上直接放按鈕,按下去就做事 —— 不用解鎖、不用打開 App、不用找到那個實體。

    「門沒關,要幫你關嗎」底下直接一個「關」;「洗衣機好了」底下直接一個「晚點再提醒我」。

    一般的推播只能看。可操作通知(actionable notification)可以在通知上直接放按鈕,按下去就做事 —— 不用解鎖、不用打開

    這篇會做完的事


    • 從零做出第一個帶按鈕的通知,並確認按下去真的有事件進來
    • 學會用一條自動化處理全部按鈕(而不是一個按鈕一條自動化)
    • 處理「同一條自動化跑兩次,按鈕互相搶」這個官方明文的問題
    • 把資料跟著按鈕帶回來(iOS 和 Android 做法不一樣,兩種都給)
    • 做緊急通知:突破勿擾模式、在靜音時響鈴 —— 而且 iOS 與 Android 的關鍵欄位完全不同
    • 搞懂 tag 與 group,以及一個很多人沒注意到的限制
    • 完成一個瓦斯警報的完整實例


    全部做完約兩小時。需要一台裝了 Home Assistant App 並登入的手機。

    第零步:確認你的起點

    0-1 裝 App 並登入

    到 App Store 或 Google Play 搜尋 Home Assistant,裝好登入你的伺服器。

    0-2 找出你的通知動作名稱

    開發者工具 → 動作,搜尋框打 notify。你會看到一串,其中會有 notify.mobile_app_charles_iphone 這種形式。把 mobile_app_ 開頭那一個完整抄下來,這篇所有 notify.mobile_app_charles 都要換成你的。

    一個 mobile_app_ 都沒有 → App 沒登入,或登入的不是同一個伺服器。到手機 App 的 設定 → 隨行 App 確認伺服器位址。

    0-3 先送一則最普通的通知,確認管道是通的

    開發者工具 → 動作,右上角切到 YAML 模式,貼上並按「執行動作」:
    1. action: notify.mobile_app_charles
    2. data:
    3.   title: 測試
    4.   message: 如果你看到這則,通知管道是通的
    複製代碼

    你會看到手機在幾秒內跳出通知。手機沒反應的話依序查:手機系統設定裡 Home Assistant 的通知權限有沒有開;手機 App 的 設定 → 隨行 App → 通知 → 通知速率限制 今天是不是用完了(iOS 每天有上限);設定 → 系統 → 日誌 搜尋 mobile_app。

    0-4 重要前提:Home Assistant 有一組比較新的通知寫法叫 notify.send_message,語法比較統一,但它到現在還不支援 data 酬載,也就是放不了按鈕。所以這篇一律用 notify.mobile_app_xxx 形式。

    第一步:第一個帶按鈕的通知

    1-1 送出去

    開發者工具 → 動作,YAML 模式:
    1. action: notify.mobile_app_charles
    2. data:
    3.   title: 門沒關
    4.   message: 後門已經開著 12 分鐘
    5.   data:
    6.     actions:
    7.       - action: CLOSE_DOOR
    8.         title: 幫我關
    9.       - action: IGNORE
    10.         title: 我知道了
    複製代碼

    1-2 注意有兩層 data:外層那個 data: 是給 notify 動作的(title、message 在這),裡面那個 data: 是給手機 App 的(actions、tag、push 在這)。第二層忘了寫的話通知會出現但沒有按鈕,而且不會有任何錯誤 —— 這是第一次寫最常見的錯。

    1-3 你會看到什麼:iOS 的通知跳出來時只有文字,要往下拉或長按才會展開按鈕(鎖定畫面上是由右往左滑 →「檢視」);Android 的按鈕通常直接顯示在通知下方。

    按鈕數量上限不一樣:官方寫 Android 允許 3 個、iOS 約 10 個(超過之後系統的通知介面會出現捲動問題)。要跨平台就以 3 個為上限來設計。

    1-4 按下去,然後看事件

    按按鈕之前先打開監聽:開發者工具 → 事件,在下方「監聽事件」欄位填:
    1. mobile_app_notification_action
    複製代碼

    按「開始監聽」。

    現在按手機上的「幫我關」。

    你會看到瀏覽器裡立刻出現一筆事件:
    1. event_type: mobile_app_notification_action
    2. data:
    3.   action: CLOSE_DOOR
    4.   # Android 還會多帶回通知裡的其他 data 欄位,例如:
    5.   # tag: xxx
    6. origin: REMOTE
    7. time_fired: "2026-09-25T00:45:05.550251+00:00"
    8. context:
    9.   id: 01JXXXXXXXXXXXXXXXXXXXXXXX
    10.   parent_id: null
    11.   user_id: 4a2b...
    複製代碼

    這一步是整篇的地基。 看得到這筆事件,後面全部都做得出來;看不到的話,往下做任何事都是猜。

    完全沒有事件 → 兩個可能:


    • 手機 App 跟伺服器的連線斷了。到手機 App 設定 → 隨行 App → 疑難排解 看連線狀態
    • 你按的是一則舊的通知。舊通知上的動作代號可能已經不存在了


    第二步:接住按鈕 —— 用一條自動化處理全部

    2-1 不要一個按鈕一條自動化

    按鈕多了之後會爆炸。用一條加 choose:

    以下還有約 83% 的內容
    登入後即可閱讀完整教學

    登入繼續閱讀使用 Google 登入
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    延伸閱讀

    加入惟家 LINE 群 QR Code加入惟家 LINE 群

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-11-10 00:46 , Processed in 0.127294 second(s), 25 queries .

    快速回覆 返回頂部 返回列表