2012-08-09 8 views
8

サンドボックス(__ CFPasteboardIssueSandboxExtensionForPath)に遭遇して、ではなく。ドラッグしたファイルは、サンドボックスでマウンテンライオンに私は雪のlepoardでうまく動作view.Itカスタムにブラウザビューからドラッグ操作を処理し

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]() 

、私の質問は:このエラー__CFPasteboardIssueSandboxExtensionForPathを修正する

1.how;私は、ドキュメントを参照してください、私は、ファイルにアクセスする権限を持っているthat.I午前ensuerについては何も見つからなかっGoogleは言います、! "startAccessingSecurityScopedResource"は私を助けてくれるでしょう。

2.why pasteboardItems2に値がありますか?私はpasteboard only urlに書きますが、string.ItはNSString型とNSUrlの両方からurlを得ることができませんタイプ! (iFinderからファイルをドラッグしようとすると、urlはpasteboardItemsにしか存在しますが、pasteboardItems2には存在しません)。私はこの問題を解決するのに役立つ最初の問題は自動的に修正されると思います。

+0

この問題を解決する方法を見つけましたか?私もこのエラーが発生しています:( – Aravindhan

+0

@Aravindhanarviあなたはブックマークの範囲 –

答えて

0

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

[self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeString]]; 
+0

私を助けなかったしようとすることができますしようとすることができます:(... – Aravindhan

1

私はApple回答質問1を信じています:

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

質問2に、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; 
} 
1

あなたは送信側のgenerate security-scoped URL bookmark data、および受信側のturn that data back into a URLする必要があります。実際にURLにアクセスするには、その後に行う必要があります。 the documentation elaborates。サンドボックス内で実行しているとき

受信アプリケーション、裸のパスを処理することはできません。これはサンドボックス化の中心的な部分です。裸のパスまたは対応するURLを使用して、サンドボックスコンテナにはなく、ユーザーが明示的に手渡していないファイルにアクセスすることはできません。

+0

それは多くの詰め物ですが...とにかくおかげです... –

+0

@AchillesWangを使用することができますこのクラスは、セキュリティスコープのURLブックマークを永続化します。https://github.com/leighmcculloch/AppSandboxFileAccess –

0

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

あなただけnameextensionsフィールドに入力する必要があります。

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

関連する問題