注目の新機能

iOS9から利用可能になった機能はたくさんありますが、個人的に気になった iPadの新しいマルチタスク機能 について、色々と調べてみました。

つい先日発売された iPad mini 4 や、11月発売の期待の新製品 iPad Pro など、新機種も続々登場しているiPadの力を十分に発揮できるよう、これらの機能を覚えていきましょう!

マルチタスク機能の概要

iOS 9 でAppleが発表した新しいマルチタスク機能(Multitasking enhancements in iOS 9)は、大きく3種類あります。公式でも大きく紹介されている機能なので、ご存知の方も多いと思います。ここでおさらいしましょう。

Slide Over

あるアプリを操作しながら、画面右端に2つ目のアプリをオーバーレイ表示で起動させる機能です(言語によって左端に表示します)。

メインのアプリから離れることなく2つ目のアプリを操作できるので、ゲームをしながらSafariで調べ物をしたり、メールを書きながら地図で調べたり、ということがスムーズに行えるようになりますね。

Slide Over

Split View

Slide Over と同様、2つ目のアプリを起動できる機能です。

ただし Slide Over と違い、どちらもアクティブ状態のままであり、どちらのアプリも同時に操作が可能です(Slide Overは、2つ目のアプリを操作中は1つ目のアプリを操作できません)。

この機能の利用中は、画面が完全に2分割されます。この画面を分割している仕切りは、ユーザが左右に移動させることができ、各アプリの表示領域をある程度操作可能です。

Split View

ピクチャ・イン・ピクチャ

ビデオ再生中にホームボタンを押すことで、ビデオ画面だけが小窓で表示され続ける機能です(すでにyoutubeアプリが似た機能を実装しています)。この小窓は、画面上を移動させることができ、ある程度のリサイズも可能です。

この状態で別のアプリも起動できるので、FaceTimeでビデオ通話しながら作業をしたり、映画を見ながらメモをとったりすることができるようになります。

ピクチャ・イン・ピクチャ

各機能をサポートするモデル

今回挙げた機能は、残念ながらすべてのiPadで利用できるというわけではありません。以下に挙げる通り、iPad Air 以降、もしくは iPad Mini 2 以降 となります。Split View においては、利用できるモデルがさらに絞られてしまいます。

モデル Slide Over Picture in Picture Split View
iPad Mini 2
iPad Mini 3
iPad Mini 4
iPad Air
iPad Air 2

なお、11月発売予定の iPad Pro では、すべての機能が利用可能と思われます。

Slide View と Split View を使ってみる

自分で作ったアプリを Slide View や Split View に対応させるときは、以下の手順を踏んでください。思った以上にやることは少ないです。

1. Base SDK を最新にする

プロジェクトTARGETの Build Settings を開き、Base SDKLatest iOS にします。

Base SDK

2. LaunchScreen.storyboard を用意する

スプラッシュ画面を表示するための、LaunchScreen.storyboard を用意します。Defaults.png を利用してスプラッシュ画面を表示している場合は、Slide View / Split View が利用できなくなりますので注意してください。

LaunchScreen.storyboard

3. すべての向きをサポートする

Info.plistSupported interface orientations (iPad) に対して、すべての方向をサポートするように宣言します。

iPadアプリであれば、サポートしているのが大半だと思いますが、どちらか一方のみをサポートしているアプリなのであれば、これを機に全方向のサポートを行いましょう!

Supported Orientation

Slide View / Split View に対応したくない場合

ここに挙げた3つの条件を満たしているが、Slide View / Split View には対応したくない、という場合は、Requires full screen にチェックを入れることで、明示的にサポートを外すことが可能です。

Requires full screen

もしくはInfo.plistに UIRequiresFullScreen を追加し、値を YES にしてください。

ただし、Appleとしては、すべてのiPadアプリが Slide View / Split View に対応することを望んでいるようです。ユーザとしても、マルチタスク起動ができなかった場合、ネガティブなイメージを残してしまう可能性があります。

何か特別な理由がない限り、これらの機能に対応しておくのが望ましいと思われます。

でも、ユーザが任意で機能をOFFすることができます…

設定画面の 一般 > マルチタスク > 複数のAppを許可 をOFFにすることで、ユーザが任意に Slide View / Split View 機能をOFFにすることができます。端末のスペックに不安のあるモデルを使っているユーザなどは、この機能をOFFにしている可能性もありますね。

設定画面の対象の項目

実機でのテスト中、なぜかこれらの機能が動かない…という場合は、この設定を確認してみるのも良いと思います。

画面のサイズについて

iPadアプリの画面サイズは、PortraitでもLandscapeでも、縦横方向ともに、size classesが Regular でした。ですが Slide View / Split View を利用した場合は、これらのルールが大きく変わります。

以下に、各レイアウトでの size classes の値を表示します。

各レイアウトでのサイズクラス

このように、アプリのレイアウトはユーザの操作(仕切りの移動や端末の回転)で、めまぐるしく変化することになります。これらの変化に柔軟に対応できるよう、Auto Layoutsize classes を正しく設定しましょう。

また、UITraitEnvironmentプロトコルUIContentContainerプロトコル などの、画面サイズの変更に反応するメソッドを正しく実装し、画面サイズやレイアウトの変更に対応しましょう。

アプリの状態変化について

Split View は、仕切りを移動させるたびに、アプリが非アクティブ状態になります(No2)。そして、仕切りから指を離しサイズが確定すると、アプリが再びアクティブ状態に戻ります(No3)。

No1. この状態では左右のアプリが共にアクティブ状態

No2. 仕切りを左方向に移動中。両アプリが非アクティブになる。

No3. 仕切りから指を離すと、両アプリが再びアクティブ状態になる。

アプリの Application Delegate オブジェクトは、仕切りが移動して非アクティブ状態になるごとに、applicationWillResignActive: メソッドが呼び出されています。 そして、仕切りから指が離れてアクティブ状態になるごとに、applicationDidBecomeActive: メソッドが呼び出されています。

さらに仕切りを左方向に移動すると(No4)、左側のアプリは終了し、右側のアプリのみが単体で起動している状態になります。 この時、左側のアプリはバックグラウンド状態に移行しており、applicationDidEnterBackground: メソッドが呼び出されています(No5) 。

No4. さらに仕切りを左に移動して、左側のアプリを画面外に追いやる。

No5. 左側のアプリはバックグラウンドに移行し、右にあったアプリがシングル起動している状態になる。

ピクチャ・イン・ピクチャ を使ってみる

次は、ピクチャ・イン・ピクチャ機能を実装したアプリを作ってみましょう。Slide View, Split View の時と同様、事前に行っておくべき設定を以下に挙げます。

1. Base SDK を最新にする

先ほどと同様、Base SDKLatest iOS にします(スクリーンショットは省略します)。

2. バックグラウンドでの動画再生を許可する

Capabilitiesの Background Modes をONにし、Audio, AirPlay and Picture in Picture にチェックを入れます。こうすることで、バックグラウンドでの動画再生を許可します。

Capabilities

3. オーディオセッションの設定を行う

バックグラウンドでの再生を行うためには、オーディオセッションのカテゴリを設定する必要があります(ここではオーディオセッションについての詳しい解説は省きます)。

AppDelegateクラスにて、以下のように設定してください。

import UIKit
import AVFoundation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        do {
            let audioSession = AVAudioSession.sharedInstance()
            try audioSession.setCategory(AVAudioSessionCategoryPlayback)
        }
        catch {
            // エラー処理.
        }
        return true
    }
}

画面と機能の実装

ピクチャ・イン・ピクチャ機能を実装する場合、大きく分けて3つの方法があります。

  • AVPlayerViewController を利用し、OSデフォルトのプレイヤーを利用する
  • AVPictureInPictureControllerAVPlayerLayer を利用し、独自にカスタムしたプレイヤーを利用する
  • WKWebView を利用して、Webページ上のコンテンツを再生する

このように、AVKit, AV Foundation の機能を利用し、ピクチャ・イン・ピクチャ機能を実装する形になります。

WKWebViewを利用すれば、アプリ側は特に何もせずにピクチャ・イン・ピクチャ機能を実装できるのですが、その場合はWebページ側が対応している必要があります。

今回は、AVPlayerViewController を利用した方法を採用しようと思います。

1. ストーリーボードの設定

イニシャルのViewControllerを AVPlayerViewController にします。 storyboardを開き、AVKit Player View Controller を配置してください。この画面を初期画面にするため、初期画面を表す矢印を持ってきます。

また、クラスの実体を独自のカスタムクラスにします(ここではViewControllerというクラスを割り当てています)。当然、このViewControllerというクラスは、AVPlayerViewController のサブクラス として定義してください。

ストーリーボード

2. ViewControllerクラスの設定

ストーリーボードでも設定した ViewController というクラスは、以下のように定義しています。

具体的には、AVPlayerViewController のサブクラスとして定義し、viewDidLoadメソッド の中で、見たい動画のURLを指定した AVPlayerインスタンス を生成しています。

import UIKit
import AVKit
import AVFoundation

// AVPlayerViewControllerのサブクラスとして定義.
class ViewController: AVPlayerViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // 見たい動画のURLをNSURLオブジェクトとして生成.
        let str = "http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8"
        guard let url = NSURL(string: str) else {
            return
        }

        // 自身のプロパティに、URLを指定してAVPlayerインスタンスを設定.
        self.player = AVPlayer(URL: url)
    }
}

今回サンプルとして用意した動画はHLS形式のストリーミング動画ですが、アプリ内にバンドルしたmov形式の動画などでも問題ありません。

3. App Transport Security (ATS) に対応

今回用意した動画がHTTPアクセスする動画なので、ATS対応を行わなくてはいけません(例によってATSについての詳細は省きます)。Info.plist に以下を追加してください。





    :
    :
    :
    NSAppTransportSecurity
    
        NSAllowsArbitraryLoads
        
    


実装はここまでです。とても簡単ですね!

動かしてみよう!

アプリを実行してみましょう。プレイヤーが表示されていて、再生ボタンをタップすれば動画が再生されますね!

ホームボタンを押せば、ピクチャ・イン・ピクチャ機能がスタートします!

この小窓は、移動したりリサイズしたりできます。

当然、別アプリを起動しながらでも再生は続きます。

ピクチャ・イン・ピクチャ機能も、ユーザがOFFにできます

Slide View, Split View と同様、設定画面の 一般 > マルチタスク > オーバーレイでのビデオの継続再生 をOFFにすることで、ユーザが機能をOFFにすることができます。

実機テストを行う際には、この設定が正しくONになっていることを忘れずに確認しましょう!

せっかくなので実装したい機能ばかり

今回調べた機能は、実装も簡単で、ユーザが受ける恩恵も大きいものであると言えます。すでにiPad向けにリリースしているアプリがあるのであれば、Slide View や Split View には是非対応したいですね。ピクチャ・イン・ピクチャ機能も、積極的に取り入れていきたい機能ではあります。

iPad Pro のリリースに向け、新しいマルチタスク機能をどんどん使っていきましょう!