iOSでユーザ拡張子を定義する方法

iOSでユーザ拡張子を定義する方法と、UIDocumentInteractionControllerでそれを開く方法について、ちょっと悩んだのでメモ。
拡張子.mydocを定義するサンプルです。

1.OSに対して拡張子を定義する

<アプリ名>-Info.plistに以下の内容を追記する。
[xml]
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeDescription</key>
<string>My Document TEST</string>
<key>UTTypeIdentifier</key>
<string>com.myproject.mydoc</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>mydoc</string>
</dict>
</dict>
</array>
</pre>
[/xml]

2.拡張子にアプリケーションを関連付ける

<アプリ名>-Info.plistに以下の内容を追記する。
[xml]
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>mydoc</string>
</array>
<key>CFBundleTypeName</key>
<string>MyDocumentType</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSItemContentTypes</key>
<array>
<string>com.myproject.mydoc</string>
</array>
<key>LSTypeIsPackage</key>
<false/>
<key>NSPersistentStoreTypeKey</key>
<string>Binary</string>
</dict>
</array>
[/xml]

3.独自拡張子に関連づけられたアプリケーションを起動する

以下のようなコードを追加する。
細かいところは適当にアレンジしてください。filePathには、起動するアプリケーションに渡すローカルファイルのバスを設定してください。

[objc]
– (BOOL)openFileWithPath:(NSString *)filePath
{
NSURL *url = [NSURL fileURLWithPath:filePath];
docController = [[UIDocumentInteractionController interactionControllerWithURL:url] retain];
docController.delegate = self;
BOOL success = [docController presentOptionsMenuFromRect:CGRectZero inView:self.view  animated:YES];
if (success == NO)
{
[docController release];
}
return success;
}

– (void)documentInteractionControllerDidDismissOpenInMenu:(UIDocumentInteractionController *)controller
{
[controller release];
}
[/objc]

4.ファイルオープン要求イベントを処理する

独自拡張子と関連付いているアプリケーション側の処理です。AppDelegate内に追記してください。このサンプルは、ファイルの中身がテキスト文字列の場合の処理です。実際の処理はファイルフォーマットに合わせて変えてください。

[objc]
– (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
if (url != nil)
{
// ファイル内の文字列(UTF-8)を読み込むサンプル
NSError *error;
NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&amp;error];
NSLog(@"%@", str);
return YES;
}
return NO;
}
[/objc]

5.その他

UIDocumentInteractionControllerを使うと、アプリケーション間でファイルの受け渡しができます。
渡されたファイルは受け側(起動される側)のアプリケーションの/Documents/Inbox/内に書き込み不可の属性でコピーされます。
この仕組みをうまく使うと、無償版のアプリから有償版アプリへのデータ移行が簡単にできます。(BPNoteの次バージョンで追加の予定)
ただし、iOS3.2以上で無いと動きません。

6.参考リンク

http://blog.objectgraph.com/index.php/2010/06/14/ipad-sdk-3-2-document-support-1/
http://stackoverflow.com/questions/2774343/how-do-i-associate-file-types-with-an-iphone-application
Uniform Type Identifiers Overview

iOS Application Programming Guide

iOSでユーザ拡張子を定義する方法” への2件のコメント

  1. ピンバック: 自分で拡張子を定義し、メール添付経由でファイルを受け取る | 悠久無窮的生活

  2. ピンバック: 他のアプリからファイルを受け取る方法 | +++ ego-trip +++

コメントは受け付けていません。