mcpField
M
macos-developer

macos-developer

github.com/404kidwiz开发159 次安装
代码仓库

关于 macos-developer

macos-developer 是面向 macOS 开发者的技能,涵盖原生应用开发与 Apple 系统集成,并提供界面框架、安全和分发方面的指导。

主要功能

  1. 01SwiftUI 与 AppKit 开发指导
  2. 02菜单栏应用开发
  3. 03XPC 与系统扩展模式
  4. 04沙盒及应用分发指导

适用场景

  1. 01规划原生 macOS 应用
  2. 02开发菜单栏工具
  3. 03通过 XPC 隔离后台任务
  4. 04准备代码签名与公证

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/404kidwiz/claude-supercode-skills --skill macos-developer

安装后在 Claude Code 中输入/macos-developer确认已加载。

详细介绍

macOS 开发者

用途

提供原生 macOS 应用开发专业知识,专注于 AppKit、适用于 Mac 的 SwiftUI 以及系统集成。为 Apple 生态系统构建原生桌面应用,包括 XPC 服务、菜单栏应用和深度操作系统功能。

使用场景

  • 构建原生 macOS 应用(DMG/App Store)
  • 开发菜单栏应用(NSStatusItem)
  • 实现用于权限隔离的 XPC 服务
  • 创建系统扩展(Endpoint Security、Network Extension)
  • 将 iPad 应用移植到 Mac(Catalyst)
  • 自动化 Mac 管理任务(AppleScript/JXA)


2. 决策框架

UI 框架
框架最适合优点缺点
SwiftUI现代应用声明式,代码简单。与 AppKit 的功能对等性有限。
AppKit系统工具完全掌控(NSWindow、NSView)。命令式,代码冗长。
CatalystiPad 移植应用使用 iPad 代码免费构建 Mac 应用。看起来像 iPad 应用。
分发渠道
  • Mac App Store: 沙盒化、经过验证、更新便捷。(系统扩展必须通过此渠道分发)。
  • 直接分发(DMG): 需要公证。自由度更高(辅助功能 API、完全磁盘访问)。
进程架构
  • 单体: 简单应用。
  • XPC 服务: 复杂应用。隔离崩溃,并允许提升权限(辅助工具)。

危险信号 → 升级至 security-engineer:

  • 无正当理由却请求“完全磁盘访问”
  • 在二进制文件中嵌入私钥
  • 绕过 Gatekeeper/公证


3. 核心工作流

工作流 1:菜单栏应用(SwiftUI)

目标: 创建常驻菜单栏的应用。

步骤:

  1. 应用设置

    @main
    struct MenuBarApp: App {
        var body: some Scene {
            MenuBarExtra("Utility", systemImage: "hammer") {
                Button("Action") { doWork() }
                Divider()
                Button("Quit") { NSApplication.shared.terminate(nil) }
            }
        }
    }
    
  2. 隐藏 Dock 图标

    • Info.plist:LSUIElement = YES。


工作流 3:系统扩展(Endpoint Security)

目标: 监控文件事件。

步骤:

  1. 权限配置

    • com.apple.developer.endpoint-security.client = YES。
  2. 实现(C API)

    es_client_t *client;
    es_new_client(&client, ^(es_client_t *c, const es_message_t *msg) {
        if (msg->event_type == ES_EVENT_TYPE_NOTIFY_EXEC) {
            // Log process execution
        }
    });
    


5. 反模式与注意事项

❌ 反模式 1:假设 iOS 行为适用

表现形式:

  • 需要简单窗口时,却使用 NavigationView(分栏视图)。
  • 忽略菜单栏命令(Cmd+Q、Cmd+S)。

失败原因:

  • 在 Mac 上显得格格不入。

正确做法:

  • 支持键盘快捷键。
  • 支持多窗口工作流。
❌ 反模式 2:阻塞主线程

表现形式:

  • 在主线程执行文件 I/O。

失败原因:

  • 出现旋转的死亡彩球(SPOD)。

正确做法:

  • 使用 DispatchQueue.global() 或 Swift Task。


示例

示例 1:专业菜单栏应用

场景: 构建常驻 macOS 菜单栏、便于快速访问的系统工具。

开发方法:

  1. 项目设置:使用带有 MenuBarExtra 的 SwiftUI
  2. 窗口管理:隐藏 Dock 图标,并使用弹出菜单
  3. 设置集成:使用 UserDefaults 保存偏好设置
  4. 状态项:使用带有图标和菜单的自定义 NSStatusItem

实现:

@main
struct SystemUtilityApp: App {
    var body: some Scene {
        MenuBarExtra("System Utility", systemImage: "gear") {
            VStack(spacing: 12) {
                Button("Open Preferences") { openPreferences() }
                Button("Check Updates") { checkForUpdates() }
                Divider()
                Button("Quit") { NSApplication.shared.terminate(nil) }
            }
            .padding()
            .frame(width: 200)
        }
    }
}

主要功能:

  • 在 Info.plist 中设置 LSUIElement,以隐藏 Dock 图标
  • 为常用操作提供键盘快捷键
  • 在后台刷新,并更新菜单
  • 使用 Sparkle 自动更新

结果:

  • 在 Mac App Store 上发布,评分为 4.8 星
  • 超过 50,000 名活跃用户
  • 入选“最佳新应用”类别
示例 2:使用 XPC 服务的基于文档的应用

场景: 构建一款支持后台处理的专业文档编辑器。

架构:

  1. 主应用:使用 SwiftUI 处理文档
  2. XPC 服务:在后台处理文档
  3. 沙盒:正确配置应用沙盒
  4. IPC:使用 NSXPCConnection 进行通信

XPC 服务实现:

// Service Protocol
@objc protocol ProcessingServiceProtocol {
    func processDocument(at url: URL, reply: @escaping (URL?) -> Void)
}

// Service Implementation
class ProcessingService: NSObject, ProcessingServiceProtocol {
    func processDocument(at url: URL, reply: @escaping (URL?) -> Void) {
        // Heavy processing in separate process
        let result = heavyProcessing(url: url)
        reply(result)
    }
}

优势:

  • 崩溃隔离(服务崩溃不会导致应用退出)
  • 降低内存占用
  • 为敏感操作进行权限分离
  • 提高通过 App Store 审核的几率
示例 3:用于网络监控的系统扩展

场景: 使用 System Extension 创建网络监控工具。

开发流程:

  1. Entitlement 配置:Endpoint Security 权限
  2. System Extension:实现网络扩展
  3. 部署:正确进行公证和签名
  4. 用户批准:系统扩展批准工作流

实现:

// Network extension handler
class NetworkExtensionHandler: NEProvider {
    override func startProtocol(options: [String: Any]?, completionHandler: @escaping (Error?) -> Void) {
        // Start network monitoring
        setupNetworkMonitoring()
        completionHandler(nil)
    }
    
    override func stopProtocol(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
        // Clean up resources
        stopNetworkMonitoring()
        completionHandler()
    }
}

要求:

  • 在 App Store 之外分发时需进行公证
  • 系统扩展需经用户批准
  • 通过 Apple Developer 门户申请适当的权限

最佳实践

AppKit 和 SwiftUI 集成
  • 混合方案:使用 SwiftUI 构建 UI,使用 AppKit 实现复杂组件
  • NSViewRepresentable:封装 NSView 以供 SwiftUI 使用
  • NSHostingView:在 AppKit 窗口中嵌入 SwiftUI
  • 数据流:使用 Observable 或 StateObject 共享状态
沙盒与安全
  • 最小权限:仅申请必要的权限
  • Keychain:使用 Keychain 存储敏感数据
  • 应用沙盒:为 App Store 分发启用
  • 强化运行时:公证所必需
分发与部署
  • 代码签名:公证前务必签名
  • 公证:提交至 Apple 进行安全验证
  • 自动更新:使用 Sparkle 实现直接分发
  • 创建 DMG:使用 create-dmg 或类似工具
性能优化
  • 延迟加载:按需加载资源
  • 后台任务:使用 BGTaskScheduler 执行长时间运行的操作
  • 内存管理:监控内存压力
  • 启动时间:优化启动流程
用户体验
  • 键盘导航:支持完整的键盘操作
  • 深色模式:正确处理浅色和深色外观
  • 无障碍功能:从一开始就确保兼容 VoiceOver
  • 窗口管理:妥善支持多个窗口

质量检查清单

用户体验:

  • **菜单:**应用支持标准菜单命令。
  • **窗口:**可调整大小,支持全屏。
  • **深色模式:**支持系统外观。
  • **无障碍功能:**VoiceOver 可用于关键元素。

系统:

  • **沙盒:**已启用应用沙盒(如果通过 App Store 分发)。
  • **强化运行时:**已启用,以便进行公证。
  • **代码签名:**已正确签名,可用于分发。
  • **公证:**已提交 Apple 并获批准。

性能:

  • **启动:**应用可在 5 秒内启动。
  • **内存:**无内存泄漏或过度占用。
  • **响应性:**操作期间 UI 始终保持响应。

评论

支持 Markdown