なにこれ
- 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!