8

ブラウザ ビューからカスタム ビューへのドラッグ操作を処理しました。ユキヒョウではうまく機能しますが、サンドボックスのあるマウンテン ライオンではうまく機能しません。

in browser view:
    NSMutableArray* urls = [[[NSMutableArray alloc] init] autorelease];
..............put some NSUrl to urls array....................
    [pasteboard writeObjects:[NSArray arrayWithArray:urls]];

in my receive custom view:
    NSArray* pasteboardItems = [pasteboard readObjectsForClasses:[NSArray arrayWithObject:[NSString class]] options:nil];
    NSArray* pasteboardItems2 = [pasteboard readObjectsForClasses:[NSArray arrayWithObject:[NSURL class]] options:nil];
    NSArray* pasteboardItems3 = [pasteboard readObjectsForClasses:[NSArray arrayWithObject:[NSImage class]] options:nil];
    NSLog(@"%@",pasteboardItems);
    NSLog(@"%@",pasteboardItems2);
    NSLog(@"%@",pasteboardItems3);
my log is:
    2012-08-09 18:33:43.886 iCollage[6885:303] __CFPasteboardIssueSandboxExtensionForPath: error for [/Users/xxxx/Library/Containers/xxxxxxxxxxxx/Data/Downloads/1343902069.jpg]
    2012-08-09 18:33:44.546 iCollage[6885:303] ( "file://localhost/Users/xxx/Library/Containers/xxxxxxxx/Data/Downloads/1343902069.jpg")
    2012-08-09 18:33:44.547 iCollage[6885:303] ( "file://localhost/Users/xxxxx/Library/Containers/xxxxxx/Data/Downloads/1343902069.jpg")
    2012-08-09 18:33:44.547 iCollage[6885:303] ()

私の質問は:

1.このエラーを修正する方法__CFPasteboardIssueSandboxExtensionForPath;ドキュメントを参照しましたが、それについて何も見つかりませんでした.ファイルにアクセスする権限があることを確認しています.

2.なぜpasteboardItems2に値があるのですか?ペーストボードにはURLのみを書き込み、文字列は書き込みません.NSStringタイプとNSUrlタイプの両方からURLを取得できることにうんざりしました! (iFinder からファイルをドラッグしようとすると、url は pasteboardItems にのみ存在し、pasteboardItems2 には存在しません) 理由を知っている人はいますか? 誰かがこの問題を解決するのを手伝ってくれると、最初の問題は自動的に修正されると思います。

4

4 に答える 4

1

Appleは質問 1に答えると思います。

重要: ファイル パスのドラッグはサポートできますが、通常は、移動先のアプリがアプリ サンドボックスで実行されないことが確実でない限り、これを避ける必要があります。NSString を使用する場合、OS X はその文字列をパスとして解釈する必要があるかどうかを知る方法がありません。したがって、OS X は、宛先アプリのサンドボックスを展開して、その場所にあるファイルまたはディレクトリへのアクセスを許可しません。代わりに、NSURL、ブックマーク、またはファイル名のペーストボード タイプを使用してください。

質問 2 への WRT、URL を貼り付けたように見えるので、NSURLオブジェクトの読み取りは正しいようです。ただし、次のコードを使用してドラッグを実装する必要があると思います(上記のリンクからも):

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
{
    NSPasteboard *pboard = [sender draggingPasteboard];

    if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
        NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
        int numberOfFiles = [files count];
        // Perform operation using the list of files
    }
    return YES;
}
于 2012-11-29T12:56:57.273 に答える
1

送信側でセキュリティ スコープの URL ブックマーク データを生成し、受信側でそのデータを URL に戻す必要があります。実際に URL にアクセスしたい場合は、その後にいくつかの作業を行う必要があります。ドキュメントは詳しく説明しています。

受信アプリケーションは、サンドボックスで実行されている場合、ベア パスを処理できません。これはサンドボックス化の中核部分です。サンドボックス コンテナーになく、ユーザーから明示的に渡されていないファイルにアクセスするために、ベア パスまたはそれに対応する URL を使用することはできません。

于 2012-12-18T08:53:39.620 に答える
0

pasteboardItemsはNSStringタイプのオブジェクトを読み取りますが、ファイル (拡張子は jpg) をドラッグした場合は、init メソッドで NSString タイプに登録する必要があります。

[self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeString]];
于 2012-08-31T00:44:51.460 に答える
0

アプリケーションがこれらの拡張子を持つファイルを開く必要があることをサンドボックス メカニズムが認識できるように、アプリケーションでドキュメント タイプを定義する必要があります。これを行うには、Xcode で左側のプロジェクトをクリックし、[情報] タブの [ドキュメント タイプ] で、拡張子ごとに新しいドキュメント タイプを追加します。

nameandextensionsフィールドに入力するだけです。

また、アプリケーションにドラッグされたファイルへのアクセス許可を保持したい場合は、このクラスを使用してすべてのロジックをまとめることができます。https://github.com/leighmcculloch/AppSandboxFileAccess

于 2013-11-23T14:56:33.123 に答える