Плагин Flutter AudioService не работает в выпуске Ios

#flutter

#flutter

Вопрос:

Я использую плагин аудиосервиса, и он отлично работает на Android и в режиме отладки в iOS. Но как только я протестирую его на реальном устройстве iOS (в режиме выпуска) Это дает мне исключения

во-первых, вообще

 void quranStartListeningPoint() => AudioServiceBackground.run(() => QuranAudioService());
  

во-вторых, это моя функция воспроизведения

 void startListeningToAyah({model.Ayah ayah, model.Surah surah}) {
  if (AudioService.running) {
    await AudioService.stop();
    await Future.delayed(Duration(seconds: 1));
  }
  await AudioService.start(
    androidNotificationColor: 0XFFB590EE,
    backgroundTaskEntrypoint: quranStartListeningPoint,
    params: {
      'sheikhId': "$selectedReciter",
      "ayahIndex": ayah.numberInSurah,
      "surah": surah.number,
      "quranModel": _quranDao.quranModelAsJson
    },
  );
}
  

Затем я конвертирую quranModelAsJson из json в модель, потому что мне нужна вся модель в классе Service, и это единственный способ отправить ее (как я думаю)

 class QuranAudioService extends BackgroundAudioTask {
  final _audioPlayer = AudioPlayer();
  final String baseUrl = "https://cdn.alquran.cloud/media/audio/ayah/";
  String ayahUrl;
  int surahNumber;
  int ayahIndex;
  int renewSurah = 0;

  QuranModel model;
  Surah surah;
  String sheikhId;

  @override
  Future<void> onStart(Map<String, dynamic> params) async {
    await _audioPlayer.setReleaseMode(ReleaseMode.STOP);
    implementParams(params);
    onCompleteListener();
    AudioServiceBackground.setState(
        systemActions: [MediaAction.seekTo],
        controls: getPlayControllers(),
        playing: true,
        processingState: AudioProcessingState.connecting);

    ayahUrl = "$baseUrl$sheikhId/${surah.ayahs[ayahIndex].number}";
    await _audioPlayer.play("$ayahUrl");
    setMediaItem();

    AudioServiceBackground.setState(
      controls: getPlayControllers(),
      playing: true,
      processingState: AudioProcessingState.ready,
      systemActions: [MediaAction.seekTo],
    );
  }

  void setMediaItem() {
    AudioServiceBackground.setMediaItem(
      MediaItem(
        extras: {"surahIndex": surahNumber, "renewSurah": renewSurah},
        id: "$ayahIndex",
        album: "${surah.englishName}",
        title: "${surah.name}",
      ),
    );
  }

  @override
  Future<void> onPause() async {
    // Broadcast that we're paused, and what controls are available.
    AudioServiceBackground.setState(
        controls: getPauseControllers(),
        systemActions: [MediaAction.seekTo],
        playing: false,
        processingState: AudioProcessingState.ready);
    // Pause the audio.
    _audioPlayer.pause();
  }

  @override
  Future<void> onStop() async {
    _audioPlayer.stop();
    if (ayahIndex == surah.ayahs.length) {
      await AudioServiceBackground.setState(
          controls: [replayControl],
          playing: false,
          processingState: AudioProcessingState.stopped);
    } else {
      await AudioServiceBackground.setState(
          controls: [],
          playing: false,
          processingState: AudioProcessingState.stopped);
      return super.onStop();
    }
  }

  @override
  Future<void> onPlay() async {
    setMediaItem();
    AudioServiceBackground.setState(
      controls: getPlayControllers(),
      playing: true,
      processingState: AudioProcessingState.ready,
      systemActions: [MediaAction.seekTo],
    );
    await _audioPlayer.play(ayahUrl);
    renewSurah = 0;
  }

  @override
  Future<void> onSkipToNext() async {
    playNext();
  }

  @override
  Future<void> onSkipToPrevious() async {
    playPrevious();
  }

//  @override
//  void onRewind() {
//    ayahIndex = 0;
//    ayahUrl = "$baseUrl$sheikhId/${surah.ayahs[ayahIndex].number}";
//    this.onPlay();
//  }

  void implementParams(Map<String, dynamic> params) {
    surahNumber = params["surah"] - 1;
    ayahIndex = params["ayahIndex"] - 1;
    sheikhId = params["sheikhId"];
    if (model == null) model = QuranModel.fromJson(params["quranModel"]);
    surah = model.surahs[surahNumber];
  }

  void onCompleteListener() {
    _audioPlayer.onPlayerCompletion.listen((event) {
      playNext();
    });
  }

  void playNext() async {
    ayahIndex  ;
    if (ayahIndex < surah.ayahs.length) {
      ayahUrl = "$baseUrl$sheikhId/${surah.ayahs[ayahIndex].number}";
      this.onPlay();
    } else
      changeNextSurahIndex();
  }

  void changeNextSurahIndex() {
    renewSurah = 1;
    if (surahNumber == 113) {
      surahNumber = 0;
    } else
      surahNumber  ;
    ayahIndex = 0;
    surah = model.surahs[surahNumber];
    ayahUrl = "$baseUrl$sheikhId/${surah.ayahs[ayahIndex].number}";
    this.onPlay();
  }

  void changePreviousSurahIndex() {
    if (surahNumber == 0) {
      surahNumber = 113;
    } else
      surahNumber--;
    ayahIndex = 0;
    renewSurah = 1;
    surah = model.surahs[surahNumber];
    ayahUrl = "$baseUrl$sheikhId/${surah.ayahs[ayahIndex].number}";
    this.onPlay();
  }

  void playPrevious() async {
    if (ayahIndex > 0) {
      ayahIndex--;
      ayahUrl = "$baseUrl$sheikhId/${surah.ayahs[ayahIndex].number}";
      this.onPlay();
    } else {
      changePreviousSurahIndex();
    }
  }

  List<MediaControl> getPlayControllers() {
    return [
      skipToNextControl,
      pauseControl,
      skipToPreviousControl,
      stopControl
    ];
  }

  List<MediaControl> getPauseControllers() {
    return [skipToNextControl, playControl, skipToPreviousControl, stopControl];
  }
}
  

Мне всегда казалось, что ayahs вызывается в null

это означает, что мой json не был преобразован в модель

поэтому я удалил эту реализацию и добавил только URL для воспроизведения

и исключение было

 2020-08-31 17:58:08.458205-0400 Runner[700:75506] iOS => call startHeadlessService, playerId bb98efb6-a819-4ea7-a566-1dc6f0ff3df4
2020-08-31 17:58:08.471709-0400 Runner[700:76237] [VERBOSE-2:ui_dart_state.cc(166)] Unhandled Exception: NoSuchMethodError: The method '*' was called on null.
Receiver: null
Tried calling: *()
#0      AudioServiceBackground.run (package:audio_service/audio_service.dart:144)
<asynchronous suspension>
  

Комментарии:

1. Я также сталкиваюсь с этой проблемой. Есть ли у вас какое-либо возможное решение этой проблемы?

2. Вы когда-нибудь понимали это? У меня такая же проблема (по-видимому).