はじめに
本日ハマったので備忘録を二点残しておきたいと思います。
iOSアプリでSkyWayを使ったアプリを実装する場合に、peerオブジェクトを必ず明示的に破棄するようにしましょう
そして、SKWMediaStream
の操作をするときはメインスレッドで実行しましょう
TL;DR
画面遷移などで一度接続したpeerを破棄する場合は、peer.destroy()
しないと次回接続時のSKWNavigator.initialize(peer)
を実行した時にエラーが発生しないまま動作がストップする。
SKWMediaStream.addVideoRenderer
するときはもちろん、SKWMediaStream.close
するときもメインスレッドで実行しないと接続が切れるまでUIがストップする。しかも、止まるのを待たないまま動かし続けるとフリーズする
(completionhandler
のような接続断後に実行できる関数はない)
経緯
どちらも、以前動いていたものが動かなくなって報告をもらってから調査を行なったもの。
ソースコードは一切変更していなったので、なぜ突然動かなくなったのかはわからない。
おそらく以前から動かなくなっていたと思われるが、リリース当初は問題なく動いていたため、いつからかは不明。
peer.destroy()
ビデオ画面に入室 <-> 退室を繰り返した時に2回目のSKWNavigator.initialize(peer)
を実行したタイミングでエラーも出ず、次の処理にも進まない事象が発生した。
SkyWayのSwiftライブラリは中のソースコードを読むことが出来ず、ステップ実行でどこで止まっているかもわからないためいくつかのサンプルコードを読んで実行して問題ないことを確認した上で、ビデオ終了時にpeer.destroy()
せずにpeerにnilを格納して破棄しているだけであることを発見、解決した。
SKWMediaStream
こちらもビデオ画面に入室 <-> 退室を繰り返した時に、2回目の退室後に入室前画面に戻りはするも、画面がフリーズする事象が発生した。
こっちはどこで処理がストップしているか不明だが、前画面には戻っていて処理は全て完了していたので、こちらもサンプルコードを探して
公式のサンプルではDispatchQueue.main.async
でremoveVideoRenderer
を実行していたため、こちらを参考に修正することができた。
まとめ
SkyWayのiOSライブラリは情報が少なく、原因を調査するのが難しいので
こういうブログでWebに知見を残していきたい。