iOS8 新機能 App Extensionの概要

App Extensionとは?

iOS8から導入されたアプリ間連携の仕組みです。

iOSの場合には以下の様なExtensionタイプが用意されています。

・Today
通知センターに表示するウィジェット
・Share
他のアプリで共有コンテンツをポストする
・Action
他のアプリと連携してコンテンツの処理や表示をする
・Photo Editing
写真アプリで写真や動画の編集
・Document Provider
ファイル管理
・Custom keyboard
iOSのシステムのキーボードをカスタムキーボードに置き換えることができる

それぞれのExtensionタイプの紹介は次回以降の記事にするとして今回は概要をご説明します。

App Extensionの仕組み

iOS8ではAppExtensionはどのような仕組みで提供されるのかをご説明します

図は公開されているドキュメントから拝借しました。

まず用語の理解からですが、

Host App:Extensionを呼び出すアプリ
Containing App:Extensionの機能を含むアプリ

というイメージです。

Extensionの機能はiOSのアプリケーションとして提供されるわけではないため、
単体のアプリケーションとして配布することができません。
そのため、Containing Appという通常のアプリケーションが必要になります。
Extensionとして提供する機能はContaining Appのターゲットとして追加します。
単一のアプリケーションに複数のextensionを追加することができます

また、AppExtensionの仕組みとして、図からも理解できる通り、
Host AppはContaining appと直接通信できずExtensionを通じてデータのやりとりをします

Extensionでの処理

ExtensionではViewControllerからNSExtensionContextを取得することで処理を行う仕組みになっています。

NSExtensionContext *myExtensionContext = [self extensionContext];
NSArray *inputItems = [myExtensionContext inputItems];

例えば、他のアプリを呼び出す
– (void)openURL:(NSURL *)URL completionHandler:(void (^)(BOOL success))completionHandler

Host Appに処理を戻す
– (void)completeRequestReturningItems:(NSArray *)items completionHandler:(void (^)(BOOL expired))completionHandler

連携された入力データを取得
@property(readonly, copy, nonatomic) NSArray *inputItems
NSExtensionContextにはHost Appから連携されたNSExtensionItemのリストのプロパティがあるので
このプロパティから連携された入力データを取得します

この仕組みでExtensionで実現したい処理はカバーすることができます。

 

 

Containing AppとExtensionとのデータの共有について

Shared Container

Containing AppとExtensionのデータ領域は区別されていて、
お互いのContainerとの直接データのやりとりはできません。

iOS8ではContaining AppとExtensionのデータのシェアのために
『Shared Container』が提供されており、この領域にお互いがアクセスすることによって データのやりとりを行います。

Shared Containerを利用するためには『App Group』の設定が必要となります。
今回は説明を割愛しますが、iOS Dev CenterでApp Groupの設定が可能です。
同じApp Groupが設定してあるアプリ間でShared Containerを利用することができます。
Containing AppとExtensionの両方でNSUserDefauts APIを利用して以下の様にデータのやりとりが可能になります。

// Create and share access to an NSUserDefaults object.
NSUserDefaults *mySharedDefaults = 
    [[NSUserDefaults alloc] initWithSuiteName:@"com.example.domain.MyShareExtension"];

// Use the shared user defaults object to update the user’s account.
[mySharedDefaults setObject:theAccountName forKey:@”lastAccountName”];

今までもKeychainの仕組みを使ってアプリ間でのデータ共有は可能でしたが、
App Group(Shared Container)ではNSUserDefaults、CoreData、ファイルの共有が可能になり、
共有できるデータに柔軟性があります。

App Extensionの概要についての解説はこれで終了します。
次回以降はそれぞれのExtensionについて掘り下げていきます。

%d人のブロガーが「いいね」をつけました。