この質問の目的のために、私のアプリが10秒ごとにオーディオクリップを再生すると想像してください。このオーディオは、AVAudioPlayerを使用して、デバイス上のiPodミュージックプレーヤーと(ダッキングを使用して)再生/ミキシングします。アプリがバックグラウンドに送信されると、オーディオファイルが参照されている(テキストがない)UILocalNotificationオブジェクトをスケジュールするため、サウンドは10秒間隔で再生され続けます。
私を悩ませているのは、iOS 6で通知の一部として再生されるオーディオクリップの音量が、アプリで再生するときのオーディオの2倍の音量に見えることです(音量を1.0fに設定しています。ドキュメントによると最大です)。そのため、アプリは10秒ごとにサウンドを再生し、バックグラウンドに送信すると、アプリ内のサウンドと比較して非常に大きな音になります。
関連するスニペット...アプリの起動、ダッキングを有効にするためにAVAudioSessionを設定する方法は次のとおりです。
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof (doChangeDefaultRoute), &doChangeDefaultRoute);
OSStatus propertySetError = 0;
UInt32 allowMixing = true;
propertySetError = AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers,sizeof (allowMixing),&allowMixing);
...プレーヤーの作成方法:
- (AVAudioPlayer *)playerWithCAFFileNamed:(NSString *)fname {
NSURL *u = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:fname ofType:@"caf"]];
NSData *d = [NSData dataWithContentsOfURL:u];
AVAudioPlayer *p = [[AVAudioPlayer alloc] initWithData:d error:nil];
p.delegate = self;
p.volume = 1.0;
[p prepareToPlay];
return p;
}
...そして再生:
- (void)playAudio:(AVAudioPlayer *)player {
[self setSessionActiveWithMixing:YES];
[player setVolume:1.0]; // should already be set, but just to be sure
[player play];
}
...そしてこれが私が超大音量の通知を作成する方法です:
- (UILocalNotification *)notificationWithSoundNamed:(NSString *)sound atTimeInterval:(NSTimeInterval)ti {
UILocalNotification *n = [[UILocalNotification alloc] init];
n.soundName = sound;
n.fireDate = [NSDate dateWithTimeIntervalSinceReferenceDate:ti];
return n;
}