iOS14で動画再生中、バックグラウンド移行時に一時停止されてしまう問題への対応


対応

  • playerView.player = nil
  • playerView.player = player

の実行タイミングを変更する

@objc func applicationWillResignActive(_ notification: NSNotification?) {
   playerView.player = nil
}

@objc func applicationDidBecomeActive(_ notification: NSNotification?) {
   playerView.player = player
}

経緯

  • ユーザー「iOS14にアップデートしたらバックグラウンド再生がおかしい。なんとかしろ
  • ワタクシ「

対応前

  • applicationDidEnterBackgroundplayerView.player = nil していた ※Appleさんの公開しているドキュメントの記載内容に従ったもの

調査

  • 何もしてないのに動かなくなった ⇒ OSの仕様変わったな?
  • バックグラウンドに行ったら一時停止 ⇒ layerにplayer設定したままの動作と同じだな?

検証

  1. 動画再生中、バックグラウンド移行前に、手動で playerView.player = nil する
  2. バックグラウンドへ移行する

「再生が継続された!」

導き出される結論は…
「layer に player があるかどうかチェックしているタイミング変わったんじゃね?」

再検証

  1. applicationDidEnterBackground より前に実行される applicationWillResignActiveplayerView.player = nil するよう変更
  2. applicationWillResignActiveに対となるのが applicationDidBecomeActive となるため、そこで playerView.player = player するよう変更

「再生が継続された!」

※iOS11-14、iPadOS13,14で動作することも確認しました

まとめ

  • Appleさんのドキュメントのままに書いても動作しないため、OS不具合の可能性が高いです
    • iOS 14.2 beta2 で、この不具合が修正されているとの噂です

その他

  • iOS14がリリースされてしばらく経ちましたが、この対応方法を見かけなかったため記事を投稿します

参考文献

  1. Apple : Playing media while in the background using AV Foundation on iOS
  2. Apple : Playing Audio from a Video Asset in the Background
  3. @KenNagami : iOSアプリのライフサイクル
  4. @bosteri_bon : iOS14で「バックグラウンド再生」が出来ない不具合への対処