テック
Android の Intents との比較では、全体像はほんの一部しかわかりません。
Appleのクレイグ・フェデリギ氏がWWDC基調講演で拡張機能を紹介。写真:Apple
Appleのクレイグ・フェデリギ氏がWWDC基調講演で拡張機能を紹介。写真:Apple
先週iOS 8で導入された新機能の中で、App Extensionsは新OSに最も大きく、そして最も目に見える影響を与える機能です。この機能は、サードパーティ製アプリケーション同士が通信するための手段とよく説明されますが、これは単純化しすぎです。App Extensionsでできることはそれだけではありません。実際、iOSのサードパーティ製アプリは技術的にはまだ直接通信できません。
開発者向けドキュメントを読み、WWDCセッションを視聴しました。さあ、これらの機能がどのように機能し、何をするのか、そしてAppleがサードパーティによるOSへのアクセスとセキュリティのバランスをどのように保ち続けているのかを詳しく見ていきましょう。
アプリ拡張機能は何をするのですか?
Xcode で作成する拡張機能の種類を選択します。
クレジット: Apple
Xcodeで作成したい拡張機能の種類を選択する。クレジット: Apple
サードパーティ製アプリが他のアプリと通信できるようにすることは、拡張機能が解決しようとしている問題の 1 つにすぎません。サードパーティ製キーボード、iCloud 以外のクラウド サービスへのアプリの接続、新しい通知センター ウィジェットはすべて独自の拡張機能です。
iOSのすべての部分がサードパーティによって変更(または「拡張」)できるわけではありません。デフォルトアプリを独自のアプリに置き換えたり、コントロールセンターに何らかのトグル機能を追加したりすることは不可能です。Appleは、開発者が機能を追加できる場所を示すために、いくつかの「拡張ポイント」をあらかじめ定義しています。iOS 8の拡張ポイントは以下の通りです。
- Today拡張機能(ウィジェットとも呼ばれます)は、通知センターの「Today」ビューに一目でわかる情報を表示するために使用されます。Windows PhoneのライブタイルやAndroidのホーム画面ウィジェットの代替と考えてください。
- 共有拡張機能 を使用すると、写真、リンク、その他のファイルをアプリからオンラインサービスに投稿できます。これにより、Pinterestに写真を投稿したり、アプリからDropboxやOneDriveにファイルをアップロードしたりといったことが可能になります。iOSの古いバージョンでもFacebookやTwitterへの投稿はサポートされており、共有拡張機能は他のアプリへの投稿にも役立ちます。
- アクション拡張機能は 「別のアプリのコンテキスト内でコンテンツを操作または表示」します。英語で言えば、テキスト文書に埋め込まれた写真を編集したり、AppleがWWDC基調講演で披露したように、Bing Translateのようなツールを使ってSafariウィンドウ内のテキストを翻訳したりすることを意味します。
- 写真編集拡張機能 を使えば、写真アプリで表示している写真を撮影し、他のアプリの機能を使って編集することができます(Appleは基調講演でVSCO Cam拡張機能を披露しました)。写真アプリでは編集後の画像と編集前のオリジナル画像の両方が保存されますが、動画ファイルの場合はそうではありません。
- ストレージプロバイダー拡張機能を 使用すると、生産性向上アプリで様々なクラウドサービスからドキュメントを開くことができます。例えば、Dropbox にドキュメントを保存し、Office for iPad や Pages で開いて編集することが可能です。
- カスタム キーボード拡張機能は、 デフォルトの Apple ソフトウェア キーボードを新しいサードパーティ製のキーボードに置き換えます。
「今日」拡張機能(ウィジェット)は、通知センターの「今日」ビューに統合されます 。Apple
本日は主にiOS拡張機能に焦点を当てますが、これらの拡張機能の多くは(通知センターウィジェットや共有拡張機能などを含む)、iOSと同様にOS X Yosemiteでも動作します。Appleのサンドボックス制限に縛られているMac App Storeのアプリにとっては役立つでしょう。もちろん、多くのMacアプリはApp StoreとAppleの制限を完全に回避し続けています。
このプリセットされた拡張ポイントのリストは、AndroidのIntentsシステムとは異なります。Androidアプリは「Intent Filters」を使用して、アプリが処理できる内容をオペレーティングシステムに伝えます。TwitterアプリやFacebookアプリは、写真やリンクを投稿できることをAndroidに伝えることができます。Google DriveやDropboxはほとんどの種類のファイルをアップロードできます。ChromeやFirefoxはWebページを開くことができます。新しいランチャーは、ホーム画面の外観と動作を一変させることができます。サードパーティは、オペレーティングシステムに独自のカスタムIntent Filtersを指定することもできます。対照的に、iOSはまだより制限が厳しいです(ただし、後述のように、それには理由があります)。
これから何度も出てくるので、覚えておいてください。拡張機能によってサードパーティが実行できる機能が大幅に増え、多くの一般的なユースケースではIntentと機能的に区別がつかなくなります。ただし、これらの変更はAndroidの「何でもあり」という考え方からは程遠く、主にiOSのセキュリティモデルを維持するという名目で行われています。
拡張機能はどのように入手し、どのように機能しますか?
拡張機能は、「包含アプリ」内に存在するバイナリとして配信されます。
クレジット: Apple
拡張機能は「包含アプリ」内のバイナリとして配信されます。クレジット:Apple
脱獄していないiPhone上のすべてのサードパーティ製アプリと同様に、iOS拡張機能はすべてApp Storeからダウンロードされます。ここでの最大の制限は、Appleが開発者による拡張機能のみのアプリの提供を許可していないことです。各拡張機能は「包含アプリ」内で動作する必要があり、Appleは包含アプリがユーザーに何らかの機能を提供することを義務付けています。Androidとは異なり、開発者はウィジェットのみ、またはキーボードのみのアプリを提供することはできません(これはiOSにのみ適用され、OS X開発者は拡張機能のラッパーのみのアプリを提供できます)。
この制限は、実際よりも面倒に聞こえます。App Storeで既に提供されているサードパーティ製キーボードアプリ「Fleksy」を見てください。このアプリは、キーボードチュートリアル、練習用のテキスト入力欄、設定パネルを備えているだけです。基本的な「共有」ボタンで、入力したテキストをメールやツイートとして送信できます。このアプリの機能はあまり多くありませんが、キーボードやウィジェットのアプリとしては、これ以上複雑なものはありません。
内蔵アプリは必ずしも複雑である必要はありませんが、何か機能を備えている必要があります。Fleksyキーボードの内蔵アプリは、主に練習用の非常に基本的なメモアプリです。
クレジット: アンドリュー・カニンガム
内蔵アプリは必ずしも複雑である必要はありませんが、何か機能を備えている必要があります。Fleksyキーボードの内蔵アプリは、主に練習用の非常に基本的なメモアプリです。クレジット:アンドリュー・カニンガム
Appleは他にも推奨している事項がありますが、義務ではありません。拡張機能はAppleの組み込みソフトウェアを補完するように設計することをAppleは推奨しています。サードパーティ製のウィジェットは、Apple独自のウィジェットと見た目も動作も似せて設計する必要があります。写真アプリで動作する写真編集拡張機能は、写真アプリと大きく異なる外観であってはなりません。これらのガイドラインに従わない開発者も確かに存在するでしょうが、ほとんどのiOSアプリ開発者は、AppleのUIに溶け込むアプリの開発に既に慣れています。
これらのガイドラインはAndroid開発者が慣れ親しんでいるものよりも厳格ですが、Appleはアプリが提供する拡張機能の数や種類に制限を設けていません。Xcodeで新しい「ターゲット」を追加することでアプリに拡張機能を追加できます。Appleはあらゆる種類の拡張機能に対してデフォルトのテンプレートを提供しています。
拡張機能の種類ごとに、アクティブ化の方法が異なります。ウィジェットは通知センターから有効化または無効化でき、キーボードは設定のキーボード セクションで変更できます (iOS 7 では、別の言語を選択したり、絵文字キーボードを有効にしたりする場所です)。写真編集拡張機能とストレージ プロバイダー拡張機能は、それぞれ写真アプリの使用時とドキュメント ピッカーのあるアプリの使用時など、特定の状況でのみ表示されます。共有拡張機能とアクション拡張機能はどのアプリからでも呼び出すことができますが、開発者は拡張機能にアクティブ化ルールを追加して、どの種類のデータで機能するかを指定する必要があります。拡張機能が写真の共有のみを目的としている場合は、ユーザーが URL またはドキュメントを共有しようとしているときに拡張機能が表示されないようにアクティブ化ルールを構成できます。
アクティベーションルールは、拡張機能がどのような種類のファイルに対応しているかをOSに伝えます。例えば、ドキュメントをアップロードしたいのに、写真編集拡張機能が提供されると困るでしょう。
クレジット: Apple
アクティベーションルールは、OSに拡張機能がどのようなファイルに対応できるかを伝えます。例えば、ドキュメントをアップロードしたいのに写真編集拡張機能が提供されると困るでしょう。クレジット:Apple
拡張機能はすべて包含アプリ内にパッケージ化する必要がありますが、通常、拡張機能は包含アプリとは別に実行されます。各拡張機能は.appexファイル拡張子を持つ小さなバイナリで、包含アプリを実行することなく起動、実行、終了できます。包含アプリと同じタスクの一部を実行できる必要がある拡張機能(例えば、画像にフィルターを追加するInstagram拡張機能など)の場合、開発者は「埋め込みフレームワーク」を使用して、それらのタスクを実行するコードを共有することが推奨されます。フレームワークを作成し、そこにコードをドロップし、そのフレームワークを包含アプリと拡張機能の両方に埋め込みます。唯一の注意点は、この方法でセットアップされたアプリはiOS 8.0以降が必要であり、それより前のバージョンのオペレーティングシステムでは動作しないことです。
拡張機能がアプリとは別に起動される理由の一つは、Appleが課す厳しいメモリ制限です。ウィジェットは特に制約が大きく、ユーザーは同時に複数のウィジェットを実行できます。iPhone 4SやiPad 2のようなメモリ制限の厳しいデバイスで、ウィジェットを詰め込んだ通知センターがどのように動作するかは、今後確認していく必要があります。
Apple は拡張機能を「短いライフサイクル」で設計しました。拡張機能は起動して、必要な処理を実行し、閉じます。
クレジット: Apple
Appleは拡張機能を「短いライフサイクル」で設計しました。拡張機能は起動し、機能を実行し、そして閉じます。クレジット:Apple
また、メモリ制限もあって、拡張機能は長時間実行されず、システムによってメモリから積極的に消去されます。拡張機能は、タスクを実行したら自動的に終了するように設計されています。アップロードなどの長時間かかるバックグラウンドタスクを実行する拡張機能については、Appleは、そのアップロードタスクをシステムに引き渡してから終了することを推奨しています。
これは、拡張機能のパッケージ化方法、アクセス方法、そして実行中の動作といった基本的な事項を網羅しています。制限事項はあるものの、オペレーティングシステムに多くの機能を追加する可能性を秘めており、iOS 4 や iOS 5 以降で最大の機能変更と言えるでしょう。さらに注目すべきは、これらの拡張機能が Apple のサンドボックスモデルを犠牲にすることなく動作することです。このサンドボックスモデルは、ユーザーとユーザーのデータを、今日において可能な限り安全かつプライベートに保つ上で役立つはずです。
セキュリティとプライバシーの保護、そしてiOSとAndroidの違い
一言で言えば、セキュリティとプライバシーに対する Android のアプローチと iOS のアプローチの違いは、Android ではユーザーと開発者が自ら首を吊るのに十分な縄を与えてしまうという点です。
デフォルト設定を有効にしたまま、アプリをインストールするたびに要求される詳細なリストをよく読んでおけば、Androidユーザーはマルウェアに感染したり、気づかないうちに個人情報を他人に渡したりする危険性はほとんどありません。しかし、アプリの権限設定は分かりにくい場合があります。Google Play以外の場所からアプリをサイドロードしたい人もいれば、ブートローダーをロック解除してスマートフォンのルート権限を取得し、別のAndroidディストリビューションをインストールしたい人もいます。Androidではこうしたことが許されています。これは一部のユーザーをこのプラットフォームに惹きつける機能ですが、すべて自己責任で行ってください。
対照的に、iOSは拡張機能があっても、ユーザー(とその情報)を自身から守るため、アプリケーション、拡張機能、そしてアプリケーションのデータの間に障壁を設けています。まず、アプリケーションは実際には互いに直接通信しません。前述のように、拡張機能は通常、それを含むアプリケーションとは独立して起動される小さなバイナリです。拡張機能を呼び出したアプリケーション(Appleは「ホストアプリケーション」と呼びます)は、拡張機能が起動されると拡張機能と直接通信しますが、ホストアプリケーションは拡張機能を含むアプリケーションと直接通信することはありません。ホストアプリケーションが拡張機能を使用する場合でも、Appleのシステムフレームワークを介してリクエストを送信し、システムフレームワークが拡張機能を起動します。つまり、アプリが拡張機能を直接起動することはありません。
拡張機能と、拡張機能を起動する「ホスト アプリ」は通信できますが、拡張機能はそれを含むアプリと直接通信したりデータを共有したりすることはありません。
クレジット: Apple
拡張機能と、拡張機能を起動する「ホストアプリ」は通信できますが、拡張機能はそれを含むアプリと直接通信したりデータを共有したりすることはありません。クレジット:Apple
FortyTwo Inc. の iOS 開発者である Eduardo Fonseca 氏は、iOS がアプリケーションと拡張機能を相互に保護する仕組みについて説明しました。
「すべての拡張機能はメインのアプリバンドル内の独立したバンドルであり、内部には個別の実行ファイルが含まれています」とフォンセカ氏はArsに語った。「面白いのは、拡張機能はアプリではないということです。Appleのシステムフレームワークを介して呼び出され、明確に定義されたインターフェースを使ってプロセスを起動し、拡張機能を実行します。すべてのコードは独立した実行コンテキストで実行されるため、サードパーティの『App Space』内では何も実行されません。そのため、拡張機能をサポートするアプリ(Safariなど)にリスクはなく、他のアプリ内で拡張機能を実行しても問題はありません。水と油のように、混ざり合うことはありません。」
拡張機能が親アプリと通信する必要がある場合でも、システムAPIを介して間接的に通信する必要があります。デフォルトでは、親アプリとその拡張機能は互いのデータにアクセスすることさえできません。
拡張機能とそれを含むアプリが通信する場合、API と特別な共有データ コンテナーを介して間接的に通信する必要があります。
クレジット: Apple
拡張機能とそれを含むアプリが通信する場合、APIと特別な共有データコンテナを介して間接的に通信する必要があります。クレジット:Apple
包含アプリとその拡張機能間でデータを共有するには、包含アプリと拡張機能の両方をアプリグループに追加する必要があります。これにより、両方のサンドボックス外にある第3のコンテナで、一部のデータが両者間で共有されます。iOSでChromeにログインすると、マップやGoogleドライブにもログインできるのはなぜかと疑問に思ったことはありませんか?それは、これらがすべてGoogleのアプリグループのメンバーだからです。アプリグループでも、共有できるのは「ユーザーに直接表示されない」特定の種類のデータに限られています。たとえば、データベース、キャッシュ、ログイン情報などは共有できますが、ローカルに保存されたメディアやドキュメントは共有できません。
同じアプリグループにアプリと拡張機能を配置すると、共通の場所で一部のデータを共有できるようになります。そうでない場合、アプリと拡張機能は別々のコンテナにデータを保存します。
クレジット: Apple
同じアプリグループにアプリと拡張機能を配置すると、共通の場所で一部のデータを共有できます。そうでない場合、アプリと拡張機能は別々のコンテナにデータを保存します。クレジット:Apple
これらすべてを簡単にまとめると、Appleはアプリが別のアプリのサンドボックスに入り込むことを望んでいません。拡張機能は、サンドボックス内の小さなサンドボックスのようなもので、異なるアプリ間の通信を容易にしますが、拡張機能に含まれるアプリのデータをホストアプリと直接共有することはありません。
拡張機能の実行方法は、アプリの実行方法とは異なります。例えば、Safariで拡張機能を起動し、次に同じ拡張機能をメールで起動するなど、同じ拡張機能を2つ以上のホストアプリで同時に使用する場合、システムは実際にはその拡張機能の2つの別々のコピーを起動し、別々のプロセスとして実行します。これらは同じメモリアドレス空間を共有しません。これにより、2つのホストアプリが拡張機能のサンドボックスに同時にデータを持つことがなくなり、1つのインスタンスがクラッシュしても拡張機能のすべてのインスタンスがダウンするのを防ぎます。ChromeやSafariなどのブラウザも、同様の理由ですべてのタブを別々のプロセスとして実行します。
Androidは独自のアプリケーションサンドボックスモデルを提供しており、あるアプリに保存されたデータが、アクセス権限を持たないアプリからアクセスされるのを防ぐことを目的としています。ただし、開発者は必要に応じてこの設定を回避できます。特に危険な権限設定、例えばアプリのすべてのデータが他のアプリから読み書き可能になるような設定はAndroid 4.2で非推奨となりましたが、コンテンツプロバイダとリゾルバは連携して、アプリが他のアプリのデータにアクセスできるようにすることは可能です。
繰り返しになりますが、これらは適切に使用すればデータを十分に保護するメカニズムです。しかし、Androidユーザーが悪意のあるアプリに権限を与えてしまうだけで、データが危険にさらされる可能性があります。また、アプリをインストールするたびにアプリの権限ダイアログボックスを注意深く読むとは考えられません。Appleはまた、ファーストパーティアプリに保存されているデータへのアクセスを要求したすべてのアプリを表示する便利なリストと切り替え機能を提供しています。これはGoogleがAndroid 4.4で検討したものの、最終リリースでは削除された機能です。これは拡張機能の動作とは直接関係ありませんが、iOS 8がセキュリティとプライバシーの名の下に柔軟性を犠牲にし続けることを示す一例です。
Appleは拡張機能に他の制限を設けています。拡張機能はアプリケーションが利用できるすべてのAPIを利用できないなど、特にカスタムキーボードは様々な必須ルールや推奨ルールによって制限されています。しかし、Appleの拡張機能モデルがGoogleの様々なアプリ間通信メカニズムとどのように異なるのか疑問に思っている方のために、基本的な説明はこれでお分かりいただけると思います。iOS 8は、Androidと比較すると、本質的には依然としてロックダウンされたオペレーティングシステムです。サードパーティ製アプリは依然として、すべてのデータを直接相互に共有することはできません。ホーム画面やデフォルトアプリケーションなど、iOSエクスペリエンスの特定の要素は、存在するすべてのiPhoneとiPadで統一されています。
それでも、AppleはiOS 8プラットフォームに関する最大の不満点の一つに、オペレーティングシステムのメモリ要件を大幅に増加させたり、セキュリティモデルを損なったりすることなく対処したようです。大量の拡張機能をインストールしたiOS 8デバイスを使ってみるまでは、Appleの実装の弱点がすべて明らかになることはないかもしれませんが、理論上は期待できそうです。今秋に予定しているiOS 8の完全レビューで、拡張機能の実際の使い方を詳しく見ていく予定です。それまでの間、拡張機能についてさらに詳しく知りたい場合は、Appleが公開しているドキュメントやWWDCでのプレゼンテーションが役立つリソースです。MacstoriesのFederico Viticci氏も、特定の拡張機能で何ができて何ができないのか、そして開発者がこの機能にどのように反応しているのかを詳しく説明した優れた概要記事を執筆しています。
リスト画像: Apple

アンドリューはArs Technicaのシニアテクノロジーレポーターで、コンピューターハードウェアを含むコンシューマー向けテクノロジーや、WindowsやmacOSなどのオペレーティングシステムの詳細なレビューを専門としています。フィラデルフィア在住のアンドリューは、毎週配信される書籍ポッドキャスト「Overdue」の共同ホストを務めています。
301 件のコメント