web-dev-qa-db-ja.com

アプリのtmpディレクトリに画像を保存するにはどうすればよいですか?

NSTemporaryDirectoryを使用して画像を保存すると、画像がに保存されるのはなぜですか

/ var/folder/oG/oGrLHcAUEQubd3CBTs-1zU +++ TI/-Tmp- /

にではなく

/ Users/MyMac/Library/Application Support/iPhone Simulator/4.3.2/Applications/A685734E-36E9-45DD-BBE7-0A46F8F91DAF/tmp

これが私のコードです:

-(NSString *)tempPath
{
    return NSTemporaryDirectory();
}

-(void) saveMyFoto
{
    NSString *urlNahledu = [NSString stringWithFormat:@"%@%@%@",@"http://www.czechmat.cz", urlFotky,@"_100x100.jpg"];
    NSLog(@"%@", urlNahledu);


    UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:urlNahledu]]];

    NSData *data = [NSData dataWithData:UIImageJPEGRepresentation(image, 0.8f)];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSLog(@"%@    %@", paths, [self tempPath]);

    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:@"pkm.jpg"];

    [data writeToFile:localFilePath atomically:YES];
}
21
vosy

これは、URLを使用してtmpディレクトリへの直接リンクを取得し、そのディレクトリのファイルURL(pkm.jpg)を返す推奨される方法です。

Swift 4.1

let url = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
    .appendingPathComponent("pkm", isDirectory: false)
    .appendingPathExtension("jpg")

// Then write to disk
if let data = UIImageJPEGRepresentation(image, 0.8) {
    do {
        try data.write(to: url)
    } catch {
        print("Handle the error, i.e. disk can be full")
    }
}

Swift 3.1

let tmpURL = try! URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
                    .appendingPathComponent("pkm")
                    .appendingPathExtension("jpg")
print("Filepath: \(tmpURL)")

発生する可能性のあるエラーは処理されないことに注意してください。

Swift 2.

let tmpDirURL = NSURL.fileURLWithPath(NSTemporaryDirectory(), isDirectory: true)
let fileURL = tmpDirURL.URLByAppendingPathComponent("pkm").URLByAppendingPathExtension("jpg")
print("FilePath: \(fileURL.path)")

Objective-C

NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES];
NSURL *fileURL = [[tmpDirURL URLByAppendingPathComponent:@"pkm"] URLByAppendingPathExtension:@"jpg"];
NSLog(@"fileURL: %@", [fileURL path]);

一部のメソッドは引き続きパスを文字列として要求し、次に[fileURL path]を使用してパスを文字列として返します(上記のNSLogに示されているように)。現在のアプリをアップグレードする場合、フォルダー内のすべてのファイル:

<Application_Home>/Documents/
<Application_Home>/Library/

古いバージョン(<Application_Home>/Library/Cachesサブディレクトリを除く)から保持されることが保証されています。ユーザーにアクセスを許可するファイルにはDocumentsフォルダーを使用し、アプリが使用してユーザーに表示しないファイルにはLibraryフォルダーを使用します。


別のより長い方法は、最初にDocumentディレクトリを取得し、最後のパスコンポーネントを削除してから、tmpフォルダを追加することにより、tmpディレクトリへのURLを取得することです。

NSURL *documentDir = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
NSURL *tmpDir = [[documentDir URLByDeletingLastPathComponent] URLByAppendingPathComponent:@"tmp" isDirectory:YES];
NSLog(@"tmpDir: %@", [tmpDir path]);

次に、ここに示すように、ファイル、つまりpkm.jpgをアドレス指定できます。

NSString *fileName = @"pkm";
NSURL *fileURL = [tmpDir URLByAppendingPathComponent:fileName isDirectory:NO];
fileURL = [fileURL URLByAppendingPathExtension:@"jpg"];

古いiOSシステムで使用されていた文字列でも同じことが達成できますが、現在は上記の最初のURLメソッドが推奨されています(古いシステムに書き込んでいる場合を除く:iPhone OS 2または3):

NSString *tmpDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
tmpDir = [[tmpDir stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"tmp"];
NSString *filePath = [[tmpDir stringByAppendingPathComponent:@"pkm"] stringByAppendingPathExtension:@"jpg"];
50

シミュレーターで実行されているアプリは、iOSデバイスのように実際にはサンドボックス化されていないためです。シミュレータでは、Mac OSの一時ディレクトリがNSTemporaryDirectory()に返されます。iOSデバイスでは、一時ディレクトリは実際にはサンドボックス内にあります。その違いは、アプリ開発者としてのあなたには関係ありません。

3
Felix