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

## なにこれ
- Flutterでjust_audioというパッケージを使って[Tebi Storage](https://tebi.io/)を使って保存していた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を追加してみる -> 直らない

**２日間丸々悩んだ。**

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

- 1番目のエラーが出るコード
~~~Dart
// 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番目のエラーが出るコード
~~~Dart
// 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`を使ったら良かったみたい！
- 解決したコード☟
~~~Dart
// 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の[公式ドキュメント](https://pub.dev/documentation/just_audio/latest/just_audio/LockCachingAudioSource-class.html)からは
>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
- [just_audio](https://pub.dev/packages/just_audio)
- [iOSアプリから自己署名証明書を使っているHTTPSサーバーと通信する by @chocoyama](https://qiita.com/chocoyama/items/890e3c35736c74733c55)
- [Disable HTTPS GET certificate check](https://stackoverflow.com/questions/72477814/disable-https-get-certificate-check)
- [iOS9 getting error “an SSL error has occurred and a secure connection to the server cannot be made”](https://stackoverflow.com/questions/32755674/ios9-getting-error-an-ssl-error-has-occurred-and-a-secure-connection-to-the-ser)