Hatena::Groupiphone-dev

noborunrunのiPhoneアプリ開発

公開中アプリ mStacks FilmTrackr PicTrackr

2013-08-23独自UTIを使用したファイル共有の方法

独自のファイル形式なり、拡張子なりを特定のアプリで開きたい。とか思った時に調べたので記載しておく。

受け取り側で指定した独自UTIがシステムに保持されて、UIDocumentInteractionControllerなどで拡張子を指定すると受け取り側アプリが候補に上がるようになる。

受け取る側の実装

info.plistに下記の設定をする

Export UTIs

<key>UTExportedTypeDeclarations</key>

<array>

<dict>

<key>UTTypeConformsTo</key>

<array>

<string>public.item</string>

</array>

<key>UTTypeDescription</key>

<string>my document type</string>

<key>UTTypeIdentifier</key>

<string>com.mycompany.myfiletypename</string>

<key>UTTypeTagSpecification</key>

<dict>

<key>public.filename-extension</key>

<array>

<string>ns</string>

</array>

</dict>

</dict>

</array>

XMLで書くとUIExportedTypeDeclarationsというキーの中に追加したいタイプ分のarrayを作成してその中にディクショナリを入れる。

ディクショナリの各項目は

  • UTTYpeConformsTo

UTTypeの指定を配列で行う。今回の場合はpublicの一番上の階層であるitemを指定した。

  • UTTypeDescription

ExportするUTIのTypeの説明文を入れる。

  • UTTypeIdentifier

他とかぶらないようにしたこのUTI TypeのiDentifierを入れる。

ドメインとかUserDefaultsに入れるような定義をすればよい。

  • UTTypeTagSpecification

拡張子など、ExportするUTIが持つタグをディクショナリで指定する。

ディレクトリに入れるキーは拡張子の場合はpublic.filename-extensionを指定して、その値に配列で登録したい個数分の拡張子文字列で指定する。

GUIで項目を追加すると下記の図のような形となる。

f:id:noborunrun:20130824022442p:image

Document Types

<key>CFBundleDocumentTypes</key>

<array>

<dict>

<key>CFBundleTypeIconFiles</key>

<array>

<string>document-320.png</string>

<string>document-64.png</string>

<string>nsicon</string>

</array>

<key>CFBundleTypeName</key>

<string>My file</string>

<key>CFBundleTypeRole</key>

<string>Viewer</string>

<key>LSHandlerRank</key>

<string>Alternate</string>

<key>LSItemContentTypes</key>

<array>

<string>com.mycompany.myfiletypename</string>

</array>

</dict>

</array>

XMLで書くとCFBundleDocumentTypesというキーの中に追加したいType分の配列を作成してその中にディクショナリを入れる。

ディクショナリの各項目は

  • CFBundleTypeIconFiles

使いたいアイコン画像を配列で指定する。

  • CFBundleTypeName

Typeの名前を指定する。

  • CFBundleTypeRole

Typeの役割を指定する。今回はViewerとした。

  • LSHandlerRank

アプリがこのドキュメントタイプをどの程度サポートしているかを示すランク。

優先度が高い方から

- Owner

- Alternate

- None

- Default

の順となる。

  • LSItemContentTypes

サポートするUTI形式の文字列配列で入れる。今回の場合はcom.mycompany.myfiletypenameをExport UTIsで指定していてそれを開きたいため、UTTypeIdentifierで入れたものと同じものを入れる。

GUIでは下記の図のような形となる。

f:id:noborunrun:20130824022443p:image

送る側の実装

受渡したいファイルなどを先にプロジェクトに追加するなりの用意をして、ボタンアクションなどで下記のようなコードを記載する。今回はサンプルにsample.nsというファイルを送ってみることにする。

NSURL* url = NSBundle mainBundle] URLForResource:@"sample" withExtension:@"ns"];

docInteractionCon = [UIDocumentInteractionController interactionControllerWithURL:url];

docInteractionCon.delegate = self;

if ([docInteractionCon presentOptionsMenuFromRect:self.view.frame inView:self.view animated:YES]){

}

else{

NSLog(@"There is no app for this file.");

}

受け取り側で登録したDocument Typesの中のLSItemContentTypesに指定した拡張子のファイルパスを取得して[UIDocumentInteractionController interactionControllerWithURL:]に渡してdocumentInteractionControllerを開けば受け取り側のアプリのアイコンが表示される。

ゲスト



トラックバック - http://iphone-dev.g.hatena.ne.jp/noborunrun/20130823