V2EX 09月30日 12:23
Mac 微信与 iPhone 通知联动优化方案
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

macOS用户在使用微信时常遇到iPhone通知被打断的问题。当mac版微信登录时,iPhone会收到“mac已登录,手机通知已关闭”的提示,这可能导致错过重要消息。本文介绍一种利用Hammerspoon工具的解决方案,通过脚本自动检测用户是否处于闲置状态。若检测到连续120秒无键盘或鼠标操作,脚本将自动退出Mac版微信,从而使iPhone恢复接收通知。当检测到用户恢复活动时,脚本会立即重新启动微信。此方案旨在解决Mac和iPhone微信通知的冲突,确保信息不错过,同时兼顾用户体验。

📱 **痛点与需求分析**:当mac版微信登录时,iPhone上的通知会被屏蔽,造成潜在的消息遗漏风险,尤其是在与重要联系人(如女神)沟通时。用户希望在不手动干预的情况下,实现Mac和iPhone微信通知的无缝切换,避免错过信息。

💡 **核心解决方案——Hammerspoon脚本**:利用Hammerspoon工具,编写脚本实现自动化管理。脚本的核心逻辑是定时检测用户活动(键盘、鼠标),当检测到连续120秒无操作时,自动退出Mac版微信,以解除iPhone通知屏蔽;当检测到用户有操作时,则立即启动Mac版微信,恢复正常使用。

⚙️ **脚本功能详解**:该脚本每30秒检查一次用户活动状态。若用户闲置超过120秒,则会“优雅地”退出微信(而非强制终止,以确保iPhone能感知到Mac已退出)。同时,脚本还监听系统电源事件,在Mac休眠或屏幕关闭时退出微信,并在系统唤醒或屏幕恢复时延迟启动微信,确保了在不同状态下的通知流畅性。

🔋 **电源事件与活动触发**:脚本通过监听系统休眠、唤醒、屏幕休眠和屏幕唤醒事件,来主动管理微信的退出与启动。此外,任何键盘敲击或鼠标移动都会被视为用户活动,触发微信的即时启动,确保用户在需要时能快速接入。

⚠️ **局限性与改进思考**:文章指出,iPhone通知栏设置“1小时提醒”或“今天不提醒”是较为粗暴的解决方案。与企业微信不同,微信本身缺乏更精细的无活动通知恢复设置,这提示了在AI时代,这类用户体验的细节仍有待完善。

1 、痛点:在 mac 上聊天的时候 iPhone 手机就一直咚咚的响好烦,如果点击顶部把 ”mac 已登录手机通知关闭“ 的话,又会忘了开,导致女神的消息无法及时回复,被 diss 不是一个合格的舔狗,emm...

2 、观察结论:如果在 mac 上退出微信的话,手机上的 ”mac 已登录手机通知关闭“ 会自动消掉,手机就能收到通知,从而达到无缝衔接的目的。

3 、解决思路:使用 hammerspoon 实现如下功能:a.每 30 秒检查一次键盘和鼠标动作,如果 120 秒没有动作就退出 mac 微信(注意不能用 killall ,否则 iPhone 那边不知道 mac 上已经退出了)b.当检测到有鼠标和键盘动作后,立即调起微信登录

4 、具体方法:a.下载、安装、打开 hammerspoon ( https://www.hammerspoon.org/)b.打开配置文件写入脚本:

`local idleLimit = 120 -- 120 秒无操作算不活跃local checkInterval = 30 -- 每 30 秒检查一次local wechatBundleID = "com.tencent.xinWeChat"

local timer = nillocal enabled = truelocal lastRunning = nil -- 记录上一次运行状态,避免重复日志

-- 判断微信是否运行local function isWeChatRunning()return hs.application.get(wechatBundleID) ~= nilend

-- 优雅退出微信local function quitWeChat(reason)local app = hs.application.get(wechatBundleID)if app thenapp:kill()hs.alert.show("💤 自动退出微信")print("WeChat quit (" .. (reason or "idle") .. ") at " .. os.date())lastRunning = falseendend

-- 启动微信local function launchWeChat(reason)if not enabled then return endif not isWeChatRunning() thenhs.application.launchOrFocusByBundleID(wechatBundleID)hs.alert.show("🚀 启动微信")print("WeChat launched (" .. (reason or "active") .. ") at " .. os.date())lastRunning = trueendend

-- 检查是否该退出local function checkIdle()if not enabled then return endlocal idleTime = hs.host.idleTime()local running = isWeChatRunning()

if running ~= lastRunning then    print("WeChat running=" .. tostring(running) .. " at " .. os.date())    lastRunning = runningendif idleTime > idleLimit and running then    quitWeChat("idle")end

end

-- 电源事件监听:休眠时退出微信,唤醒后延迟启动local sleepWatcher = hs.caffeinate.watcher.new(function(eventType)if eventType == hs.caffeinate.watcher.systemWillSleep thenquitWeChat("sleep")elseif eventType == hs.caffeinate.watcher.systemDidWake thenhs.timer.doAfter(10, function()launchWeChat("wake")end)elseif eventType == hs.caffeinate.watcher.screensDidSleep thenquitWeChat("screens sleep")elseif eventType == hs.caffeinate.watcher.screensDidWake thenhs.timer.doAfter(5, function()launchWeChat("screens wake")end)endend)sleepWatcher:start()

-- 定时器:负责检测是否要退出if timer thentimer:stop()endtimer = hs.timer.doEvery(checkInterval, checkIdle)

-- 事件监听:键盘/鼠标动作 → 立即启动微信local eventtap = hs.eventtap.new({hs.eventtap.event.types.keyDown,hs.eventtap.event.types.mouseMoved,hs.eventtap.event.types.leftMouseDown,hs.eventtap.event.types.rightMouseDown}, function(_)launchWeChat("input")return falseend)eventtap:start()`后记:1 、在 iPhone 通知栏可设置 1 小时不提醒,今天不提醒,但是这样也是简单粗暴

2 、微信不像企业微信那样可以设置 5min 10min 无活动就恢复通知

在 AI 大爆发的时代,他们把东西做成这样我表示很痛心

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Mac通知 iPhone通知 微信 Hammerspoon 自动化 通知管理 MacWeChat iPhoneNotifications WeChat Hammerspoon Automation NotificationManagement
相关文章