0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

この記事誰得? 私しか得しないニッチな技術で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【Flutter just_audio Error】(-1202) The certificate for this server is invalidを解決する

Last updated at Posted at 2024-06-15

なにこれ

  • Flutterでjust_audioというパッケージを使ってTebi Storageを使って保存していたmp3ファイルのURLセットして音楽を流そうとしたらThe certificate for this server is invalid.みたいなエラーが出た
  • LockCachingAudioSourceを使うと解決!

🥀 出たエラー

  • First one
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: (-1202) The certificate for this server is invalid.
#0      AudioPlayer._load (package:just_audio/just_audio.dart:870:9)
<asynchronous suspension>
#1      AudioPlayer._setPlatformActive.setPlatform (package:just_audio/just_audio.dart:1494:28)
  • Second one
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: (-1200) An SSL error has occurred and a secure connection to the server cannot be made.
#0      AudioPlayer._load (package:just_audio/just_audio.dart:870:9)
<asynchronous suspension>
#1      AudioPlayer._setPlatformActive.setPlatform (package:just_audio/just_audio.dart:1494:28)
<asynchronous suspension>

調べたところ、URLの証明書が有効じゃない?からAppleが拒否しているというようなことが書いてあった。
でも、Tebiのサポートの人に聞いてみると証明書はちゃんとあると言っていた。
あとは、Appleが対応しているURLの証明書の種類の範囲外なども書いてある記事を見た。
ネットにあったsampleのmp3ファイルのURLは上手く読み込み再生してくれるけど、StorageのURLはエラーを吐いてしまう。
そして、時々エラーを吐かない瞬間があるがまたすぐにエラーが出てしまう。

対応したこととしては、

  • iPhoneの日時を元に戻す -> 元々変わっていなかった

  • Info.plistに<key>NSAppTransportSecurity</key>の行を追加して<key>NSExceptionDomains</key>で特定のURLを弾かないようにする -> 直らない

  • URLにregionを追加してみる -> 直らない

2日間丸々悩んだ。

色々調査をしているとどうやら、1番目のエラーはsetAudioSourceを使ったら発生して、setUrlを使ったら2番目のエラーが発生するようだ!!

  • 1番目のエラーが出るコード
// Create a player
final player = AudioPlayer(); 

// Set the Url with setAudioSource [ERROR]
await player.setAudioSource(AudioSource.uri(Uri.parse('https://example.com/example.mp3')));

// Play the audio
await player.play();
  • 2番目のエラーが出るコード
// Create a player
final player = AudioPlayer(); 

// Set the Url with setUrl [ERROR]
await player.setUrl('https://example.com/example.mp3');

// Play the audio
await player.play();

🌻 解決法

まさかの、LockCachingAudioSourceを使ったら良かったみたい!

  • 解決したコード☟
// Create a player
final player = AudioPlayer(); 

// Set the Url with LockCachingAudioSource
final _audioSource = LockCachingAudioSource(Uri.parse('https:/example.com/example.mp3'));

// Play the audio
await player.play();

just_audioの公式ドキュメントからは

Creates a LockCachingAudioSource to that provides uri to the player while simultaneously caching it to cacheFile. If no cache file is supplied, just_audio will allocate a cache file internally.

Google翻訳さん

LockCachingAudioSource を作成し、プレーヤーに uri を提供すると同時にそれを cacheFile にキャッシュします。キャッシュ ファイルが指定されていない場合、just_audio は内部的にキャッシュ ファイルを割り当てます。

ほう?uriを保持してくれるのかな?次回読み込む時に以前そのuriを使っていたらそこから音楽を流してくれる?のかな。あまりよく説明できないけど、エラーは出ないのでOK!!
この2日間ずっっっっと悩まされていたので解決できてとても嬉しい!

最後に

最後まで読んでいただきありがとうございました!
この解決策に至るまで長かったけど、誰かの助けになれば幸いです!
なぜ、LockCachingAudioSourceを使うとこのエラーが直るのかなど知っている方がいればコメントお待ちしております!
間違っているところや誤字などがありましたらお気軽にコメントください!
Thank you!

📜 References

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?