さて、Picture-in-Picture、どう対応しましょう。
AVPlayerViewControllerはiOS8以上のみ、
AVPictureInPictureControllerはiOS9以上のみ、使えます。
既存のコードにどうやって入れ込んでいけばいいのでしょうか。
iOS7をdeploy targetにしたサンプルを作って考えてみました。
もちろん、PiPの機能自体はどうやってもiOS9のiPad Air*, iPad mini [23]でしか使えません。
サンプルコード
コードを見ていただければ分かるのですが、ポイントは 、
-
#available
でのOSバージョン分岐 - AVPlayerViewControllerを使わない場合、PiPを使う部分は別クラス(今回はサブクラス)として切り出し、初期化時に選択
です。
こんな感じです。
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
switch indexPath.row {
case 0: // AVPlayerViewControllerを使う場合
if #available(iOS 8.0, *) {
let vc = ModernPlayerViewController() // subclass of AVPlayerViewController
navigationController?.pushViewController(vc, animated: true)
}
case 1: // UIViewControllerを使う場合
let vc:OldStylePlayerViewController
if #available(iOS 9.0, *) {
vc = PiPOldStylePlayerViewController() // subclass of OldStyle..
} else {
vc = OldStylePlayerViewController() // subclass of UIViewController
}
navigationController?.pushViewController(vc, animated: true)
default:
break
}
}
AVPlayerViewControllerを使わずにプレイヤーUIをガンガンカスタマイズする/している場合は、子クラスとして切り出すことで既存のコードにはほとんど手を加えなくて良さそうです。
なおAppleもサンプルコードを公開しています。
こっちの方がちゃんと作りこまれてますので、実際の実装で参考にしたい方はこっちを見た方がいいかもしれません。
AVFoundationPiPPlayer: Picture-in-Picture Playback with AVKit
まとめ
今WWDCのセッションビデオを見ていますが、Multitaskingのセッションが大量にあってかつ内容が濃いので、キャッチアップが大変そうな印象です。
PiPも上記は入り口で、PiPから戻ってきた時どうすんの、とか、PiPしている間はplayerViewのUI隠さなきゃ(AVPlayerViewControllerを使わない場合)、とか色々考えることがあると思います。
これ以外にもSlide OverとSplit Viewのことも考えないといけないとなると。。。うん、もうやめましょう。
まあ、見てない人は今すぐチェックした方がいいです。やばいです。
さて余談ですが、上記のアプリを早速自分のiPad mini 2をiOS9betaにして試してみました。
盛大にOSがクラッシュしました。
実機で試される方はご注意を。。
追記
ちなみに、iOS7で実際に動くかどうかは手元に端末がなくて未確認なので、誰かもし確認してダメだったら教えてください。。
一応来週確認しようと思ってます。
=>iOS7でも動きました。