@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

= iPhoneアプリで作ったファイルをiTunesで取り出す

[2010-11-09 01:21:22]
>>>[iphone]
>>>[itunes]
cf.[iPhone] iPhone OS 3.2(iPad用OS)の特徴 - かみやんの技術者日記

iPhone/iPod touchをパソコンに接続して,iTunesからAppの項目を見ると「ファイル共有」っていうのがある.

ここからアプリで作成したファイルをやり取りしたかったら,UIFileSharingEnabled=YESっていうのをInfo.plistに追加すればいい

そんで,アプリからDocumentsディレクトリにデータを作れば,見えるようになって,ファイルを置いたり取り出したりできるようになる.

Documentsに保存する部分

Documentsディレクトリはアプリごとに存在するので,自分のアプリに割り当てられたディレクトリのフルパス(に,指定したファイル名を追加したもの)を取得するメソッド

-(NSString *)pathToDataFile:(NSString *)name {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDirectory = [paths objectAtIndex:0];
    return [docDirectory stringByAppendingPathComponent:name];
}

こんな感じで呼び出して

NSString *path = [self pathToDataFile:@"20101109-011918.dat"];

"/var/mobile/Applications/65D124D8-B9E7-4D54-9713-60D04082F8CF/Documents/20101109-011918.dat"みたいな感じのパスが取り出せる.

そのファイルに書き込むには,

[@"some text" writeToFile:path atomically:YES];

みたく書きたくなるんですが,これだと
"...m:87:0 'writeToFile:atomically:' is deprecated (declared at /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSString.h:378)"
みたいな警告が出るんですねー.これは気持ち悪いから,NSDataで書き込むことにするんですね

NSData *text = [@"some text\n" dataUsingEncoding:NSASCIIStringEncoding];
[text writeToFile:path atomically:YES];

これなら警告が出ずに書き込めるし,iTunesから取り出しても普通のテキストとして読めました

これくらいか.まとめるなら.

もちろん読み込み時も直接NSStringとかNSMutableStringのstringWithContentsOfFile:を呼ぶとdeprecatedって怒られるんでNSDataで読み込んで,initWithDataでStringにするっていう...

たぶんもうちょっとましな使い方があるんだろうけど,ちとわからなかった.詳しい人教えてください.

センサのデータを取得して,ログファイルに追記していきたいんですが,現状だと毎回ファイルからNSMutableStringに読み込み→append→ファイルに書き込み.になってしまうんです.