対応
playerView.player = nil
playerView.player = player
の実行タイミングを変更する
@objc func applicationWillResignActive(_ notification: NSNotification?) {
playerView.player = nil
}
@objc func applicationDidBecomeActive(_ notification: NSNotification?) {
playerView.player = player
}
経緯
- ユーザー「iOS14にアップデートしたらバックグラウンド再生がおかしい。なんとかしろ
」
- ワタクシ「
」
対応前
-
applicationDidEnterBackground
でplayerView.player = nil
していた ※Appleさんの公開しているドキュメントの記載内容に従ったもの
調査
- 何もしてないのに動かなくなった ⇒ OSの仕様変わったな?
- バックグラウンドに行ったら一時停止 ⇒ layerにplayer設定したままの動作と同じだな?
検証
- 動画再生中、バックグラウンド移行前に、手動で
playerView.player = nil
する - バックグラウンドへ移行する
⇒**「再生が継続された!」**
導き出される結論は…
「layer に player があるかどうかチェックしているタイミング変わったんじゃね?」
再検証
-
applicationDidEnterBackground
より前に実行されるapplicationWillResignActive
でplayerView.player = nil
するよう変更 -
applicationWillResignActive
に対となるのがapplicationDidBecomeActive
となるため、そこでplayerView.player = player
するよう変更
⇒**「再生が継続された!」**
※iOS11-14、iPadOS13,14で動作することも確認しました
まとめ
- Appleさんのドキュメントのままに書いても動作しないため、OS不具合の可能性が高いです
- iOS 14.2 beta2 で、この不具合が修正されているとの噂です
その他
- iOS14がリリースされてしばらく経ちましたが、この対応方法を見かけなかったため記事を投稿します