Manila项目架构全解析:主App与Finder扩展双Target如何分工协作

发布时间:2026/8/27 15:25:33
Manila项目架构全解析:主App与Finder扩展双Target如何分工协作 Manila项目架构全解析主App与Finder扩展双Target如何分工协作【免费下载链接】ManilaA Finder extension for changing folder colors项目地址: https://gitcode.com/gh_mirrors/ma/ManilaManila 是一个开源的 macOS 文件夹变色工具它的 Xcode 工程把「主 App」和「Finder 扩展」拆成两个独立 Target 协作主 App 只负责一个欢迎窗口Finder 扩展则通过 FinderSync 在 Finder 右键菜单中实现文件夹改色的核心功能。本文带你逐文件看懂 Manila 的双 Target 架构设计理解每个模块的职责与协作方式。项目总览两个 Target两种职责在 Manila.xcodeproj 中可以看到两个 Target分工非常清晰Target产物职责Manila可运行的 .app 应用启动时的欢迎窗口播放引导视频Manila Finder ExtensionFinder 扩展包Finder 右键菜单 文件夹变色核心逻辑扩展的 Bundle ID 是主 App 的子 IDcom.NeilSardesai.Manila.Manila-Finder-Extension这正是 macOS 扩展由宿主 App 分发、安装的典型结构。主 App 架构一个欢迎窗口主 App 的代码极少全部位于 Manila/ 目录下只承担用户首次打开时引导确认的职责入口Manila/AppDelegate.swift 标注main是整个应用唯一的入口类。它还设置了一个实用技巧NSApplicationCrashOnExceptions让异常直接触发崩溃便于开发者捕获问题。窗口行为Manila/MainWindow.swift 自定义了 NSWindow——隐藏最小化和缩放按钮、居中显示并允许按住背景拖动窗口。欢迎视频Manila/VideoContainerView.swift 使用AVPlayerLooper循环播放 Manila/Welcome.mp4并用 8pt 连续圆角裁切画面是整个主窗口唯一的内容。拖拽细节Manila/WindowMovingImageView.swift 重写了mouseDownCanMoveWindow让鼠标按在图片上也能拖动窗口。链接出口Manila/ViewController.swift 只有一个动作点击作者名时打开作者主页。Finder 扩展架构核心功能所在真正的文件夹变色功能全部集中在 Manila Finder Extension/ 目录共 3 个 Swift 文件 2 个配置文件逻辑非常精炼右键菜单FinderSync.swiftManila Finder Extension/FinderSync.swift 继承自FIFinderSync是扩展的核心类在init中把监听目录设为根路径/让扩展对全盘文件夹生效重写menu(for:)只有当选中项全是文件夹排除文件时才弹出菜单菜单带一个「Color」子菜单包含 7 个颜色项每项带一个小圆点图标如果所有选中文件夹已是同一颜色对应菜单项会打勾显示当前状态点击颜色后调用NSWorkspace.setIcon设置文件夹图标并把颜色名写入扩展属性XATTR做持久化选蓝色即恢复系统默认图标。![Manila Finder 扩展提供的绿色变色文件夹图标](https://raw.gitcode.com/gh_mirrors/ma/Manila/raw/0f01e840de94e5e28366d95c945ec543c34d93f9/Manila Finder Extension/Assets.xcassets/Icons/green.iconset/icon_512x5122x.png?utm_sourcegitcode_repo_files)![Manila Finder 扩展提供的紫色变色文件夹图标](https://raw.gitcode.com/gh_mirrors/ma/Manila/raw/0f01e840de94e5e28366d95c945ec543c34d93f9/Manila Finder Extension/Assets.xcassets/Icons/purple.iconset/icon_512x5122x.png?utm_sourcegitcode_repo_files)颜色模型Color.swiftManila Finder Extension/Color.swift 用一个枚举定义了全部 7 种颜色红、橙、黄、绿、蓝、紫、灰并为每种颜色提供本地化名称和菜单小图标名。每个颜色对应 Manila Finder Extension/Assets.xcassets/Icons/ 下一组 1024x1024 的文件夹图标以及 Manila Finder Extension/Assets.xcassets/Menu Icons/ 下的 16x16 菜单圆点。颜色持久化URLXATTR.swiftManila Finder Extension/URLXATTR.swift 封装了getxattr/setxattr/removexattr三个系统调用。颜色以扩展属性com.NeilSardesai.Manila.FolderColor的形式直接写在文件夹上因此即使重装应用颜色信息也依然保留——这是整个项目最巧妙的设计之一。扩展声明Info.plistManila Finder Extension/Info.plist 声明了扩展接入点com.apple.FinderSync和入口类FinderSync系统据此把它注入 Finder 进程。双 Target 如何分工协作代码层面两个 Target 之间没有任何直接调用或共享代码完全解耦——主 App 不 import 扩展扩展也不依赖主 App。进程层面扩展运行在独立的扩展进程中Finder 负责拉起它主 App 关闭后扩展照常工作。分发层面主 App 是扩展的宿主。用户安装 Manila/ 目录下的主 App 后扩展随之就位再到「系统设置 扩展 Finder 扩展」中勾选启用即可。主 App 的存在意义除了播放欢迎视频外它还保证了扩展有合法的宿主身份是 App Store 类分发的标准姿势。沙盒权限两处 entitlements 的对比两个 Target 的沙盒配置差异也体现了职责差异文件关键权限原因Manila/Manila.entitlements沙盒 用户选中文件只读主 App 只读自己的资源权限最小化Manila Finder Extension/Manila_Finder_Extension.entitlements沙盒 对/的临时读写例外扩展需要给全盘任意文件夹写入图标与扩展属性总结Manila 用一个极小的主 App欢迎窗口 一个 3 文件扩展菜单、颜色、XATTR实现了 Finder 文件夹变色功能。双 Target 各司其职主 App 管门面扩展管功能XATTR 负责记忆。这套结构是所有 macOS Finder 扩展项目的经典范式代码量小、边界清晰非常适合作为学习 FinderSync 架构的入门示例。【免费下载链接】ManilaA Finder extension for changing folder colors项目地址: https://gitcode.com/gh_mirrors/ma/Manila创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考