[iOSとAndroid機能比較] マルチタスキング

2013.09.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

【New Feature】Multi-tasking

マルチタスキングとは?

若干分野によって言葉の定義のズレはあるかと思いますが、モバイルアプリケーションにおいては、主に複数のアプリケーションが同時に処理を行えることを指しています
アプリケーションがバックグラウンドでも動作させることができ、フロントで動いてるアプリケーションの裏で別のアプリケーションが作業を行うことができます。
iOSでも元々この機能は存在していましたが、すべてのアプリケーションに適用出来るわけではなく、位置情報の取得や音楽の再生など一部の用途のみで利用可能だったようです

AndroidではServiceクラスを利用することで、非常に柔軟に利用することが出来ましたが、iOS側の今回の機能強化でどんなことができるようになったのでしょうか?
そして、それによってどんなことを考慮しなければならないのでしょうか?

特徴

公式ドキュメントには以下のような記述があります。すべてのアプリケーションは以下の2つのバックグラウンド動作が行えるようです

fetchremote-notificatinの2種類がバックグラウンドで動作できるものになります

1.バックグラウンドでコンテンツをダウンロード

Apps that regularly require new content can register with the system and be woken up or launched periodically to download that content in the background. To register, include the UIBackgroundModes key with the fetch value in your app’s Info.plist file, and set the minimum time you want between fetch operations using the setMinimumBackgroundFetchInterval: method. You must also implement the application:performFetchWithCompletionHandler: method in your app delegate to perform any downloads.

2.コンテンツが利用可能になったらPush通知が使える

Apps that use push notifications to notify the user that new content is available can now use those notifications to initiate background download operations. To support this mode, include the UIBackgroundModes key with the remote-notification value in your app’s Info.plist file. Your app delegate must also implement the application:didReceiveRemoteNotification:fetchCompletionHandler: method.

このドキュメントを見る限り、アプリケーションに特殊なモードを設定することで、バックグラウンドで動作することが出来るようです。
iOS7からどんなアプリケーションでもバックグラウンドでコンテンツのダウンロードを予め行うことができるようです。起動さえしていれば裏側で勝手にコンテンツの更新を行うことができる機能のようです
想像していたマルチタスキングとは少し異なり、どんな処理でもバックグラウンドで行うことができる、というわけではないようです

Androidとの比較

Androidにおいては、Serviceクラスを利用することで裏に常駐することが可能です。
さらに特に機能の制限等はなく、画面がないアプリケーションそのものであるため、かなり自由にできます。作り方、用途、機能等を少し比較してみます

機能 Android iOS7
バックグラウンド動作の設定方法 Serviceクラスを継承してクラスを生成する。
AndroidManifestにServiceクラスを登録する
UIBackgroundModesにモードを設定する
動作のタイミング 作り次第で結構どうにでもなる setMinimumBackgroundFetchInterval()で設定した値を基準に、OS側がバックグラウンドでの動作タイミングを決定する
動作の実装 onStartCommand(), onHandleIntent()等を利用して、呼び出された際の動作を定義する application:performFetchWithCompletionHandler:, application:didReceiveRemoteNotification:fetchCompletionHandler:
以上のハンドラ内に動作を定義する

これらの動作を見ると、AndroidにおけるGoogle Play ServicesのLocationClientの動きに非常に近いものがあるようです。

GooglePlayServices#LocationClientの特徴

「動作のタイミング」、「動作の実装」が非常に似ていることが分かります。

機能 説明
バックグラウンド動作の設定方法 LocationClient をインスタンス化してrequestUpdate() でOS側へEventの送出要求を登録
動作のタイミング LocationRequestで設定したsetExpirationDuration()等で設定した値を基準に、OS側がバックグラウンドでの動作タイミングを決定する
動作の実装 LocationListener() のハンドラ内に動作を定義する

バックグラウンド動作のために必要な情報

必要なクラス
NSURLSession というクラスが新たに追加されているようです。NSURLSessionは既存のNSURLConnectionクラスを進化させたクラスのようです。
NSURLRequest クラスでOS側にURLの接続スキーマのConfigurationを指定するようです
application:performFetchWithCompletionHandler: : イベントがFetchされたタイミングで動作するハンドラ
application:didReceiveRemoteNotification:fetchCompletionHandler: Remote-Push通知のイベントがFetchされたタイミングで動作するハンドラ(?)

まとめ

どうもAndroidの感覚でのServiceを利用したバックグラウンド動作とは全く異なる動作になるようです。ただ、少し情報を見てみるとGoogle Play Servicesに近い性質を持っているようです

  1. UIBackgroundModesを利用することで、アプリケーション全てがバックグラウンド動作が可能に
  2. iOSでのバックグラウンド動作 ≠ AndroidのServiceクラス
  3. iOSでのバックグラウンド動作 ≒ AndroidのGooglePlayServicesのLocationClient
  4. バックグラウンドで動作させられること > コンテンツのダウンロード
  5. バックグラウンドでの動作 > OS側から適切なタイミングでイベントがFetch、Push通知(Remote-Push Notification)

参考