React-Native Audio 無法在 IOS Simulator 上播放(OSStatus 錯誤 2003334207)



我得到了一个在MacBook上运行的React Native应用程序。该应用程序以前适用于Android。我基本上已经用最新的react原生模块重新启动了一个项目。然而,我似乎无法使音频工作。

我有以下功能,它是在点击事件时触发的:

playSound(soundfile) {
var s = new Sound(RNFS.DocumentDirectoryPath + '/audio/' + soundfile, Sound.MAIN_BUNDLE, (e) => {
if (e) {
console.log('error', e);
} else {
console.log('duration', s.getDuration());
s.play(()=>{
s.release()
console.log("Sound Resource Released")
})
}
});
}

我已经验证了声音文件确实存在,并且路径是正确的。然而,上面的代码抛出了一个错误:

{code:"ENSOSSTATUSERRORDOMAIN2003334207",消息:"操作无法完成。(操作系统状态错误2003334207.)",nativeStackIOS:数组(17),域:"NSOSStatusErrorDomain",用户信息:{…}}

这个错误到底告诉我什么?我该怎么做才能修复它?

更新澄清:

该声音文件不是静态声音文件,因此未与应用程序打包。相反,用户可以选择一个压缩的游戏包从游戏服务器下载。游戏包由图像、音频和数据文件组成。zip文件被下载并解压缩。图像和数据文件都可以正常工作。然而,无论出于何种原因,音频都无法播放。我再次确认音频文件确实存在于该路径中。

这是错误的nativeStackeIOS部分:

0: "0 App4 0x0000000106ee30b7 RCTJSErrorFromCodeMessageAndNSError + 135"
1: "1 App4 0x0000000106ee2fe3 RCTJSErrorFromNSError + 275"App4
2: "2 App4 0x00000001070fdff8 -[RNSound prepare:withKey:withOptions:withCallback:] + 1624"
3: "3 CoreFoundation  0x0000000109ac303c __invoking___ + 140"
4: "4 CoreFoundation  0x0000000109ac04d5 -[NSInvocation invoke] + 325"
5: "5 CoreFoundation  0x0000000109ac0926 -[NSInvocation invokeWithTarget:] + 54"
6: "6 App4 0x0000000106e724ca -[RCTModuleMethod invokeWithBridge:module:arguments:] + 2810"
7: "7 App4 0x0000000106f2e306 _ZN8facebook5reactL11invokeInnerEP9RCTBridgeP13RCTModuleDatajRKN5folly7dynamicE + 790"
8: "8 App4 0x0000000106f2de1f _ZZN8facebook5react15RCTNativeModule6invokeEjON5folly7dynamicEiENK3$_0clEv + 127"
9: "9 App4 0x0000000106f2dd99 ___ZN8facebook5react15RCTNativeModule6invokeEjON5folly7dynamicEi_block_invoke + 25"
10: "10  libdispatch.dylib 0x000000010d0ac4e1 _dispatch_call_block_and_release + 12"
11: "11  libdispatch.dylib 0x000000010d0ad54b _dispatch_client_callout + 8"
12: "12  libdispatch.dylib 0x000000010d0b401c _dispatch_lane_serial_drain + 720"
13: "13  libdispatch.dylib 0x000000010d0b4b5f _dispatch_lane_invoke + 401"
14: "14  libdispatch.dylib 0x000000010d0bd9a8 _dispatch_workloop_worker_thread + 645"
15: "15  libsystem_pthread.dylib 0x000000010d49760b _pthread_wqthread + 409"
16: "16  libsystem_pthread.dylib 0x000000010d497405 start_wqthread + 13"

根据我找到的一些文档(我不确定在哪里可以找到官方文档),它说构造函数的语法如下:

constructor(filename, basePath, onError)

其中basePath是文件的可选基本路径。basePath的选项有:

如果文件名是绝对路径,则省略此项或传递空字符串。否则,你可以使用预定义目录之一:Sound.MAIN_BUNDLE,Sound.DOCUMENT、Sound.LIBRARY、Sound.CACHES.

由于我使用的是绝对路径,所以我用一个空字符串替换了Sound.MAIN_BUNDLE

所以我改变了:

var s = new Sound(RNFS.DocumentDirectoryPath + '/audio/' + soundfile, Sound.MAIN_BUNDLE, (e) => { ... }

至:

var s = new Sound(RNFS.DocumentDirectoryPath + '/audio/' + soundfile, '', (e) => { ... }

现在一切都很好。然而,我有一个问题,为什么在指定绝对路径和Sound.MAIN_BUNDLE时,它在Android上运行良好,但在IOS上不起作用。

当您试图访问指定文件夹中不存在或无法从网络下载的文件时,会发生此错误。

请使用本地音频文件或类似文件进行测试,建议将托管音频文件的域列入白名单,或在需要时使用NSAllowsArbitraryLoads将所有内容列入白名单。

最新更新