macOS 原生开发
面向 AppKit 与现代 macOS API 构建原生 macOS 应用的综合性指南。
框架概览
| 框架 | 适用场景 | 说明 |
|---|---|---|
| AppKit | 传统 Mac 应用 | 完全控制,成熟 |
| SwiftUI | 现代 Mac 应用 | 跨平台,声明式 |
| Catalyst | iPad 应用移植到 Mac | 快速移植,有局限 |
| AppKit + SwiftUI | 混合方案 | 两者优势结合 |
用途与适用场景
该技能用于指导开发 macOS 原生应用,涵盖以下场景:
- 构建传统 Mac 桌面应用(AppKit)
- 开发菜单栏应用(Menu Bar App)
- 基于文档的应用(Document-Based Apps)
- 系统集成功能(服务、拖放、通知)
- 处理沙盒与权限(App Sandbox、Security-Scoped Bookmarks)
- 准备 Mac App Store 提交
适用对象是需要调用 macOS 专属 API、构建 Mac 原生界面或系统扩展的开发者。
主要能力
AppKit 基础
资料提供了 AppDelegate 的完整结构示例,包括:
applicationDidFinishLaunching、applicationWillTerminate、applicationShouldTerminateAfterLastWindowClosed等生命周期方法- 通过
NSWindow创建主窗口,设置NSWindow.StyleMask(titled、closable、miniaturizable、resizable)、标题与contentViewController - 使用
NSViewController与loadView、viewDidLoad构建视图控制器 - 通过
NSScrollView+NSTableView搭建列表界面,使用NSLayoutConstraint设置约束 - 实现
NSTableViewDataSource、NSTableViewDelegate填充数据
菜单栏应用
- 使用
NSStatusBar.system.statusItem创建状态项,设置按钮图像与动作 - 使用
NSPopover构建弹出内容,behavior设为.transient - 通过
togglePopover控制弹出层的显示与关闭,并调用NSApp.activate - 使用
NSMenu构建主菜单,包括 App 菜单、File 菜单、Edit 菜单,并设置快捷键 keyEquivalent
基于文档的应用
- 自定义
NSDocument子类,重写autosavesInPlace、makeWindowControllers、data(ofType:)、read(from:ofType:) - 通过 Info.plist 的
CFBundleDocumentTypes声明文档类型、角色与内容类型
系统集成
- 服务:通过
NSPasteboard提供系统服务,并在 Info.plist 的NSServices中注册 - 拖放:在
NSView中注册拖放类型,实现draggingEntered与performDragOperation,处理文件 URL 与字符串 - 通知:使用
UNUserNotificationCenter请求授权并调度本地通知
沙盒与权限
- 常见 Entitlements 配置:App Sandbox、网络客户端/服务端、用户选择文件读写、下载目录读写、摄像头、麦克风、Hardened Runtime(allow-jit、allow-unsigned-executable-memory)
- Security-Scoped Bookmarks:保存、解析书签,并通过
startAccessingSecurityScopedResource/stopAccessingSecurityScopedResource访问资源
使用方式
资料以 Swift 代码示例为主要形式,代码可直接用于 Xcode 工程中的对应文件。典型使用流程包括:
- 在 AppDelegate 中创建主窗口并设置内容视图控制器
- 在视图控制器中通过 Auto Layout 约束搭建界面
- 按需选择 AppKit、SwiftUI、Catalyst 或混合方案
- 为菜单栏应用配置
NSStatusItem与NSPopover - 在 Info.plist 中声明文档类型、服务或隐私描述
- 在 entitlements 文件中配置沙盒权限
资料未提供安装命令或获取方式,相关内容暂未提供。
限制与注意事项
- 所有示例基于 Cocoa 与 Foundation 等系统框架,不涉及第三方依赖
- 资料中未说明该技能支持的最低 macOS 版本或 Xcode 版本
- 未提供收费、价格或授权方式信息
- 未提供实际的安装或集成步骤
检查清单
Mac App Store 提交
- 启用 App Sandbox
- 启用 Hardened Runtime
- 所有 entitlements 均有正当理由
- Info.plist 中包含隐私描述
- 提供所有尺寸的应用图标
- 准备 App Store 截图
- 不使用私有 API
最佳实践
- 支持键盘导航
- 尊重系统外观(深色/浅色)
- 支持全屏
- 处理窗口恢复
- 实现正确的撤销/重做
- 支持标准键盘快捷键