スイッチを使用してデバイスをサイレント モードにすると、AudioServicesAddSystemSoundCompletion
コールバック メソッドが呼び出されません。スイッチがオンの場合、つまりデバイスがサイレント モードでない場合、メソッドは完全に呼び出されます。
誰もがこのようなことを経験したことがありますか。これはバグですか?
スイッチを使用してデバイスをサイレント モードにすると、AudioServicesAddSystemSoundCompletion
コールバック メソッドが呼び出されません。スイッチがオンの場合、つまりデバイスがサイレント モードでない場合、メソッドは完全に呼び出されます。
誰もがこのようなことを経験したことがありますか。これはバグですか?
サイレント モードでも、soundDidFinishPlaying コールバックに NSTimer を使用する方法を次に示します。
- (IBAction)playSelectedSound:(id)sender {
if (!self.isPlaying)
{
// playing the sound
NSString *fileName = [soundsFileNames objectAtIndex:self.selectedIndex];
SystemSoundID topClick;
NSBundle *bundle = [NSBundle mainBundle];
NSString *topClikFile = [bundle pathForResource:fileName ofType:@"aiff"];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL URLWithString:topClikFile], &topClick);
AudioServicesPlaySystemSound(topClick);
// getting the file duration
AudioFileID audioFileID;
AudioFileOpenURL((__bridge CFURLRef)[NSURL URLWithString:topClikFile], kAudioFileReadPermission, 0, &audioFileID);
NSTimeInterval seconds;
UInt32 propertySize = sizeof(seconds);
OSStatus st = AudioFileGetProperty(audioFileID, kAudioFilePropertyEstimatedDuration, &propertySize, &seconds);
// fire the timer
if (st == 0)
{
[NSTimer scheduledTimerWithTimeInterval:seconds target:self selector:@selector(soundDidFinishPlaying) userInfo:nil repeats:NO];
}
self.isPlaying = YES;
}
}
- (void)soundDidFinishPlaying {
self.isPlaying = NO;
}
私も同じ問題を抱えていました。これはバグではありません。デバイスがミュートされているためにサウンドが再生されない場合、コールバックは呼び出されません。
回避策は、再生されるサウンドと同じ長さの NSTimer を使用することです。サウンドが再生されない場合は、タイマー コールバックが呼び出されます。コールバックと同じコードを実行できます。
Sound Switchのソース コード(デモ プロジェクトを使用) は、デバイスがサイレント モードの場合にもコールバックが実際に発生することを示しています。
iPhone 5のiOS 8.1でこれを試し、デバイスのボタンでサイレントモードをオフ/オンにしました。