macOSのシステム設定をSwiftから開く

## システム画面の特定の画面を開く
- 例えば`Privacy & Security`は下記の2通りのやり方で開くことができる
- 一つは`.prefPane`ファイルを開く方法で、もう一方は`scheme`で指定して開く方法
- どちらも動きは同じだが、その設定画面のさらに詳細を開きたい際にはSchemeを使うと良い

```swift
Button("\"プライバシーとセキュリティ\"を開く (.prefPane経由)") {
    let url = URL(filePath: "/System/Library/PreferencePanes/Security.prefPane", directoryHint: .notDirectory)
    NSWorkspace.shared.open(url)
}

Button("\"プライバシーとセキュリティ\"を開く (Scheme経由)") {
    guard let url = URL(string: "x-apple.systempreferences:com.apple.settings.PrivacySecurity.extension") else {
        return
    }
    NSWorkspace.shared.open(url)
}
```

- Swiftではなくターミナルで試したい場合は以下

```sh
open "/System/Library/PreferencePanes/Security.prefPane"
open "x-apple.systempreferences:com.apple.settings.PrivacySecurity.extension"
```

![](https://i.imgur.com/5oO9B8W.jpeg)
## `.prefPane`の選択
- `.prefPane`ファイルは`/System/Library/PreferencePanes`以下に配置されているので利用したいものを選択すればOK

![](https://i.imgur.com/AlVkvyR.jpeg)

## schemeのペインIDの選択
- `x-apple.systempreferences:com.apple.settings.PrivacySecurity.extension`の`com.apple.settings.PrivacySecurity.extension`の部分を以降`ペインID`と呼ぶ
- システム設定のサイドバーの`ペインID`を知るには以下のplistを参照する
    - `/System/Applications/System Settings.app/Contents/Resources/Sidebar.plist`
    - 参考: https://github.com/bvanpeski/SystemPreferences/blob/main/macos_preferencepanes-Ventura.md#finding-settings-sections
- または後述のApple Scriptからも取得できる

![](https://i.imgur.com/KRqi6ps.jpeg)

- またこのplistに含まれない詳細設定もあり、その際は下記をターミナルで実行するとペインIDの一覧が取得できる

```sh
for pref in $(strings "/System/Applications/System Settings.app/Contents/MacOS/System Settings" | awk '/^com.apple./ {print $1 }'); do echo "$pref"; done
```

```
(出力結果)
com.apple.systempreferences.debug
com.apple.ClassroomSettings
com.apple.CD-DVD-Settings.extension
com.apple.preferences.ClassKitPreferencePane
...
```

## ペインIDとアンカーの取得

- 例えば`Privacy & Security` > `Camera`の設定を開きたい
- これはSchemeの後ろに`?Privacy_Camera`とアンカーをつけるとできる

```
x-apple.systempreferences:com.apple.settings.PrivacySecurity.extension?Privacy_Camera
```

![](https://i.imgur.com/3TuONZz.jpeg)

- この`Privacy_Camera`というアンカーの文字列をどうやって取得するか
    - 参考: https://github.com/bvanpeski/SystemPreferences/blob/main/macos_preferencepanes-Monterey.md#identifying-pane-names-and-anchors
- これはシステム設定を開いた状態で`Script Editor.app`から下記のApple Scriptを実行し、現在開いているペインIDとその中にあるアンカーが取得できる

```applescript
-- Open System Preferences.app and click into desired pane/setting. Then, run this script to find out name (Pane ID) and any anchors.

tell application "System Settings"
	set AppleScript's text item delimiters to ", "
	set CurrentPane to the id of the current pane
	get the name of every anchor of pane id CurrentPane
	set CurrentAnchors to get the name of every anchor of pane id CurrentPane
	set the clipboard to CurrentPane
	display dialog "Current Pane ID: " & CurrentPane & return & return & "Pane ID has been copied to the clipboard." & return & return & "Current Anchors: " & return & (CurrentAnchors as string)
end tell
```

- 下記のようにペインIDとアンカーがそれぞれ取得できる

![](https://i.imgur.com/dYt8suE.jpeg)

```
com.apple.settings.PrivacySecurity.extension
Privacy_Camera
```

- また取得できない一部アンカーに関しては、下記のplistから取得できるとのこと
-  `/System/Library/PreferencePanes/Security.prefPane/Contents/Resources/PrivacyTCCServices.plist`

- しかしこれでも`Privacy & Security` > `Local Network`のアンカーなど一部取得できないものがあったのでこれは今後の課題
    - https://gist.github.com/rmcdongit/f66ff91e0dad78d4d6346a75ded4b751?permalink_comment_id=5291796#gistcomment-5291796
- (もしご存じの方がいましたら教えていただけると助かります…🙏)

## 参考
- [bvanpeski/SystemPreferences](https://github.com/bvanpeski/SystemPreferences)
    - [How to open every macOS System Settings Section \(macOS 13\+\)](https://github.com/bvanpeski/SystemPreferences/blob/main/macos_preferencepanes-Ventura.md#how-to-open-every-macos-system-settings-section-macos-13)
    - [How to open every macOS System Preferences Pane](https://github.com/bvanpeski/SystemPreferences/blob/main/macos_preferencepanes-Monterey.md)
    - [Identifying System Preferences Panes](https://www.macosadventures.com/2022/02/10/identifying-system-preferences-panes/)
- [macOS 10\.15 System Preference Panes](https://gist.github.com/rmcdongit/f66ff91e0dad78d4d6346a75ded4b751)
- [macOSでアクセシビリティアクセス権限を利用するアプリケーション開発の知見](https://zenn.dev/usagimaru/scraps/f6a8e62806d19a)
- `com.apple.preference.datetime`などはmacOS14以降でDeprecated
    - `preferences` -> `settings`と呼び方が変わった影響と思われる
    - [SystemPreferences](https://developer.apple.com/documentation/devicemanagement/systempreferences)