1

このコードを使用して、2番目のクラスにファイルを指定されたパスに保存するように指示します。

if ([defaults boolForKey:@"SaveAutomatically"]) {
        basepath = [defaults objectForKey:@"SaveAutomaticallyPath"];
        basepath = [basepath stringByAppendingPathComponent:[defaults objectForKey:@"SaveAutomaticallyName"]];
}
[NSThread detachNewThreadSelector:@selector(saveTo:) toTarget:controller withObject:basepath];

したがって、saveTo:メソッドが呼び出されます。最初に、指定されたパスに問題がないかどうかを確認します

if (![[[aPath pathExtension] lowercaseString] isEqualToString:@"icns"]) {
    aPath = [aPath stringByAppendingPathExtension:@"icns"];
}

if ([[NSFileManager defaultManager] fileExistsAtPath:aPath]) {
    [delegate error:@"File exists already."];
    [self performSelectorOnMainThread:@selector(fs)
                           withObject:nil waitUntilDone:NO];
}

次に、いくつかの処理を実行して:を作成しますCGImageDestinationRef

NSURL *fileURL = [NSURL fileURLWithPath:aPath];
CGImageDestinationRef dr = CGImageDestinationCreateWithURL((CFURLRef)fileURL, kUTTypeAppleICNS , count, NULL);
if (!dr) {
    [delegate error:@"Unable to save icon file."];
    [self performSelectorOnMainThread:@selector(fs)
                           withObject:nil waitUntilDone:NO];
    return;
}

dr毎回ゼロです。saveToを使用してパスを指定するNSSavePanelと、文句はなく、正常に動作します。パスにログインしようとしましsaveTo:たが、正常に機能します(例:/Users/Home/Desktop/Result.icns)。

つまり、上記のコードを/Users/Home/Desktop/Result.icnsに保存すると失敗しますが、を使用して同じパスに保存することをユーザーに決定させると、NSSavePanel問題はありません。

SandBoxingを使用しています。どうすればこれを解決できますか?

4

1 に答える 1

3

サンドボックス化されたアプリは、ユーザーが[開く/保存]パネルを使用するか、ドラッグアンドドロップで明示的に許可しない限り、独自のコンテナーフォルダーの外部でファイルにアクセスできません。ユーザーが保存先のパスを選択し、後で使用できるようにそのフォルダーのセキュリティスコープのブックマークを保持できるようにする必要があります(つまり、アプリの再起動後にそのファイルを更新する場合)。

これがAppleのサンドボックスデザインガイドからの引用です:

サンドボックス化されたアプリは、次の3つの方法で、コンテナー外のファイルシステムの場所にアクセスできます。

  • ユーザーの特定の方向で
  • 特定のファイルシステムの場所にエンタイトルメントを使用する(「エンタイトルメントとシステムリソースアクセス」で説明)
  • ファイルシステムの場所が、誰でも読み取り可能な特定のディレクトリにある場合
于 2013-01-01T16:55:32.373 に答える