ローカル通知音をカスタム音源で　MacOS/OSX

## MAC用プログラムでカスタム通知音ができるのか？
環境　　Intel iMac macOS Ventura

:::note warn
　自分が確認した結果であります。テストの方法の問題や確認ミスでうまくできなかった可能性もあります。参考程度で見ていただければ幸いです。
 
:::
iosでカスタム通知音ができたので　Macでもできるんではないかと挑んでみたが、
見事につまづきましたので覚書します。


iosの場合、\<app_container>/Library/Sounds　に 30秒以下の音源を設置して、
UNNotificationSound　の

+    soundNamed:  Objective-c 
+    init(named:) Swift

で音源名を指定すれば通知で音が鳴りました。
（音源は、AIFFファイル テストは,Objective-c)

Macの場合もマニュアルではできそうに見えるのだが......

https://developer.apple.com/documentation/usernotifications/unnotificationsound/1649031-soundnamed?language=objc

## 試練１  プログラムで音源設置
iosの場合,\<app_container>/Libraryに Soundsのディレクトリがなかったのでディレクトリ作成して音源ファイルを設置した記憶があるのだが、Mac(iMac)の場合は、すでにありました。　「GoodでAppleさん」と感心していた。

まずプログラムで \<app_container>/Library/Sounds に　**プログラムで**　音源を置いてみたら
permissionエラーになって書き込みができない。　「は〜？」
SnadBOX内であろうと自由に触って良い訳いでわないらしい

Finderで同じディレクトリに音源を書き込むと書き込めるのにね。エラーを調べると権限がないようである。 これは困りました。とても困りました。
がよくよくマニュアルを確認すると・・・・・

APPLEのマニュアルには、もう一つの方法が記載されてるのを見落としていた。

:::note info
The <group_container>/Library/Sounds directory, where <group_container> is one of the app’s shared group container directories. For information about how to configure group containers for your app, see Configure app groups.
:::
つまり　APP Group　作ったら　APP Groupのディレクトリでもできるよ...と
APP Group下では　iosと同じでSoundsディレクトリがなかった。iosの時と同様にディレクトリを作成して音源を置いてみたら　音源は置けましたが・・・・

追加)
Catalystで試したら既にSoundsディレクトリが存在していた。
でも、 <app_container>/Library/Sound　の時と同じで書き込めない

#### 試練１の結果
\<app_container>/Library/Soundsでは 
##### ☞　プログラムで設置するには権限を変える必要がある　

https://stackoverflow.com/questions/35418988/how-do-i-add-a-file-to-the-main-bundles-library-sounds-directory

この方は、コピーしたら解決したかのように言ってますが、ダメでした。権限なしは最強どす。勝てません

\<group_container>/Library/Soundsでは
##### ☞　プログラムで設置することはできた。　

## 試練2 音でない
試練１をクリアできたとして次の試練です。
試練１でのAPPグループ下でテストしていたが全く音が出ません。
+ \<app_container>/Library/Sounds
+ \<group_container>/Library/Sounds
+ XcodeでbundleResources

全部に音源設置しても音でません。　心折れるぐらい調べて確認したけど全くダメでしたが、

https://stackoverflow.com/questions/61977828/unnotificationsound-doesnt-play-on-macos-same-file-works-on-ios

の方法

**システム > サウンド > ユーザーエフェクトのサウンドエフェクトを再生**
をOFFにして Mac再起動する。
起動してからプログラムを動作させてから　ONにしたら、あら？音でました・・・・が、デフォルトの　トゥルルンです。

#### ※ユーザーエフェクトのサウンドエフェクト
ゴミ箱を空にしたりMAC上でアクションした時の効果音みたいです。

#### 試練２の結果　
##### ☞　音が出るには出たが　デフォルトの　トゥルルンです。

## 試練３ デフォルトの　トゥルルン
３つの場所にファイルを置いているのだが　トゥルルン音
+ \<app_container>/Library/Sounds
+ \<group_container>/Library/Sounds
+ XcodeでbundleResources

私の場合
```
<app_container>  :  /Users/<ユーザー名>/Library/Containers/<Bundle Identifier>/Data/
<group_container>:  /Users/<ユーザー名>/Library/Group Containers/<App groupID>
```
でした。
音源変えたり、ファイル名を変えたりして試行錯誤していたら音でました。


+ ファイル名に＠が含まれたら　トゥルルン音になる。
+ IMA4 audio in a CAF　でも　　トゥルルン音だった。（記憶がちょい怪しい）
+ AIFF 及び AIFF in a CAF で　うまく再生してくれた。
+ **ユーザーエフェクトのサウンドエフェクトを再生　をOFFにしてると　　無音になります。（カスタム音はエフェクト扱い）**


#### 試練３の結果
##### ☞　 音は、ファイル名と音源フォーマットと関連があるので 　トゥルルン音が出ればチャンス

音源はマニュアルでさらっと説明している　IMA4 audio in a CAF　なのですが、

https://developer.apple.com/documentation/usernotifications/unnotificationsound?language=objc

気になるが音出たのでよし。


## 試練4 音源をどこにおけば良いのか
同じファイルを３つの場所の１つに置いてみる
（権限もありますので　Macでファイルを書き込みました)

+ \<app_container>/Library/Sounds
+ \<group_container>/Library/Sounds
+ XcodeでbundleResources

消去法での確認です。

| 結果 | 場所 |　備考 　　|
|:-:|:-:|:-:|
| ○ |\<app_container>/Library/Sounds|やっぱここですか
| X |\<group_container>/Library/Sounds|　※参照
| ○ |Xcode bundle Resources| できました(2025/3/30確認)

※ 調べてみたらどうもiosだけ？

https://stackoverflow.com/questions/63184991/ios-how-can-i-play-a-custom-notifications-sound-file-where-its-in-shared-appgro


### まとめ

１. /Library/Soundsに権限を与える。（プログラムで音源設置する場合)
2. **システム > サウンド > ユーザーエフェクトのサウンドエフェクトを再生** はONにする
3.  音源ファイルはAIFFを使用

で音が鳴らせました。

が、注意がいりますね。
/Library/Soundsに音源設置したらシステム＞サウンド＞通知音の一覧に音源が表示される。
-> 多くなるとじゃま
2. ユーザーエフェクトのサウンドエフェクト止めると　と　カスタム通知音も止まる
3. 他の音源使う場合は、確認必要 

追加 2025/3/29
Xcode でコードに音源を含んだ場合でも再生できました。
しかし 上記 2. の条件で　サウンドエフェクト止めると音がでませんね。
(TestはAiffファイルで確認した)

#  Appendix

### 試練１ クリア方法
/Library/Soundsの権限は
1. Signing & Capabilities で　User Selected File で　Write権限を与える。
2. NSOpenPanelで　ユーザーに　\<app_container>/Library/Sounds　ディレクトリを選択してもらう。
これで書き込みできました。

Soundsを間違っても削除して作成しないようにしてくださいね。Library/Soundにリンクを貼ってるようです。

他の方法があれば教えて欲しいです。

### 見つけた事(2025/3/29)
1.userNotificationCenter:willPresentNotification:withCompletionHandler:について
　notificationの設定でbody(通知文字)だけの時で通知スタイルをなしにしたら　willPresentNotification:　が呼ばれないです。soundも設定した場合は呼ばれます。(MacOS13.74)
 

### 独り言

　SandBox内の Sounds ディレクトリに権限がないって　そりゃないよぅ。
　システムのサウンドエフェクトで音がでないなら、マニュアルに書いておいてよぅ