Appleは最近、開発者が単一アプリの境界を越えて機能とコンテンツを拡張できるiOS 8のアプリExtensionを発表した。
アプリExtensionが正すべき主なiOSの制限は、Open Inシステムによってアプリケーション間で不必要に重複したデータとAppleの代替キーボードを使用できないことである。この状況とは大きく異なり、Androidプラットフォームはユーザーにウィジットとカスタムキーボードを許可している。
はじめに誤解する可能性のあることは、iOS 8アプリExtensionはAndroid Intentとは異なるとArs Technicaに書くAndrew Cunningham氏は言う。Googleの説明によると、
Intentは、異なるアプリケーションのコード間で遅延ランタイムバインドを実行する機能を提供する。これのもっとも重要な利用は、アクティビティ間を接続することができるアクティビティの起動である。それは基本的に動作するアクションの抽象記述を保持している受動的データ構造である。
多くの場面においてExtensionは、intentsと区別がつかないが、iOS 8のアプリExtensionシステムの全体的な設計は、intentsとは大きく違っている。
Extensionのライフサイクル
Appleのドキュメントに記述されているように、ExtensionはContaining Appで配布される特殊なバイナリである。containing appは配布にのみ使われ、Extensionの実行はそれとは切り離されている。それにも関わらずiOS containing appは、Extensionに加えて、効果的にいくつかの機能を提供する必要がある。にも関わらずiOS containing appはextensionに加えて効果的にいくつかの機能を提供する必要がある。OS Xではそのような要件が緩和され、containing appは追加機能の提供が不要になった。
前述の通り、Extensionのライフサイクルはcontaining appとは全く関係なく、以下の4段階からなっている:
- ユーザーがアプリExtensionを選択する
- システムがそれを起動する
- アプリExtensionが実行される
- システムがアプリExtensionを落とす
同じExtensionが必要な2つのアプリが実行されると、2つの独立したExtensionのプロセスが起動する。
このようなアプローチを採用した主な理由としては、短命なExtensionにおけるメモリ使用量と電力消費量の削減と、ひとつのExtensionの障害が同じExtensionを使う他のアプリに波及しないためである。
Extensionのタイプ
いくつかのタイプのExtensionが存在しており、それぞれがExtensionポイントと呼ばれるシステム領域に紐付いている:
- Today (別名Widget): 通知センターのTodayビューにクイックアップデートの表示やクイックタスクの実行
- Share: 他のアプリと共有サイトや共有コンテンツのポスト
- Action: 他のアプリのコンテキスト内でコンテンツの処理や表示
- Photo Editing (iOSのみ): 写真アプリ内の写真とビデオを編集
- Finder (OS Xのみ): Finderで直接、ファイル同期の現在の情報について提示
- Document Provider (iOSのみ): ファイルのリポジトリーのアクセスと管理を提供する
- Custom keyboard (iOSのみ): すべてのアプリで使用するカスタムキーボードでiOSシステムキーボードを置き換え
各Extensionポイントは、利用ポリシーと特定のAPIに関連づけられており、開発者は適用したい機能の種類に適したExtensionポイントを選択する必要がある。たとえば、キーボードExtensionはデフォルトでは"ネットワークアクセスができず、それが含まれるcontaining appでコンテナを共有することができない。"このような制限を適切にExtensionに設定することにより引き上げることができるが、開発者がApp StoreレビューガイドラインのおよびiOS開発者プログラムライセンスアグリーメントに含まれる特定のネットワーク接続されたキーボードのガイドラインに準拠している必要がある。
サンドボックスとセキュリティ
ご存じの通り各iOSアプリは独自のサンドボックス内に存在している。Mac App Storeを通じて配布されるOS Xアプリも同じような要件があるが、多くのOS XアプリはMac App Storeの外で配布され、サンドボックス要件を満たす必要がない。
サンドボックスは、AppleのiOSに対するセキュリティ戦略の礎石のひとつである。サンドボックスは、アプリからファイル、環境設定、ネットワークリソース、ハードウェアなどへのアクセスを制限することを意味し、その目的は、標的のアプリがシステムに与える損傷を制限することにある。
アプリExtensionは、通常のアプリよりもより制限されたサンドボックスで実行されており、アプリで使用可能なAPIのすべてがExtensionで使えるわけではない。Extensionが利用できないAPIはNS_EXTENSION_UNAVAILABLE
といった使用不可マクロでマークされ、リンク時に失敗する。
さらにAppleはExtensionで他のアプリとの間の通信にいくつかの厳格な要件を課している:
- ホストアプリと呼ばれるExtensionから呼ばれるアプリは、それを起動することができない。システムのみがExtensionを起動することができる。
- ホストアプリは起動直後に直接、Extensionと通信する。
- ホストアプリはcontaining appと直接通信することはない。
- Extensionはアプリではないが、システムによって生成されるため、ホストアプリの実行コンテキストに影響を与えることがない。
- containing appとそのExtensionの間でデータを共有するには、containing appとそのExtensionがアプリグループの一部である必要がある。両方のアプリのサンドボックスの外にある第三のコンテナで、いくつかのデータをそれらふたつの間で共有することができる。
このようなルールの主な最終結果は、アプリは他のアプリのサンドボックスに入ることができないということであると、Ars TechnicaのAndrew Cunningham氏はまとめた。これは、アプリに提供するために他のアプリ内のデータにアクセスするために協働するAndroidのContent ProvidersとResolversとは対称的である。
リアクション
アプリExtensionはiOS開発者の間で多くの関心を集めている。"Extensionは新しいオペレーティングシステムで最大の、もっとも目に見える影響を与えるだろう"とCunningham氏は言う。
MacStoriesのFederico Viticci氏は、Appleの発表に対するいくつかの開発者のリアクションを集めて、"ExtensionがiOSアプリのエコシステムに与える影響を計測するのは難しいが ... Appleの発表に対する開発者のリアクションを考慮すると、私たちはこの秋にクールな新しいものを沢山見ることになるでしょう。."と言う。
一方、セキュリティの専門家は、多くの機能は、多くのリスクを産むことがあると警告する。 セキュリティーファームのSymantecによると: "これらの機能がどれだけ影響があるかは、iOS 8がリリースされた時に攻撃が増加または減少するのを見るまでわからない""現在入手可能な情報を元にすると、iOSデバイスの保護レベルを高めるべきセキュリティ機能が一部ある"ことを認識している。