🫢

【Unity】iOSでサイレントモードでも音を出す

2023/06/05に公開

背景

UnityでiOSアプリを開発していたのですが、iOS端末がサイレントモードの時は、音が出ないことに気づきました。

いろいろ試した結果、無事に音が出るようになったので、記事として残しておきます。

対応方法

iOSアプリの AudioSessionのカテゴリを、AVAudioSessionCategoryPlayback に設定する必要があります。コードから設定していきます。

以下の2ファイルを作成し、Assets/Scripts/ などに入れます。

  • AudioSessionCategoryBridge.cs
  • AudioSessionCategory.mm

2ファイルの内容は、以下の通りです。

AudioSessionCategoryBridge.cs

Assets/Scripts/AudioSessionCategoryBridge.cs
using System.Runtime.InteropServices;
using UnityEngine;

namespace iOSNative
{
    // iOSで、サイレントモードの時や、 アプリがバックグラウンドにある時に、音を再生し続けられるようにする。
    //
    // バックグラウンド再生を有効にするには、プレーヤー設定画面にて、
    // Enable Custom Background Behaviors > Audio にもチェックを入れること。
    // 注意: ただしチェックを入れると、OnApplicationPause() は呼ばれなくなる。
    public static class AudioSessionCategoryBridge
    {
        [DllImport("__Internal")]
        static extern void __setAudioSessionCategoryPlayback();

        [System.Diagnostics.Conditional("UNITY_IOS")]
        public static void SetAudioSessionCategoryPlayback()
        {
            __setAudioSessionCategoryPlayback();
        }

        [RuntimeInitializeOnLoadMethod]
        static void Initialize()
        {
            SetAudioSessionCategoryPlayback();
        }
    }
}

AudioSessionCategory.mm

Assets/Scripts/AudioSessionCategory.mm
#import <AVFoundation/AVFoundation.h>

@interface AudioSessionCategory : NSObject
+ (void)setPlayback;
@end

@implementation AudioSessionCategory

+ (void)setPlayback {
    AVAudioSession* audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
}

@end


#ifdef __cplusplus
extern "C" {
#endif

void __setAudioSessionCategoryPlayback() {
    return [AudioSessionCategory setPlayback];
}

#ifdef __cplusplus
}
#endif

以上です。

参照

https://gist.github.com/mao-test-h/a3bf5019107375ed4bce9df8853ef62b

https://www.facebook.com/groups/unityuserj/posts/1439251626134773/

https://developer.apple.com/documentation/avfaudio/avaudiosessioncategoryplayback

Discussion