关于 macos-developer
macos-developer 是面向 macOS 开发者的技能,涵盖原生应用开发与 Apple 系统集成,并提供界面框架、安全和分发方面的指导。
主要功能
- 01SwiftUI 与 AppKit 开发指导
- 02菜单栏应用开发
- 03XPC 与系统扩展模式
- 04沙盒及应用分发指导
适用场景
- 01规划原生 macOS 应用
- 02开发菜单栏工具
- 03通过 XPC 隔离后台任务
- 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)。 | 命令式,代码冗长。 |
| Catalyst | iPad 移植应用 | 使用 iPad 代码免费构建 Mac 应用。 | 看起来像 iPad 应用。 |
分发渠道
- Mac App Store: 沙盒化、经过验证、更新便捷。(系统扩展必须通过此渠道分发)。
- 直接分发(DMG): 需要公证。自由度更高(辅助功能 API、完全磁盘访问)。
进程架构
- 单体: 简单应用。
- XPC 服务: 复杂应用。隔离崩溃,并允许提升权限(辅助工具)。
危险信号 → 升级至 security-engineer:
- 无正当理由却请求“完全磁盘访问”
- 在二进制文件中嵌入私钥
- 绕过 Gatekeeper/公证
3. 核心工作流
工作流 1:菜单栏应用(SwiftUI)
目标: 创建常驻菜单栏的应用。
步骤:
-
应用设置
@main struct MenuBarApp: App { var body: some Scene { MenuBarExtra("Utility", systemImage: "hammer") { Button("Action") { doWork() } Divider() Button("Quit") { NSApplication.shared.terminate(nil) } } } } -
隐藏 Dock 图标
- Info.plist:
LSUIElement=YES。
- Info.plist:
工作流 3:系统扩展(Endpoint Security)
目标: 监控文件事件。
步骤:
-
权限配置
com.apple.developer.endpoint-security.client=YES。
-
实现(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()或 SwiftTask。
示例
示例 1:专业菜单栏应用
场景: 构建常驻 macOS 菜单栏、便于快速访问的系统工具。
开发方法:
- 项目设置:使用带有 MenuBarExtra 的 SwiftUI
- 窗口管理:隐藏 Dock 图标,并使用弹出菜单
- 设置集成:使用 UserDefaults 保存偏好设置
- 状态项:使用带有图标和菜单的自定义 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 服务的基于文档的应用
场景: 构建一款支持后台处理的专业文档编辑器。
架构:
- 主应用:使用 SwiftUI 处理文档
- XPC 服务:在后台处理文档
- 沙盒:正确配置应用沙盒
- 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 创建网络监控工具。
开发流程:
- Entitlement 配置:Endpoint Security 权限
- System Extension:实现网络扩展
- 部署:正确进行公证和签名
- 用户批准:系统扩展批准工作流
实现:
// 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