top of page
isana.net

iOS8 新機能 App Extensionの概要

更新日:2019年12月24日



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

bottom of page