Mac 剪贴板自动下行(远端→本机)+ iOS 忽略 auto(Phase 4b·2)

- 共享引擎 JS(web/src/features/clipboard/clipboard.ts):applyRemoteClipboard(SSE clipboard:update / fetchClipboard)在原生壳(isIOSShell)时对远端更新附加 notifyNative("clipboard", { content, sourceDevice, auto:true }),把下行同步过桥给原生。平台差异交原生侧处理,JS 不读 device_type(surface 更小、iOS 无回归)
- 原生 handleNotify("clipboard"):读 auto 标志。macOS 写系统剪贴板(先 armSelfWrite 防自动上行回环)且 auto 时不弹提示(避免远端每次变化刷屏);iOS 忽略 auto(后台受限 + 隐私,不自动写系统剪贴板),仅手动拉取(auto=false)写入并提示。手动拉取两端行为不变
- 至此 Mac 剪贴板双向自动同步齐全:上行(MacClipboardMonitor 监听本机复制 → 上传)+ 下行(远端 SSE → 自动写本机)
- **须 prod 部署 web 引擎**方在正式包生效(Mac 从 drop.commilitia.net 加载 engine.html);本地 CDROP_ENGINE_URL 指向本机 web dev server 可即时验证
- 验证:just typecheck-front(tsc 通过)+ just mac-build(CommilitiaDropMac.app)+ iOS 模拟器(CommilitiaDrop.app)均 BUILD SUCCEEDED
This commit is contained in:
2026-07-08 00:10:52 +08:00
parent b55cb615a3
commit 92e2d550d2
2 changed files with 28 additions and 8 deletions
@@ -1012,20 +1012,29 @@ extension EngineController: WKScriptMessageHandler
if logs.count > Self.logsCap { logs.removeLast(logs.count - Self.logsCap) }
}
case "clipboard":
// UIPasteboard
if let p = payload as? [String: Any], let content = p["content"] as? String, !content.isEmpty
// auto=true JS isIOSShell clipboard:update
// iOS + automacOS
// auto=false
let clip = payload as? [String: Any]
let clipContent = clip?["content"] as? String ?? ""
let clipAuto = (clip?["auto"] as? Bool) ?? false
if !clipContent.isEmpty
{
#if os(macOS)
// monitor
MacClipboardMonitor.shared.armSelfWrite(content)
// monitor
MacClipboardMonitor.shared.armSelfWrite(clipContent)
NSPasteboard.general.clearContents()
NSPasteboard.general.setString(content, forType: .string)
NSPasteboard.general.setString(clipContent, forType: .string)
if !clipAuto { notify(t("ios.clipboard.pulled"), kind: .success) }
#else
UIPasteboard.general.string = content
if !clipAuto
{
UIPasteboard.general.string = clipContent
notify(t("ios.clipboard.pulled"), kind: .success)
}
#endif
notify(t("ios.clipboard.pulled"), kind: .success)
}
else
else if !clipAuto
{
notify(t("ios.clipboard.empty"), kind: .info)
}