macos-developer について
macos-developerは、macOSネイティブアプリを開発する人向けのスキルです。UIフレームワークの選択、システム連携、セキュリティ、配布について扱います。
主な機能
- 01SwiftUIとAppKitの開発指針
- 02メニューバーアプリ開発
- 03XPCとシステム拡張の設計
- 04サンドボックスと配布の指針
活用シーン
- 01macOSネイティブアプリの計画
- 02メニューバーユーティリティの開発
- 03XPCによるバックグラウンド処理の分離
- 04署名と公証の準備
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ 404kidwiz/ claude-supercode-skills --skill macos-developerインストール後、Claude Code で/macos-developerを入力して読み込まれたか確認します。
詳細
macOS 開発者
目的
AppKit、Mac 向け SwiftUI、システム統合を専門とする、macOS ネイティブアプリケーション開発の専門知識を提供します。XPC サービス、メニューバーアプリ、Apple エコシステム向けの高度な OS 機能を備えたネイティブデスクトップアプリケーションを構築します。
使用する場面
- ネイティブ 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()または Swift のTaskを使用します。
例
例 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)
}
}
}
主な機能:
- Dock アイコンを隠すための Info.plist 内の LSUIElement
- すばやく操作するためのキーボードショートカット
- メニューを更新するバックグラウンドでのリフレッシュ
- 自動アップデート用の Sparkle
結果:
- Mac App Store でリリースされ、星 4.8 の評価を獲得
- アクティブユーザー数 50,000 人以上
- 「Best New Apps」カテゴリで特集掲載
例 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:ネットワーク監視用のシステム拡張機能
シナリオ: システム拡張機能を使用して、ネットワーク監視ツールを作成します。
開発プロセス:
- エンタイトルメントの設定: エンドポイントセキュリティのエンタイトルメント
- システム拡張機能: ネットワーク拡張機能の実装
- デプロイ: 適切な公証と署名
- ユーザーの承認: システム拡張機能の承認ワークフロー
実装:
// 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 の統合
- ハイブリッドアプローチ: UI には SwiftUI を、複雑なコンポーネントには AppKit を使用します
- NSViewRepresentable: SwiftUI で使用するために NSView をラップします
- NSHostingView: AppKit のウィンドウに SwiftUI を埋め込みます
- データフロー: 共有状態には Observable または StateObject を使用します
サンドボックスとセキュリティ
- 最小限のエンタイトルメント: 必要な権限のみをリクエストします
- キーチェーン: 機密データの保存にはキーチェーンを使用します
- アプリのサンドボックス: App Store での配布に備えて有効にします
- Hardened Runtime: 公証に必要です
配布とデプロイ
- コード署名: 公証の前に必ず署名します
- 公証: セキュリティ検証のために Apple に提出します
- 自動更新: 直接配布には Sparkle を実装します
- DMG の作成: create-dmg または類似のツールを使用します
パフォーマンスの最適化
- 遅延読み込み: リソースの読み込みを必要になるまで延期します
- バックグラウンドタスク: 長時間の処理には BGTaskScheduler を使用します
- メモリ管理: メモリプレッシャーを監視します
- 起動時間: 起動シーケンスを最適化します
ユーザー体験
- キーボードナビゲーション: キーボードによるすべての操作をサポートします
- ダークモード: ライトとダークの外観を適切に処理します
- アクセシビリティ: 開発の初期段階から VoiceOver との互換性を確保します
- ウィンドウ管理: 複数のウィンドウを適切にサポートします
品質チェックリスト
UX:
- メニュー: アプリは標準的なメニューコマンドをサポートしています。
- ウィンドウ: サイズ変更が可能で、フルスクリーンに対応しています。
- ダークモード: システムの外観設定に対応しています。
- アクセシビリティ: VoiceOver が主要な要素で動作します。
システム:
- サンドボックス: アプリのサンドボックスが有効になっています(App Store の場合)。
- Hardened Runtime: 公証のために有効になっています。
- コード署名: 配布用に適切に署名されています。
- 公証: Apple に提出し、承認されています。
パフォーマンス:
- 起動: アプリが 5 秒以内に起動します。
- メモリ: メモリリークや過剰な使用がありません。
- 応答性: 処理中も UI の応答性が保たれます。
コメント
Markdown 対応