# 隔空投送插件(Mio Island) 在 Mio Island 面板里一键打开系统隔空投送。点一下中间的卡片区域,选 文件,系统原生的 AirDrop 弹窗就会出现,发给附近的设备或联系人。 [English](README.md) ## 功能 - **一键选文件** — 弹出系统原生 `NSOpenPanel`,支持多选、文件夹 - **原生 AirDrop 弹窗** — 用 `NSSharingService(.sendViaAirDrop)`, Finder 发 AirDrop 就是用这个 API。不涉及私有 API,不需要 entitlements - **中英双语** — 跟随 Mio Island 的 `appLanguage` 设置(`zh` / `en`) - **零权限要求** — 不需要辅助功能、自动化、网络,所有发送走 macOS 内置 AirDrop ## 为什么不做拖拽? Mio Island 的刘海面板在用户点击面板外区域时会自动收起 —— 这使得 "展开 Island → Cmd-Tab 到 Finder → 抓文件 → 拖回来" 这条交互无 法成立,因为拖拽目标在用户还没到之前就消失了。我们尝试过三次修改 host 的事件路由来支持持久化,每次都暴出新 bug(乱触、卡顿、冻结 UI)。 所以这个插件**只做点击选择文件**这条路径,稳如老狗。 如果你想要拖拽的体验,未来 Mio Island 主程序可能会加一个全局 拖拽触发机制(类似 Atoll 的 Dynamic Island),届时这个插件会自 动受益。 ## 系统要求 - macOS 15.0+ - Mio Island v2.2.0+ ## 本地构建 ```bash ./build.sh ``` 产物在 `build/airdrop.bundle` 和 `build/airdrop.zip`。复制 bundle 到 `~/.config/codeisland/plugins/` 即可本地测试。 ## 代码结构 ``` Sources/ ├── MioPlugin.swift ← 协议副本(@objc 运行时按签名匹配) ├── AirDropPlugin.swift ← principal 类,对应 Info.plist 的 NSPrincipalClass ├── AirDropState.swift ← @MainActor ObservableObject,状态机 ├── services/ │ └── AirDropService.swift ← NSSharingService 的薄封装 ├── ui/ │ ├── ExpandedView.swift ← 卡片容器布局 │ └── DropZoneView.swift ← 可点击目标,根据 phase 做视觉反馈 └── support/ ├── Localization.swift └── HostVersionCheck.swift ``` ## 许可 MIT — 见 [LICENSE](LICENSE)。