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について掘り下げていきます。