1

我正在开发一个播放语音邮件的 React Native 应用程序。我遇到了我们的生产应用程序的问题。它不会在生产 iOS 或 testflight 版本上播放语音邮件,但它会在 android 的生产版本以及 iOS 和 Android 模拟器上播放。我对 react-native 应用程序比较陌生,所以我试图弄清楚为什么会发生这种情况。

该应用程序不会崩溃,它会在 UI 中显示播放,但没有播放音频。

关于无法播放声音的生产版本,需要检查哪些具体事项?

我在当前版本的 react-native-sound 上,目前是 0.10.9。

这是我的 togglePlay 函数,它使用来自 react-native-sound 的声音。我已经导入了。

切换播放(){

  if (this.state.vmLoaded == false) {

        if (this.state.vmLoading == true) {
            return;
        }

        if (this.state.vmLoading == false) {

            this.setState({ vmLoading: true });

            Requester.getVoicemail(this.props.vmData, this.props.token, 'stream')
            .then((res) => {

                this.setState({
                    vmPath: res,
                    vmLoaded: true,
                });

                const vm = new Sound(res, '', (error) => {

                    if (error) {

                        // Show toast if voicemail did not load
                        Toast({ message: 'Failed to load voicemail' });
                    } else {

                        if (!this.state.vmStarted) {

                            this.setState({ vmStarted: true });
                        }

                        vm.play((success) => {

                            if (success) {

                                this.setState({
                                    vmPlaying: false,
                                    currentTime: this.state.vmLength / 1000,
                                });

                                // Clears the interval timer to keep thread
                                // from keeping track of timing
                                timer.clearInterval(this, 'playingInt');
                            } else {

                                // if call recording fails to play, show toast to user
                                Toast({ message: 'Failed to play recording' });
                            }
                        });

                        this.setState({ vmPlaying: true });

                        // if loaded successfully, set the instance of Sound as STATE vm
                        // allowing calls to the instance via this.state.vm
                        // ie: this.state.vm.play() will initiate playing the sound
                        this.setState({
                            // set instance of Sound to state
                            vm,
                            // set full length of recording to state
                            vmLength: vm.getDuration(),
                            // set current playing time of recording to state (new, so zero)
                            currentTime: 0,
                            // interval is still null until sound is played
                            interval: null,
                            // sound starts off paused (no audio)
                            vmPlaying: true,
                            // Finally, the recording has been loaded, setting
                            // this so another instance is not created on
                            // rerender (see above IF statements)
                            vmLoaded: true,
                            vmLoading: false,
                        });
                    }
                });
            }).then(() => {

                timer.clearInterval(this, 'playingInt');

                interval: timer.setInterval(this, 'playingInt', () => {

                    this.state.vm.getCurrentTime((seconds) => {

                        this.setState({ currentTime: seconds });
                    });
                }, 1000);
            });
        }
    } else if (this.state.vmLoaded == true) {

        if (this.state.vmPlaying == true) {

            this.state.vm.pause();

            this.setState({ vmPlaying: false });

            timer.clearInterval(this, 'playingInt');
        } else {

            this.state.vm.play();

            this.setState({ vmPlaying: true });

            timer.clearInterval(this, 'playingInt');

            interval: timer.setInterval(this, 'playingInt', () => {

                this.state.vm.getCurrentTime((seconds) => {

                    this.setState({ currentTime: seconds });
                });
            }, 1000);
        }
    }
}

如果其他信息有助于调试,请告诉我。

谢谢

4

2 回答 2

1

该问题与手动开关以使 iPhone 上的铃声静音有关。声音正在通过免提电话播放。我在 Sound 初始化后添加了 `Sound.setCategory("Playback") 以允许即使在铃声静音的情况下仍能播放声音。

于 2018-11-15T16:22:12.027 回答
0

我最近遇到了这个问题,网上可用的回复都没有对我有用。最后,我意识到.mp3我使用的声音没有被 mac/Xcode 检测到。因此,当您在 Xcode 或 Finder 中查看文件详细信息时,它无法识别足够的信息,例如持续时间。在花费数小时寻找解决方案之后。我发现了这个问题。

我做错了什么 -手动重命名*.wav*.avi文件.mp3

解决方案 - 1. 使用 iTunes 将文件转换为特定格式。手动转换文件格式会损坏文件,虽然它们可以在 android 上运行,但 iOS 在归档构建后无法检测到它们。2. 对于 iOS,将您的声音添加到 Xcode 项目中的资源

于 2020-06-16T07:06:28.397 回答