Response-native-sound не работает в производственной сборке для iOS, но работает в эмуляторе и для производственной сборки Android

Я работаю над приложением React Native, которое воспроизводит голосовые сообщения. У меня проблема с нашим рабочим приложением. Он не воспроизводит голосовые сообщения в производственной сборке iOS или тестовой сборке, однако он будет воспроизводиться в производственной сборке Android, а также в эмуляторе для iOS и Android. Я относительно новичок в приложениях, поддерживающих реакцию, поэтому я пытаюсь понять, почему это происходит.

Приложение не аварийно завершает работу, оно показывает воспроизведение как происходящее в пользовательском интерфейсе, но звук не воспроизводится.

Что нужно проверить, если производственная сборка не может воспроизводить звук?

Я использую текущую версию react-native-sound, которая в настоящее время 0.10.9.

Вот моя функция togglePlay, которая использует звук из response-native-sound. Я импортировал это.

togglePlay () {

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

Пожалуйста, дайте мне знать, если другая информация будет полезна при отладке этого.

Спасибо

Обновление: когда приложение удаляется, а затем перестраивается, звук не воспроизводится на iOS, но любые последующие сборки приложения (без его удаления) позволят воспроизвести звук.

brooks 13.11.2018 01:14

Зачем вы предоставляете свой package.json? Это не ваш вопрос о react-native-sound? Какую точную версию вы используете / разрешена в вашем package-lock.json? Не могли бы вы предоставить код Javascript, где вы его используете? Мы используем response-native-sound, и пока у нас не было проблем (кроме выпусков codepush на android ...)

Vinzzz 13.11.2018 10:40

@Vinzzz Я обновил свой вопрос, указав обновленную информацию, которую вы просили. Я вызываю togglePlay () в компоненте ToughableHighlight. Опять же, это отлично работает на сборках Android, но не на iOS. Спасибо за вашу помощь

brooks 13.11.2018 19:06

Вы не предоставили часть response-native-sound, это всего лишь некоторый компонент реакции. Вы используете требуемый путь к звуковому файлу? Как вы встраиваете звуки в свой набор приложений?

Vinzzz 14.11.2018 01:48

Я понял, в чем проблема. Звук выходил из динамика на телефоне вместо динамика, и звонок был отключен. Я добавил `Sound.setCategory (" Воспроизведение "), чтобы звук продолжал воспроизводиться, даже если звонок был отключен. Спасибо за предложение помочь с этой проблемой @Vinzzz

brooks 15.11.2018 17:20

Нет проблем, рад, что ты разобрался :)

Vinzzz 16.11.2018 20:31
1
6
2 258
2

Ответы 2

Проблема была связана с ручным переключателем для отключения звука звонка на iPhone. Звук воспроизводился через громкую связь. Я добавил `Sound.setCategory (" Playback ") после инициализации звука, чтобы звук продолжал воспроизводиться даже при отключенном звонке.

Недавно я столкнулся с этой проблемой, и ни один из ответов, доступных в Интернете, не помог мне. В конце концов я понял, что звуки .mp3, которые я использовал, не обнаруживаются mac / Xcode. Итак, когда вы видите детали файла в Xcode или Finder, он не смог идентифицировать достаточно информации, такой как продолжительность. Проведя часы в поисках решения. Я нашел эту проблему.

Что я сделал не так - переименовал файлы *.wav или *.avi в .mp3 вручную

Решение - 1. Используйте iTunes для преобразования файлов в определенный формат. Преобразование форматов файлов вручную приводит к повреждению файла, и хотя они работают на Android, iOS не может их обнаружить после архивирования сборки. 2. Для iOS: добавьте свои звуки в ресурсы в проекте Xcode.

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