[iOS] iOSアプリにYouTube 動画を埋め込み、インライン再生させる

前提条件

以下の環境で実行しています。

  • Xcode 12.0
  • iOSシミュレータ: iOS14系

HTML と JavaScript で埋め込むか、Swift で埋め込むか

公式のリファレンスを元に埋め込みます。
方法は大きく分けて2つ。

Swift で埋め込む方法はYouTube のライブラリを使って埋め込むのですが、
その中で結局WebView を作っているようです(要はJavaScript 版のラッパーのよう)。
しかしドキュメントは充実しておらず、YouTube 側もあまり力を入れている訳ではなさそうだし、
ちょろっと書かれたドキュメントを見る限り柔軟な使い方はできなさそう。

HTML と JavaScript で埋め込む、に決めた!

という理由により、HTML と JavaScript で直接コードを書いて埋め込んでいきます。

WKWebView を用意

まずWKWebView を準備します。
storyboard や xib ではなく、直接コードにより作っていきます。
コードの方が色々小回りが効くので、今回はこちらの方が良い気がします。

let config = WKWebViewConfiguration()
config.allowsInlineMediaPlayback = true
let webView = WKWebView(
    frame: CGRect(x: 0, y: 0, width: 640, height: 360),
    configuration: config
)
view.addSubview(webView)

ここでポイントなのが、config.allowsInlineMediaPlayback = true の箇所。
これを指定しないと、YouTube動画がインライン再生されず、
再生ボタンをタップした瞬間に全画面再生になってしまいます。

そのためにはWKWebViewConfiguration を WKWebView にセットする必要があるのですが、
storyboard や xib で生成し終わったWKWebView に後からセットできるのかは謎🤔

空のHTMLファイルを作成し、WKWebView に読み込ませる

次に、空のHTMLファイルを作ります。
適当に「index.html」という名前でXcodeプロジェクト内に作成します。

で、以下がWKWebView に読み込ませるコード。

guard let path: String = Bundle.main.path(forResource: "index", ofType: "html") else {
return
}

let localHTMLUrl = URL(fileURLWithPath: path, isDirectory: false)
webView.loadFileURL(localHTMLUrl, allowingReadAccessTo: localHTMLUrl)

特に言うことはありません。

次はいよいよ本題であるHTML と JavaScript を記述します。

HTML と JavaScript でインライン再生をさせる

といっても、とりあえず動画を再生させるだけなら、公式リファレンスのコードをHTMLに貼り付ければ動きます。
ただ、再生ボタンを押すと全画面再生になってしまうと思います。

インライン再生させるためには、JSでのプレーヤー初期化時にパラメータを渡してやる必要があります。
playsinline というパラメータに1を指定して渡します。

どうやって渡すか。
プレーヤー初期化時に playerVars というオブジェクト経由で渡します。
リファレンスのコードにはそれが書いてない(文章では書いているけど、サンプルコードには書いてない)ので最初混乱しましたね!

というわけでプレーヤー初期化する箇所の抜粋コード。

// 3. This function creates an <iframe> (and YouTube player)
//    after the API code downloads.
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
    height: '360',
        width: '640',
        videoId: 'M7lc1UVf-VE',
        playerVars: {
            playsinline: 1
        },
        events: {
          'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
        }
    });
}

これでインライン 再生が可能になりました!

他にも初期化時に渡せるパラメータ はたくさんあって playerVars 経由で渡せます。
それによりもう少し動画の挙動や見た目を制御できます。

で、「自動再生」や「次の動画を指定して再生」や「バックグラウンド再生」などを試してみたいのですが、
長くなりそうなので今回はここまで。

最後に

以上です。お疲れ様でした!

[iOS] iOSアプリにYouTube 動画を埋め込み、インライン再生させる」への1件のフィードバック

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。