強火で進め このページをアンテナに追加 RSSフィード

整理された情報は こちら へどうぞ。

2010年09月02日

[]iTunesを使ったファイル共有機能を使う方法

iOS(当時はiPhone OS)3.2から追加されたiTunesを使ったファイル共有機能を使う方法を試してみました。

iTunesのAppタブを選択したときに画面下部に表示されるコレでiPhoneアプリとファイルをやり取りする機能です。

f:id:nakamura001:20100901020120p:image

Mac⇔iPhoneまたはWin⇔iPhoneなどPCとiPhoneアプリ間でファイルのやり取り(転送)を行いたい時に使う機能です。なお、この機能はiTunes 9.1から搭載された機能なのでそれ以前のバージョンのiTunesでは使えません。

最近では電子書籍アプリなどが対応しており、PC上に有るPDFをiPhone電子書籍アプリに転送し、観る事が出来たりします。

こちらの機能、調べてみたいところ使い方は至って簡単、plistに「UIFileSharingEnabled」の項目(記述した後、「Application supports iTunes file sharing」に置き換わります)を追加し、チェックボックスにチェックを付けるだけで使える様になります。

f:id:nakamura001:20100903005213p:image

Information Property List Key Reference: UIKit Keys

http://developer.apple.com/iphone/library/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW20

この機能でやり取りするファイルはiPhoneアプリの Documents フォルダに格納されます。

そのため例えば文字コードUTF-8で記述した test.txt というテキストファイルを作成したアプリに転送すると以下の様なプログラムでそのテキストファイルのデータを読み込む事が出来ます。

iPhoneにアプリを転送するまではiTunesの画面の一覧に表示されません。iPhoneにアプリを転送後にテキストファイルをアプリへ転送して下さい。

	NSFileManager *fileManager = [NSFileManager defaultManager];
	NSString *filePath = [NSString stringWithFormat:@"%@/test.txt" , [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]];  
	if([fileManager fileExistsAtPath:filePath]) {
		NSData *data = [NSData dataWithContentsOfFile:filePath];
		NSString *str;
		str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
		
		UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:str
													   delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
		[alert show];
		[alert release];
		[str release];
	} else {
		UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"ファイル test.txt が見つかりませんでした"
													   delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
		[alert show];
		[alert release];
	}

また、逆に以下の様にiPhoneでテキストファイルを Documents フォルダに作成すると作成した hogehoge.txt ファイルはiTunes経由でMacやWinに取り出す事が出来ます。

	NSString *str = @"ほげほげ";
	NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
	NSString *outputFilePath = [NSString stringWithFormat:@"%@/hogehoge.txt" , [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]];  
	[data writeToFile:outputFilePath atomically:YES];

f:id:nakamura001:20100901020122p:image

逆に言えば Documents フォルダの中身が見放題になるためユーザに見られるとまずい様なファイルはココに置かない様にする必要が有りそうです。そもそも重要なデータはKeychainに格納すべきなのでこの機会にちゃんとKeychainも活用する様にしましょう!!

Takeshi ShimamuraTakeshi Shimamura 2010/09/03 11:30 私は、ユーザデータ(sqlite)のバックアップのためにファイル共有設定をしようと思っていますが、どうですかね?

nakamura001nakamura001 2010/09/03 14:39 自分はSQLiteをまだ使った事無いですがあれってファイルベースのDBですよね?
Documents フォルダにファイルを置く様にすればそういう用途も大丈夫だと思いますよ。

Takeshi ShimamuraTakeshi Shimamura 2010/09/06 09:42 nakamura001さん、返答ありがとうございます。ちょっと、試してみたら、削除やファイル名の変更も可能で、ちょっと怖いような気が... SnapShotの様にバックアップとリストアができればいいんだが。

nakamura001nakamura001 2010/09/06 23:10 そうですね削除やファイル名の変更出来ちゃいますね。

本来であればBonjourとか使ってバックアップなどが安全なんでしょうが
ちょっと大掛かりになってしまいますよね。

けんけん 2010/11/05 16:16 iTunesでバックアップしたいファイルで、見られてまずいという訳ではないのですが、削除されたりすると都合が悪いものは、どこに保存するのが正しいのでしょうね。iTunesでバックアップされるのはDocumentsとLibrary/Preferencesだけの様ですが、Library/PreferencesはNSSearchPathForDirectoriesInDomainsで取れないみたいですし。。。もし何かご存知であればご教示いただきたいです。

けんけん 2010/11/05 17:00 Appleの見解をみつけました。http://developer.apple.com/library/ios/#qa/qa2010/qa1699.html。Libraryに自分でフォルダを作れということのようです。しかし、Appプログラミングガイドをよく読み返してみると、Documents, Library/Cache, Library/Application Support以外のディレクトリにはファイルを書き込むことは出来ないと有りまして、またLibrary/Application Support下はガイドではバックアップ対象とは書かれていませんので食い違っています。ちょっと調べてみます。お騒がせしました。

nakamura001nakamura001 2010/11/06 01:44 挙げられているURLを確認してみました。

自分はあまり英語が得意では無いですが翻訳ツールなども使いつつ確認したところ以下の様なルールに成っている様な気がします。

・ <Application_Home>/Library はバックアップ対象
・しかし、 <Application_Home>/Library/Caches は除外する
・ディレクトリ名の衝突のリスクが有るので Private Documents というフォルダを作成する事を推奨

その為、このページを見る限りはLibrayの下に作成すれば良い様な気がします。

もし、宜しければ書き込むことは出来ないと有ったという「Appプログラミングガイド」の方のURLも教えて頂けますでしょうか?

けんけん 2010/11/11 12:26 お返事が大変遅くなりました。誠に申し訳ございませんm(_ _)m

全て解決しました。お騒がせしてすいませんでした。
http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/RuntimeEnvironment/RuntimeEnvironment.html%23//apple_ref/doc/uid/TP40007072-CH2-SW10

このTable 1-1のLibraryのところをご参照ください。
Library以下は、Cachesを除いてiTunesでバックアップされるし、ユーザーデータファイルは置くべきじゃないけど、アプリケーション固有のファイルは置いて良いようです。
#ただ、NSUserDomainMaskでLibraryは指定できず、Library/Application Supportなら取れるので、そこに書いておくのが良さそうです。

日本語のドキュメントだとこの辺が書いてないようです。やっぱりoriginalは見ておくべきですね。orz

ただちょっと気になるのが、その少し下にある
Backup and Restore
+ Files Saved During Application Updates
で、保証対象のディレクトリに/Libraryが含まれていない点です。書き漏らしだと思いたいところです(笑)

一応書いておきます(読まなくても良いです)が、以前のコメントを導いたソースは以下です。

http://developer.apple.com/jp/devcenter/ios/library/documentation/iPhoneAppProgrammingGuide.pdf

ここのTable1-1にはLibraryディレクトリに関する記載がないです。また、以下の和訳が微妙で、

P.52 「表 3-1 (52 ページ)に示した定数以外の ディレクトリ定数を使用して、NSSearchPathForDirectoriesInDomainsを呼び出すこともできますが、アプリケーションは、その戻り値として返されたディレクトリに書き込むことはできません。」

英文では、例としてあげたディレクトリに書き込むことが出来ないように読めます。

これら記載により、Library直下には書き込めないと解釈しました。(加えて、Libraryを取得するNSUserDomainMaskが無い点もありました)

nakamura001nakamura001 2010/11/14 04:06 ご返事ありがとうございます。すみません、コメントが遅くなってしまいました。

説明を聞いてなるほどなと思いました。自分もPDFを見てみましたが確かにこれは勘違いしちゃうのもしょうが無いですね。

まぁ、とにかく最終的には無事疑問は解決された様で良かったです。

投稿したコメントは管理者が承認するまで公開されません。

リンク元