AudioServicesPlaySystemSound не воспроизводит звук на устройстве iOS 8

Я имею AVFoundation а также AudioToolbox рамки добавлены в мой проект. В классе, где я хочу играть системный звук, я #include <AudioToolbox/AudioToolbox.h> и я звоню AudioServicesPlaySystemSound(1007);, Я тестирую на устройстве под управлением iOS 8, звуки включены, и громкость достаточно высокая, но я не слышу звука системы при запуске приложения и AudioServicesPlaySystemSound(1007); называется... что я мог пропустить?

6 ответов

Решение

Это будет играть системный звук.

Но помните, что звук системы не будет воспроизводить более длинный звук.

NSString *pewPewPath  = [[NSBundle mainBundle] pathForResource:@"engine" ofType:@"mp3"];
NSURL *pewPewURL = [NSURL fileURLWithPath:pewPewPath];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)pewPewURL, &_engineSound);
AudioServicesPlaySystemSound(_engineSound);

С iOS10 проигрывание аудио не работает:

SystemSoundID audioID;

AudioServicesCreateSystemSoundID((__bridge CFURLRef)pathURL, &mySSID);
AudioServicesPlaySystemSound(audioID);

Используйте это вместо:

AudioServicesCreateSystemSoundID((__bridge CFURLRef)pathURL, &audioID);

AudioServicesPlaySystemSoundWithCompletion(audioID, ^{
    AudioServicesDisposeSystemSoundID(audioID);
});

Согласно документации:

Эта функция (AudioServicesPlaySystemSound()) будет объявлено устаревшим в следующем выпуске. Вместо этого используйте AudioServicesPlaySystemSoundWithCompletion.

Используйте следующий фрагмент кода для воспроизведения звуков:

NSURL *fileURL = [[NSBundle mainBundle] URLForResource:filename withExtension:nil]; //filename can include extension e.g. @"bang.wav"
if (fileURL)
{
    SystemSoundID theSoundID;
    OSStatus error = AudioServicesCreateSystemSoundID((__bridge CFURLRef)fileURL, &theSoundID);
    if (error == kAudioServicesNoError)
    { 
        AudioServicesPlaySystemSoundWithCompletion(theSoundID, ^{
            AudioServicesDisposeSystemSoundID(theSoundID);
        });
    }
}

Кроме того, блок завершения гарантирует, что воспроизведение звука было завершено до его удаления.

Если это не решает проблему, возможно, ваша проблема не связана с кодом, а связана с настройками (устройство в режиме без звука / симуляторе отключает звук из системных настроек MAC, убедитесь, что установлен флажок "Воспроизвести звуковые эффекты интерфейса пользователя")

Для swift 3.x и xcode 8:

var theSoundID : SystemSoundID = 0
let bundleURL = Bundle.main.bundleURL
let url = bundleURL.appendingPathComponent("Invitation.aiff")

let urlRef = url as CFURL

let err = AudioServicesCreateSystemSoundID(urlRef, &theSoundID)
if err == kAudioServicesNoError{
    AudioServicesPlaySystemSoundWithCompletion(theSoundID, {
        AudioServicesDisposeSystemSoundID(theSoundID)
    })
}

Я только что протестировал код на iPad и iPhone под управлением iOS 8, и он работает на реальных устройствах.

По какой-то очень странной причине он не работает на симуляторе iOS 8 для любого устройства, хотя он работает на симуляторах iOS 7 и 7.1.

В противном случае код ниже работает нормально на всех реальных устройствах.

NSString *pewPewPath  = [[NSBundle mainBundle] pathForResource:@"engine" ofType:@"mp3"];
NSURL *pewPewURL = [NSURL fileURLWithPath:pewPewPath];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)pewPewURL, &_engineSound);
AudioServicesPlaySystemSound(_engineSound);

Вот как это сделать в Swift 5.8 и Xcode 14:

      let soundID: SystemSoundID = 1104 // kSystemSoundID_Tock
AudioServicesPlaySystemSoundWithCompletion(soundID) {
  AudioServicesDisposeSystemSoundID(soundID)
}

⚠️ Убедитесь, что устройство не находится в беззвучном режиме!

Другие вопросы по тегам