[iOS 8] NSItemProvider の使い方

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

NSItemProviderとは

iOS 8より導入された app extension で用いるクラスです。
テキストや画像、URL等のデータを高レベルで抽象化したオブジェクトを定義することができます。

NSExtensionItem とセットで使う

app extension では、extension と host app(extensionを使うアプリ)の間でのデータ受け渡しが発生します。
たとえば、写真データを extension で加工し、元のアプリに受け渡す、テキストデータを加工(たとえば要約)して元のアプリに受け渡す、など様々な場面が想定できます。
そうしたデータの受け渡しには、たとえば以下のようなコードが考えられます(概念を説明するためのものなので、かなり省略しています)。

#import <MobileCoreServices/MobileCoreServices.h>
NSItemProvider *imageItemProvider = [[NSItemProvider alloc] initWithItem:imageItem typeIdentifier:(NSString *)kUTTypeImage];
NSExtensionItem *extensionItem = [[NSExtensionItem alloc] init];
extensionItem.attachments = @[imageItemProvider];
[self.extensionContext completeRequestReturningItems:@[extensionItem] completionHandler:nil];

上記コードは、加工したimageItem(画像)を host app に返すことを想定しています。
2行目では、imageItem を NSItemProvider 型の imageItemProvider オブジェクトに変換しています。
3行目、4行目では、NSExtension 型の extensionItem オブジェクトを作成。 attachments プロパティを用いて、2行目で作成した imageItemProvider を渡しています。
そして5行目で、host app に対して extensionItem (加工後の画像を想定)を受け渡しています。

Uniform Type Identifier (UTI)

上記コードの一行目をもう一度ご覧ください。
kUTTypeImage という記述があります。
多くの方にとって、あまりなじみのない記述ではないでしょうか。
NSItemProvider クラスの initWithItem:typeIdentifier: メソッドにおいては、typeIdentifier: に対してアイテムのUTI(NSString型)を渡す必要があります。
UTIとは、データオブジェクトの中に、具体的にどんなデータが入っているのかを明示するためのものです。
MobileCoreServices.framework を1行目で import していますが、その中の UTCoreTypes.h に、UTIが定義されています。
たとえば、他には kUTTypeText, kUTTypeURL 等があります。

Extension でデータを扱うには必須

というわけで、まとめです。
NSItemProvider は、app extension でデータを受け渡すには必須のクラスです。どんどん活用していきましょう。