🫢
【Unity】iOSでサイレントモードでも音を出す
背景
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
以上です。
参照
Discussion