Файлы перетаскивания попадают в Песочницу (__CFPasteboardIssueSandboxExtensionForPath)

Я обработал операцию перетаскивания из вида браузера в пользовательский вид. Он хорошо работает на снежном остатке, но не в Mountain Lion с песочницей.

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; я ссылаюсь на документы и ничего не нашел по этому поводу. Я уверен, что у меня есть разрешение на доступ к файлу! Google говорит, может быть "startAccessingSecurityScopedResource" мне поможет, тогда я попробую и не получилось

2.wash pasteboardItems2 имеют значение? Я пишу в pasteboard только URL, а не строку. Мне противно, что я могу получить URL как из типа NSString, так и из типа NSUrl! (Я пытаюсь перетащить файл из iFinder, URL будет существовать только в pasteboardItems, но не pasteboardItems2). Кто-нибудь знает почему? Я думаю, что первая проблема будет автоматически решена, когда кто-нибудь поможет мне решить эту проблему.

4 ответа

Я считаю, что Apple ответит на вопрос 1:

Важное замечание: Хотя вы можете поддерживать перетаскивание путей к файлам, в целом вам следует избегать этого, если вы не уверены, что конечное приложение никогда не будет запущено в изолированной программной среде приложения. Если вы используете NSString, OS X не сможет узнать, должна ли эта строка интерпретироваться как путь; таким образом, OS X не расширяет изолированную программную среду приложения назначения, чтобы разрешить доступ к файлу или каталогу в этом месте. Вместо этого используйте NSURL, закладку или тип монтажного стола с именем файла.

WRT на вопрос 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;
}

Необходимо создать данные закладок URL-адреса в области безопасности на стороне отправителя и преобразовать эти данные обратно в URL на стороне получателя. После этого вам нужно сделать еще кое-что, когда вы захотите получить доступ к URL; документация разрабатывается.

Принимающее приложение при работе в песочнице не сможет обрабатывать открытые пути. Это основная часть работы в песочнице; Вам не разрешается использовать открытые пути или соответствующие им URL-адреса для доступа к файлам, которых нет в контейнере с песочницей и которые вам явно не передал пользователь.

Ваш pasteboardItems читает объект типа NSString, но вы перетянули файл (с расширением jpg), вам необходимо зарегистрироваться для типа NSString в вашем методе init:

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

В вашем приложении должны быть определены типы документов, чтобы механизм песочницы знал, что ваше приложение должно открывать файлы с этими расширениями. Вы можете сделать это, щелкнув проект слева в XCode, и на вкладке Info в разделе Типы документов добавьте новый тип документа для каждого расширения.

Вам просто нужно заполнить name а также extensions поле.

Также, если вы хотите сохранить свое разрешение на доступ к файлам, перетаскиваемым в ваше приложение, вы можете использовать этот класс, чтобы обернуть всю эту логику. https://github.com/leighmcculloch/AppSandboxFileAccess

Другие вопросы по тегам