読者です 読者をやめる 読者になる 読者になる

iOSの中で、アプリケーション同士が連携するためのしくみ

AppStore経由でリリースされているアプリは、Appleによって定められたガイドラインを守ることが義務付けられていることは、みなさん周知の事実です。マルチタスキング環境となったといっても、「バックグラウンドに常駐させて好きなように振舞う」ということは許されていません。開発者の方であれば、知っていることですが、バックグラウンド処理は、以下のような目的に限定して許可されています。

  • オーディオコンテンツの再生
  • 位置情報のトラッキング
  • VoIPアプリケーション(電話等)のインターネット接続維持

例えば、SysStats Monitorのようなアプリが、常駐プロセスとして動作し、メモリ使用状況を定期的に記録するなんてことはできません。
また、そもそも通信機能が制限されているので、アプリ間で通信してリアルタイムに連携することもできません。

以上、「できないこと」ばかりを挙げて、ネガティブな感じになってしまいましたが、マルチタスキング機能とは別な形で、アプリ同士が連携するためのしくみは、いくつか用意されています。それらも一定の制限はありますが、うまく活用すれば、いずれもアプリの使い勝手を向上することができます。ここでは、その中の代表的なものを3つ紹介します。
いずれも、多くの開発者の方はご存知ですし、ユーザのみなさんも、見たことがある機能だと思いますが、自分用のメモを兼ねて、概要を整理してみました。

URLによるアプリの起動

これは、初期の頃からサポートされている機能なので、開発者のほぼ全員がご存知だと思います。
ユーザであれば、アプリを使っているときに、「メールを送信する」という操作をしたときに、標準のメールアプリが起動されるという動作を経験したことがある方は多いと思います。そのときに内部で使用されているのが、この機能です。標準でサポートされているURLは、以下のドキュメントにて説明されています。

Apple URL Scheme Reference

一般のアプリも独自のURLスキームを定義して登録することで、他のアプリから起動されるということができるようになります。
特に用途がないので公開していなかったのですが、例えば、私がリリースしているアプリでは、以下のURLスキームを密かに登録しています。

SysStats Lite sysstatslite:
SysStats Monitor sysstatsmon:

これらのアプリを購入していただいている方は、上記のURLをiOSSafariのアドレスバーに入力して、「Go」をタップすると、それぞれアプリを起動することができます。
上記のアプリはサポートしていませんが、一般のURLと同様に、パラメタを渡すこともできますので、それを意識した実装をすれば、設定されたパラメタによって振る舞いを変えるといったこともできます。

技術的なことは、以下の記事がわかりやすく説明されているので、参考になるかと思います。
URL schemeを使ってアプリを起動する - 強火で進め

Pasteboardによるデータ共有

iOS3.0より、コピー/ペースト機能がサポートされていますが、それを実現しているのがPasteboard(UIPasteboardクラス)です。MacOSXiOSの中では、Pasteboardという呼称が使われていますが、一般的な「クリップボード」と同義です。
Pasteboardの最も多い使われ方は、テキストフィールド内でのコピペだと思いますが、実際には、画像やドキュメントなどのバイナリデータも格納することができます。さらに、どのアプリからも、参照/登録を行うことができるので、アプリ間で簡単にデータを共有することが可能となります。

Pasteboardには、標準で用意されているGeneral pasteboardと、各アプリが独自に作成するCustom pasteboardがあります。

General pasteboard

標準的な、コピー/ペースト操作で使用されるpasteboardですが、アプリからも任意のデータを格納することができます。

Custom pasteboard

アプリが任意の名称をつけて管理することができるpasteboardです。名称を知っているアプリだけがアクセスすることができます。

Pasteboardの大きな特徴として、データの格納は常に上書きであるということが挙げられます。General pasteboardは、予期しないタイミングで上書きされて自分が登録したデータが消えてしまう可能性があるので、アプリ間で意味を持った連携に使用するときは、Custom pasteboardを使うのが安全でしょう。
URL起動では渡せないデータがあるときに、Pasteboardは有効な手段になると思います。

UIDocumentInteractionControllerによるファイルの受渡し

上記2機能は、MacOSXでサポートされているものを、iOSに適用したものですが、UIDocumentInteractionControllerは、iOS独自のものだと思われます。
iOS3.2より追加された機能ですが、これも、すでに多くの方は見たことがあろうものです。
最も代表的な例は、標準のメールアプリとiBookの連携だと思うので、まずはそのときの操作の流れを解説します。
PDFが添付されているメールを受信し、添付ファイルを開くと、以下のようにドキュメントを参照することができます。

ここで、右上の「次の方法で開く...」をタップすると、PDFを開くためのアプリの一覧が表示されます。

その中から、iBookを選択することで、iBookが起動され、そのPDFファイルが表示されます。

このようなことができるようにするためには、各アプリは以下のようなことをする必要があります。

ファイル受取側のアプリ

「自分はPDFファイルを開けるよ」ということを、宣言する。

ファイルを渡す側のアプリ

UIDocumentInteractionControllerクラスを使って、ファイルを渡すための処理を実装する。

アプリが起動されるところはURL起動と似ていますが、ファイルを渡せるところが大きな進化ですね。ファイルだけでなく、オプションでパラメタを渡すこともできるので、さらにありがたいです。
以前は、URL起動とPasteboardを組合せないとできなかったことが、これだけで実現できてしまいますね。


以上、各連携機能の概要をまとめてみましたが、いかがでしょうか?

1本のアプリに多くの機能を詰め込み過ぎると、複雑化してしまい、使い勝手も保守性も悪くなってしまうことが考えられます。適度な単位でアプリを分割し、連携機能を活用するのも選択肢の一つではないかと思います。
特に、企業がiPhone/iPadを導入し、自社向けのアプリを作るような場合、1本のアプリに全機能を入れることはありえないので、このような連携機能は重要かもしれませんね。

現在、SysStats MonitorSysStats LiteUIDocumentInteractionControllerを使った機能追加を考えていますので、またそれが完成したときにもう少し技術的な説明をしてみたいと思います。
とりあえず、コーディングレベルでは、以下の記事がシンプルに解説してくれているので、参考になるかと。。
Cheat Code