Mac 原生系统通知 + 接收目录可配(Phase 4b·1)

- MacNotifier:窗口非前台(!NSApp.isActive)时对「收到消息 / 收到文件」发原生系统通知(UNUserNotificationCenter,授权已由引擎启动的 PushRegistry.requestAuthorizationAndRegister 一并请求)。对齐桌面 app.ShowNotification——前台事件由应用内 NoticeOverlay / 未读红点负责,仅 app 非活跃才发系统通知,避免与应用内提示重复。引擎 handleNotify 的 "message"(新到对端消息,非当前会话)+ "transferDone"(incoming 且 completed)两处加 macOS 挂钩
- 接收目录可配:DownloadManager.downloadDir 在 macOS 读 UserDefaults macDownloadDir(设置页 NSOpenPanel 选目录),未配 / 目录已失效则回退系统「下载」目录(比「文稿」更符桌面直觉);iOS 仍固定沙盒 Documents。设置加「接收」区(显示当前保存目录 + 选择目录…)。非沙盒构建用普通路径即可;沙盒分发(Phase 6)须改安全作用域书签
- 验证:just mac-build(CommilitiaDropMac.app)+ iOS 模拟器(CommilitiaDrop.app)均 BUILD SUCCEEDED
This commit is contained in:
2026-07-08 00:07:59 +08:00
parent 492563ae44
commit b55cb615a3
4 changed files with 71 additions and 0 deletions
@@ -969,6 +969,10 @@ extension EngineController: WKScriptMessageHandler
if isNew, item.direction == "incoming", item.peerName != activeConversation
{
unreadByPeer[item.peerName, default: 0] += 1
#if os(macOS)
//
MacNotifier.notifyIfInactive(title: item.peerName, body: item.text)
#endif
}
}
case "transferDone":
@@ -976,6 +980,13 @@ extension EngineController: WKScriptMessageHandler
if let p = payload as? [String: Any], let item = Self.parseTransfer(p)
{
noteIncomingTransfer(item) // #5 seen
#if os(macOS)
//
if item.direction == "incoming", item.state == "completed"
{
MacNotifier.notifyIfInactive(title: "收到文件", body: item.fileName)
}
#endif
transfers.removeAll { $0.sessionId == item.sessionId }
history.removeAll { $0.sessionId == item.sessionId }
history.insert(item, at: 0)