Flutterで通知音を選択できるようにした話【iOS・Xcode編】

前回はAndroid編をお届けしました。今回はiOS編です。

iOSの通知音実装で一番苦労したのが、XcodeへのWAVファイル登録でした。スクリプトでプロジェクトファイルを壊すという大失敗もあったので、その経緯も含めてまとめます。


目次

iOSで通知音を鳴らすには

iOSでFlutterの通知音を指定するには、以下の2つが必要です。

  1. ios/Runner/ フォルダに音声ファイルを配置する
  2. Xcodeのプロジェクトにファイルを登録する

2番目の「Xcodeへの登録」が曲者でした。

ファイルをフォルダに置くだけでは足りません。Xcodeのプロジェクトファイル(project.pbxproj)に登録しないと、iOSはファイルの存在を認識してくれないのです。


まずファイルを配置する

ターミナルで以下のコマンドでコピーします。

cp assets/sounds/*.wav ios/Runner/

これで ios/Runner/ フォルダに全wavファイルが配置されます。


Xcodeでファイルを登録する

Xcodeを開きます。

open ios/Runner.xcworkspace

左側のファイルツリーを見ると、追加したwavファイルに?マークがついています。

この ? マークが「プロジェクトに登録されていない」というサインです。

正しい登録手順

  1. ? マークのファイルを右クリック
  2. 「Add Files to “Runner”…」 を選択
  3. ファイル選択画面が開くので、対象のwavファイルを選択
  4. Targets: Runner にチェックが入っていることを確認
  5. 「Finish」 をクリック

これで ? マークが消えてファイルが正式に登録されます。

注意: ファイルは1つずつ登録するのが確実です。複数選択すると重複ファイルが作成されてしまうことがありました。


スクリプトで project.pbxproj を壊した話

実は最初、Xcodeを使わずにPythonスクリプトで project.pbxproj を直接編集しようとしました。

# ❌ これをやってはいけない
with open('ios/Runner.xcodeproj/project.pbxproj', 'r') as f:
    content = f.read()
# UUIDを手動で追加しようとした...

結果、プロジェクトファイルが壊れてXcodeでエラーが出ました。

The project 'Runner' is damaged and cannot be opened 
due to a parse error.

Dropboxのバックアップから復元して事なきを得ましたが、冷や汗ものでした😅

project.pbxproj は独自フォーマットのファイルで、手動編集はとても難しいです。必ずXcodeのGUIから操作するのが正解です。


DarwinNotificationDetailsで音を指定する

Xcodeへの登録が完了したら、コード側の設定です。

iOS: DarwinNotificationDetails(
  presentAlert: true,
  presentBadge: true,
  presentSound: true,
  sound: '$soundName.wav',
),

sound に指定するのはファイル名(拡張子付き)です。


wav形式でOK、caf変換は不要

「iOSはcaf形式にしないといけない」という情報を見かけることがありますが、wav形式でも問題なく動作しました。

わざわざ変換する手間は不要です。


ハマったポイントまとめ

1. ファイルをフォルダに置くだけでは動かない

ios/Runner/ に配置するだけでは不十分です。必ずXcodeで「Add Files to Runner」の操作が必要です。

2. ?マークはXcodeに未登録のサイン

? マークがついているファイルはiOSから参照できません。A マークになっていれば登録済みです。

3. project.pbxprojを直接編集してはいけない

スクリプトや手動での編集は危険です。必ずXcodeのGUIから操作しましょう。もし壊してしまった場合はGitやDropboxのバックアップから復元してください。

4. 実機でテストしないとわからない

iOSシミュレーターでは通知音が正しく再生されないことがあります。必ず実機でテストしましょう。


まとめ

iOSで通知音を選択できるようにするための手順をまとめます。

  1. assets/sounds/*.wav を ios/Runner/ にコピー
  2. XcodeでAdd Files to Runnerから1つずつ登録
  3. DarwinNotificationDetails の sound にファイル名を指定
  4. 実機でテスト

Android編と合わせて、Flutter製アプリに通知音選択機能を実装する参考になれば嬉しいです😊


かってに通知メモは App Store・Google Play で公開中です。ぜひ使ってみてください!

目次