AVAudioPlayer无法在某些设备上播放

ish*_*hak 2 avaudioplayer ipad ios

我的代码在iPad-4和iPhone 6+上的模拟器上完美运行,所有这些都运行在iOS 9.0.2上.

但是,我知道这是一个奇怪的说法,在我的iPad Air 2上看起来它正在工作,但实际上什么都没有听到.还在其他设备上重现,如另一台iPhone 6+和另一台运行iOS 8.4的iPhone 6.我已经创建了一个演示项目(下面的链接),以便其他人可以尝试自己的设备.

我这样做:

  1. NSURL *url使用以下路径初始化[[NSBundle mainBundle] resourcePath]:
    /var/mobile/Containers/Bundle/Application/0ACADB94-886E-4C7E-A327-3FFF0E54CEF9/My App.app/sndEfcts/!snap.mp3
  2. 将新对象分配到ivar中:

    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&err];
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在调试器中测试网址 - 好!(请注意,该空间变为%20.我还验证该文件存在):

    (lldb) po audioPlayer.url
    file:///var/mobile/Containers/Bundle/Application/0ACADB94-886E-4C7E-A327-3FFF0E54CEF9/My%20App.app/sndEfcts/!snap.mp3`
    
    Run Code Online (Sandbox Code Playgroud)
  4. 播放如果创建好:

    if (audioPlayer) {
        audioPlayer.delegate = self;
        [audioPlayer prepareToPlay];
        __unused BOOL playOk = [audioPlayer play];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 完成代表被激活: - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
    ...并且标志说是! - 但没有听到任何消息:(

所以一切似乎都没问题,仍然没有听到声音(虽然其他应用程序的其他声音确实可以正常工作)

有没有人知道这种行为的原因?

编辑

我已经创建了一个简单的项目来演示.它发生在各种设备上,即使是8.4.在模拟器上它始终有效

ish*_*hak 5

我找到了解决方案.

在有问题的设备上,"静音"处于打开状态,影响设备中的某些声音.要防止这种情况,请在应用开头的某处调用:

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
Run Code Online (Sandbox Code Playgroud)

这将导致音频被视为播放,因此静音选项不会将其静音.

我了解到用户通常不知道在哪里可以找到静音开/关控制.在iPad Air 2上:从底部抬起下部窗格并按下扬声器图标.