需要のなさ半端ないですが、タイトルの通り、WKWebView の動画プレイヤーを自動で閉じたいという要望がありまして (´-ι_-`)
iPhone のブラウザで YouTube の動画とか再生すると、勝手に立ち上がるあのプレイヤーですね。
その要望を聞いた時は「どうやってすんのwてかできんのw」って状態で実装し始めました。
結論できましたが、正攻法ではないし、動画プレイヤーの取得自体が面倒という。
とりあえず100パー忘れるので、ここに記載しておきます。
開発環境(前提条件)
・Xcode12
・Swift5
・SFSafariViewController ではありません
方法は2つ
どちらも一長一短あるので、自己責任でお好きな方を使用してくださいって感じでございやす。笑
NotificationCenter から取得する
WKWebView を管理している ViewController に以下のコードを追加するだけで閉じることができます。
1 2 3 4 5 6 7 8 9 10 11 |
NotificationCenter.default.addObserver(forName: UIWindow.didBecomeVisibleNotification, object: nil, queue: nil) { notification in guard let playerWindow = notification.object as? UIWindow, let vc = playerWindow.rootViewController?.presentedViewController, vc.isKind(of: NSClassFromString("AVFullScreenViewController")!) else { return } playerWindow.rootViewController?.dismiss(animated: true, completion: { playerWindow.rootViewController = nil playerWindow.isHidden = true }) } |
個人的には、新たに UIWindow を生成するSDKやアラートなどがあった場合、タイミングによってちゃんと取得できるのかが気になります。
UIApplication から取得する
こっちの方が安パイな気がします。UIWindow を一通り確認するので。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var playerWindow: UIWindow! for window in UIApplication.shared.windows { guard let vc = window.rootViewController?.presentedViewController, vc.isKind(of: NSClassFromString("AVFullScreenViewController")!) else { continue } playerWindow = window break } playerWindow.rootViewController?.dismiss(animated: true, completion: { playerWindow.rootViewController = nil playerWindow.isHidden = true }) |
注意する点として
クラッシュ等は起こりませんが、以下のログが出力されます。
-[AVPlayerViewController exitFullScreenAnimated:completionHandler:] failed with error View needs to be loaded before you can call -[AVPlayerViewController (0x000000000) exitFullScreenAnimated:completionHandler:]!
これに関しては、表示されない方法を知っている方がいたら、ぜひ教えてほしいです。
さいごに
WKWebView の動画プレイヤーって、カスタマイズというか、もう少し自由度を高くしてほしい。
がっちがちに縛りすぎて、取得だけでも全然素敵な処理じゃない。笑
コメント