他アプリと連携
iOSアプリを作っていて、「他のアプリからドキュメント(データファイルや画像ファイル)を取り込めるようにしたい」と思って調べた内容のまとめです。

「自分のアプリ内のドキュメントを他のアプリで開く」というのは UIDocumentInteractionController あたりをキーワードに検索してみるといろいろ出てくると思います。
この辺りの、iOSでファイルを共有する概要や実装手順については、下記ページが分かりやすいです。
今回やりたかったのは、↑このページの、項目3. Accepting Incoming Documents (Document Reader)というのがそれで、「他のアプリからドキュメントを取り込む」仕組みです。
取り込みの概要
ファイル取り込みの仕組みは本当にシンプルで、するべきことは次の2つ。
- 対応ファイル形式の定義
- 送られてきたドキュメントの処理
これを順番に説明したいと思います。
対応ファイル形式の定義
Xcodeでプロジェクトを選択し(1)、”ターゲット”(2) の “Info”(3) を開き、リスト内にある “Document Types”(4) に追記します。
Addボタンから、Add Document Typeを選択します(5)。
これで、
Document Typesに項目が追加(6)されるので、これを編集します。

次に、この項目の設定内容について説明します。
Document Types – Name
上記画像では「型紙(ZIP)」としているところですが、これは単に項目の名前。
他のアプリから見たときにこの名前が見えるわけでも無いようです。
自分で分かりやすいように命名すればOKです。
Document Types – Types
ここが肝で、対応ファイルの形式を書きますが、ファイルの拡張子ではありません。
Uniform Type Identifiers、略して UTI と呼ばれる識別子を列挙します。
一覧はiOS Developer Libraryの Uniform Type Identifiers Reference というページにあります。
例を挙げると、次のような感じになります。
- PDF — com.adobe.pdf
- PNG — public.png
- ZIP — com.pkware.zip-archive
複数のファイル形式に対応することも可能で、例えば、PNG/JPEG/GIFを同等に扱う場合、次のようにTypesに入力します。
public.png, public.jpeg, com.compuserve.gif
Document Types – Icon
Iconには他のアプリで対応ファイルを開いたときにPOP内に表示するアイコン画像を指定できます。
指定しない場合、デフォルトのアプリアイコンを使った画像が表示されます。
自分で準備する場合、iPhone用には、22×29, 44×58、iPad用には、64×64、320×320の画像を用意する必要があり、ドロップシャドウとページカールエフェクトがかかるので、それを想定して作る必要があり、他にもマージンの設定が細かく決まっていて結構面倒なので、オリジナルを用意するのは相当余裕がある人だけでいいんじゃないでしょうか。
詳しくはこちらです↓
なんと、ここまでの設定だけで、特定のファイル形式に対して自分のアプリを開けるようにする準備は完了です!
かなり簡単ですね。
読み込みの仕組み
で、次にやるべきは、他のアプリから特定のファイルを指定し、自分のアプリを開いたあとの処理の実装。
UIApplicationDelegate インターフェイスの実装をしているクラスの、次のメソッドが呼び出されますので、この中に処理を書けばOKです。
- (BOOL)application:(UIApplication *)application openURL:(NSURL*)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
urlには次のようなファイルパスが入ってきます。
file://localhost/private/var/mobile/Applications/XXXXX/Documents/Inbox/sample.zip
自分のアプリの、Documents/Inbox/ フォルダ内にコピーされており、そのファイルへのパスが関数に渡ってくる、という仕組みです。
この Documents/Inboxフォルダですが、ここは書き込みできず、読み込みと削除しか出来ません。
そのため、もらったファイルは、自分でどこか適当な場所に移動することから始めるとよさそうです。
読み込みコード – サンプル
例えば、openURLに渡ってきたファイルの拡張子を判定し、Documentsディレクトリ直下に移動するには、次のようなコードになります。( application:openURL:sourceApplication:annotation: 内に書くことを想定しています)
1 2 3 4 5 6 7 8 9 10 11 12 | // 拡張子で処理分岐:zipの場合. if( [[url pathExtension] isEqualToString:@"zip"] ){ // ここでzipの処理. NSArray* paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); NSString* pathDocumentRoot = [paths objectAtIndex:0]; NSString* pathTempZip = [pathDocumentRoot stringByAppendingPathComponent:[url lastPathComponent]]; NSFileManager* fm = [NSFileManager defaultManager]; NSError* error = nil; if( [fm moveItemAtPath:[url path] toPath:pathTempZip error:&error] ){ // zip移動成功後の処理. } } |
テストできるアプリ
さて、これで準備は出来たのですが、一般的に出回っているアプリ内のうち、どのアプリからなら送れるか?ということですが、やっぱりDropboxが便利ですね。
ただ、テキストファイル(.txt)、zipファイル(.zip)、はいけるんだけど、PNGとか画像そのものはダメでした。
これは、標準メーラーも同じ。
GoodReaderでは、画像も書き出しが出来たので、これを使ってみるといいと思います。
GoodReader for iPhone 3.13.1(¥450)
カテゴリ: 仕事効率化, ユーティリティ
現在の価格: ¥450(サイズ: 24.2 MB)
リリース日: 2009/02/28

[AD]
↓enchant.jsの書籍が出るらしい!
HTML5とJavaScriptでスマートフォンゲーム作成! ゼロからはじめるenchant.js入門【公式ガイド】
著者/訳者:布留川英一 伏見遼平 田中諒
出版社:アスキー・メディアワークス( 2012-02-18 )
定価:¥ 3,150
Amazon価格:¥ 3,150
大型本 ( 272 ページ )
ISBN-10 : 4048862588
ISBN-13 : 9784048862585













