React-Native音频无法在IOS Simulator上播放(OSStatus错误2003334207)

时间:2019-01-12 06:19:14

标签: ios react-native

我正在MacBook上运行React-Native应用程序。该应用程序以前可用于Android。我基本上已经使用最新的react-native模块重新启动了一个项目。但是,我似乎无法使音频正常工作。

我具有以下功能,该功能是在click事件中触发的:

  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")
         })
      }
    });

  }

我已验证声音文件确实存在并且路径正确。但是,以上代码抛出错误:

  

{代码:“ ENSOSSTATUSERRORDOMAIN2003334207”,消息:“操作   无法完成。 (OSStatus错误2003334207。)”,nativeStackIOS:   Array(17),域:“ NSOSStatusErrorDomain”,userInfo:{…}}

此错误告诉我的是什么,我该怎么办才能解决?

已更新以进行澄清:

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

这是错误的nativeStackIOS部分:

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"

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

constructor(filename, basePath, onError)

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

  

如果filename是绝对路径,则忽略此内容或传递空字符串。不然你   可以使用以下预定义目录之一: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上却不能工作。