macOS开发者Skill macos-developer

macOS 开发者技能专注于苹果 macOS 平台的原生桌面应用开发。核心能力包括使用 AppKit 和 SwiftUI 构建用户界面,实现菜单栏应用、系统扩展和 XPC 服务。该技能涵盖从应用架构设计、沙盒安全、性能优化到最终通过 Mac App Store 或 DMG 分发的完整开发生命周期。关键词:macOS 开发,AppKit,SwiftUI,菜单栏应用,系统扩展,XPC 服务,Mac App Store,应用沙盒,代码签名,公证。

移动开发 0 次安装 0 次浏览 更新于 2/23/2026

name: macos-developer description: 使用 AppKit、SwiftUI for Mac 和 XPC 的 macOS 应用开发专家。专长于系统扩展、菜单栏应用和深度操作系统集成。

macOS 开发者

目的

提供原生 macOS 应用程序开发专业知识,专攻 AppKit、SwiftUI for Mac 和系统集成。为苹果生态系统构建具有 XPC 服务、菜单栏应用和深度操作系统能力的原生桌面应用程序。

何时使用

  • 构建原生 macOS 应用(DMG/App Store)
  • 开发菜单栏应用(NSStatusItem)
  • 实现 XPC 服务以进行权限分离
  • 创建系统扩展(端点安全、网络扩展)
  • 将 iPad 应用移植到 Mac(Catalyst)
  • 自动化 Mac 管理任务(AppleScript/JXA)


2. 决策框架

UI 框架

框架 最适合 优点 缺点
SwiftUI 现代应用 声明式,代码简单。 AppKit 功能支持有限。
AppKit 系统工具 完全控制(NSWindow、NSView)。 命令式,代码冗长。
Catalyst iPad 移植 从 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("工具", systemImage: "hammer") {
                Button("操作") { doWork() }
                Divider()
                Button("退出") { NSApplication.shared.terminate(nil) }
            }
        }
    }
    
  2. 隐藏 Dock 图标

    • Info.plist: LSUIElement = YES


工作流程 3:系统扩展(端点安全)

目标: 监控文件事件。

步骤:

  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) {
            // 记录进程执行
        }
    });
    


5. 反模式与陷阱

❌ 反模式 1:假设 iOS 行为

表现:

  • 当需要简单窗口时使用 NavigationView(拆分视图)。
  • 忽略菜单栏命令(Cmd+QCmd+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("系统工具", systemImage: "gear") {
            VStack(spacing: 12) {
                Button("打开偏好设置") { openPreferences() }
                Button("检查更新") { checkForUpdates() }
                Divider()
                Button("退出") { 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. 进程间通信:使用 NSXPCConnection 进行通信

XPC 服务实现:

// 服务协议
@objc protocol ProcessingServiceProtocol {
    func processDocument(at url: URL, reply: @escaping (URL?) -> Void)
}

// 服务实现
class ProcessingService: NSObject, ProcessingServiceProtocol {
    func processDocument(at url: URL, reply: @escaping (URL?) -> Void) {
        // 在独立进程中进行繁重处理
        let result = heavyProcessing(url: url)
        reply(result)
    }
}

好处:

  • 崩溃隔离(服务崩溃不会杀死应用)
  • 减少内存占用
  • 敏感操作的权限分离
  • 提高 App Store 审核通过率

示例 3:用于网络监控的系统扩展

场景: 使用系统扩展创建网络监控工具。

开发流程:

  1. 权限配置:端点安全权限
  2. 系统扩展:网络扩展实现
  3. 部署:正确的公证和签名
  4. 用户批准:系统扩展批准工作流程

实现:

// 网络扩展处理程序
class NetworkExtensionHandler: NEProvider {
    override func startProtocol(options: [String: Any]?, completionHandler: @escaping (Error?) -> Void) {
        // 开始网络监控
        setupNetworkMonitoring()
        completionHandler(nil)
    }
    
    override func stopProtocol(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
        // 清理资源
        stopNetworkMonitoring()
        completionHandler()
    }
}

要求:

  • 在 App Store 外分发需要公证
  • 用户批准的系统扩展
  • 来自 Apple 开发者门户的正确权限

最佳实践

AppKit 和 SwiftUI 集成

  • 混合方法:UI 使用 SwiftUI,复杂组件使用 AppKit
  • NSViewRepresentable:包装 NSView 供 SwiftUI 使用
  • NSHostingView:在 AppKit 窗口中嵌入 SwiftUI
  • 数据流:使用 Observable 或 StateObject 共享状态

沙盒化与安全

  • 最小权限:仅请求必要的权限
  • 钥匙串:使用钥匙串存储敏感数据
  • 应用沙盒:为 App Store 分发启用
  • 强化运行时:公证必需

分发与部署

  • 代码签名:公证前始终签名
  • 公证:提交给 Apple 进行安全验证
  • 自动更新:直接分发使用 Sparkle 实现
  • DMG 创建:使用 create-dmg 或类似工具

性能优化

  • 延迟加载:推迟资源加载直到需要时
  • 后台任务:长时间操作使用 BGTaskScheduler
  • 内存管理:监控内存压力
  • 启动时间:优化启动顺序

用户体验

  • 键盘导航:支持完整的键盘操作
  • 深色模式:正确处理浅色和深色外观
  • 辅助功能:从一开始就支持 VoiceOver
  • 窗口管理:正确支持多窗口

质量检查清单

用户体验:

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

系统:

  • [ ] 沙盒化: 启用应用沙盒(如果上架 App Store)。
  • [ ] 强化运行时: 为公证启用。
  • [ ] 代码签名: 为分发正确签名。
  • [ ] 公证: 已提交并获得 Apple 批准。

性能:

  • [ ] 启动: 应用在 5 秒内启动。
  • [ ] 内存: 无内存泄漏或过度使用。
  • [ ] 响应性: 操作期间 UI 保持响应。