[macApp] [Swift] About パネルのカスタマイズ

# About パネル

Mac アプリの多くは、メニューから「○○について」や「About ○○」をクリックすると、アプリの情報を示す「About パネル」が表示されます。

<br>![about0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/634f4de6-7f48-4a7c-a1c3-83d40d88726a.png)

このパネルを表示するためのコードは、たった 1行です。

```swift
NSApp.orderFrontStandardAboutPanel()
```

```swift:使用例
Button("About this app") {
    NSApp.orderFrontStandardAboutPanel()
}
```

標準で、`アプリアイコン`、`バンドル名`、`バージョン情報` が表示されます。



# カスタマイズ その1

`orderFrontStandardAboutPanel(options:)`の引数に オプションを指定する方法です。

```swift
let textAttributes: [NSAttributedString.Key : Any] = [
    .font : NSFont.systemFont(ofSize: 20.0),
    .strokeColor : NSColor.cyan,
    .strokeWidth : 3.0
]
let creditsText = NSAttributedString(string: "Copyright©2025", attributes: textAttributes)
let options: [NSApplication.AboutPanelOptionKey : Any] = [
    .applicationVersion : "1.2.3",
    .version : "abc",
    .applicationName : "Test App",
    .applicationIcon : NSImage(systemSymbolName: "figure", accessibilityDescription: nil)!,
    .credits : creditsText,
]
NSApp.orderFrontStandardAboutPanel(options: options)
```

![credits.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/e00738bc-3759-4955-8536-8c64f107f61d.png)

### オプションの意味
<dl>
  <dt>・ ApplicationVersion</dt><dd>アプリケーションバージョン(String)<br>指定されなければ`CFBundleShortVersionString`の値</dd>
  <dt>・ Version</dt><dd>アプリケーションのバージョン番号(String)<br>
指定されなければ`CFBuildVersion`の値</dd>
  <dt>・ ApplicationName</dt><dd>アプリケーション名(String)<br>指定されなければ`CFBundleName`の値</dd>
  <dt>・ ApplicationIcon</dt><dd>アプリケーションのアイコン(NSImage)<br>
指定されなければ、バンドルの`NSApplicationIcon`という名前の付いた画像。それもなければ、標準的なアプリケーションアイコン</dd>
  <dt>・ Credits</dt><dd>属性付き文字列（NSAttributedString）<br>指定されなければ、バンドルの`Credits.rtf` / `Credits.html` ファイルの内容</dd>
  <dt>・ Copyright</dt><dd>著作権情報(String)、<br>指定されなければ`NSHumanReadableCopyright`の値。それもなければ空</dd>
</dl>


<br>

`credits`には`NSAttributedString`を指定するので、リッチテキストのように指定できます。


対して、単純な 文字列で指定する場合は、`credits`の代わりに`Copyright`を指定します。

```swift
let options: [NSApplication.AboutPanelOptionKey : Any] = [
    .applicationVersion : "1.2.3",
    .version : "abc",
    .applicationName : "Test App",
    .applicationIcon : NSImage(systemSymbolName: "figure", accessibilityDescription: nil)!,
    .init(rawValue: "Copyright") : "Copyright©2025",
]
NSApp.orderFrontStandardAboutPanel(options: options)
```


![copyright.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/10fe9434-7978-4dd4-8a5b-4c1ca87e4ae1.png)


:::note warn
`.copyright`が未定義なのは、もしかして`Copyright`の使用は非推奨??

```swift
~ % swift repl
Welcome to Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4).
Type :help for assistance.
  1> import AppKit
  2> print(NSApplication.AboutPanelOptionKey.applicationVersion.rawValue)
ApplicationVersion
  3> print(NSApplication.AboutPanelOptionKey.version.rawValue) 
Version
  4> print(NSApplication.AboutPanelOptionKey.applicationName.rawValue) 
ApplicationName
  5> print(NSApplication.AboutPanelOptionKey.applicationIcon.rawValue) 
ApplicationIcon
  6> print(NSApplication.AboutPanelOptionKey.credits.rawValue) 
Credits
  7> print(NSApplication.AboutPanelOptionKey.copyright.rawValue) 
error: repl.swift:7:41: 
error: type 'NSApplication.AboutPanelOptionKey' has no member 'copyright'
```
:::



# カスタマイズ その2

`orderFrontStandardAboutPanel()`でオプションを指定せず、
プロジェクトに`Credits.html`か`Credits.rtf`を作成して追加する方法があります。


#### ・ 例えば、

次の html で `URLリンク` が追加されます。

```html:Credits.html
<a style="font-family:-apple-system;" 
   href="https://nak435.com/">https://nak435.com/</a>
```

![about1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/9b82d860-b612-411d-86a0-4c9a339c43ee.png)


#### ・ リッチテキストでは、

rtf ファイルの内容がそのまま追加されます。

![about2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/e4d43ade-fd2c-4ba2-8522-f9a57d654f03.png)

<br>

詳しい説明は省きますが、カスタマイズ`その1`と`その2`を組み合わせた カスタマイズも指定できます。

---

参考

https://qiita.com/SNQ-2001/items/bcaf4a779326ef1239fb

https://developer.apple.com/documentation/appkit/nsapplication/orderfrontstandardaboutpanel(options:)

<br><br>

**以上**