Временное исключение для событий Apple перестало работать в macOS Sierra

сообщество,

Мне нужен совет по поводу изолированного приложения для macOS. Я уже потратил пару дней на борьбу с этой проблемой, и пока безрезультатно. Я подозреваю, что мой случай больше не будет работать в дальнейших обновлениях macOS.

Что делает мое приложение: мое приложение берет список заметок Evernote из Evernote.app напрямую через мост сценариев, затем шифрует эти заметки и затем загружает их обратно.

Проблема:

После обновления Sierra я не могу записать данные вложения в изолированную папку приложения.

Файл прав моего приложения выглядит следующим образом:

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>com.apple.security.temporary-exception.apple-events</key>
	<string>com.evernote.Evernote</string>
	<key>com.apple.security.app-sandbox</key>
	<true/>
</dict>
</plist>

Я использую мост сценариев для работы с приложением Evernote из своего изолированного приложения:

EvernoteApplication *evernote  = [SBApplication applicationWithBundleIdentifier:@"com.evernote.Evernote"];

Затем я делаю список заметок в локальной записной книжке:

return [evernote findNotes:[NSString stringWithFormat:@"notebook:\"%@\"",notebookName]];

Затем я просматриваю возвращенный массив заметок, сохраняя каждое из них вложение в NSTemporaryDirectory () + filename.

[notes enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

    EvernoteNote *note = obj;

    NSArray *localURLs = [self saveLocalAttachments:note.attachments];

    [localURLs enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

        NSURL *localURL = obj;
        NSLog(@"URL for resource: %@", [localURL absoluteString]);

    }];

}];

Функция сохранения файлов выглядит так:

-(NSArray *)saveLocalAttachments:(NSArray *)attachments {

NSLog(@"Started converting resources to files: Total attachments:%lu",[attachments count]);

//


NSMutableArray *resourcesURLs = [[NSMutableArray alloc] initWithCapacity:[attachments count]];

[attachments enumerateObjectsUsingBlock:^(EvernoteAttachment * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {



    EvernoteAttachment *attach = obj;

    //First we write data to local file (inside our sandbox)

    NSString *filename = [attach.filename get];



    NSURL *localURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:filename]];

    NSLog(@"Local URL is:%@",[localURL absoluteString]);


    @try {

        [attach writeTo:localURL];

    } @catch (NSException *exception) {

        NSLog(@"Exception writing to local file. Exception: %@",exception);

        //[self showAlertWithTitle:@"Writing Data" andMessage:[NSString stringWithFormat:@"Exception in writing temporary data. Exception name: %@, \n description: %@",exception.name, exception.description] andStyle:NSCriticalAlertStyle];
    }


    //NSLog(@"Attachment saved to: %@",[localURL absoluteString]);
    //adding url to the array
    @try {
        [resourcesURLs addObject:localURL];
    }
    @catch (NSException *exception) {

        NSLog(@"Exception adding URL to array of resourceURLs:%@",exception);

        //[self showAlertWithTitle:@"Resource URL" andMessage:exception.description andStyle:NSCriticalAlertStyle];

    }



}];


return resourcesURLs;

}

Функция [attach writeTo: (URL)] выдает ошибку в журнале консоли:

SandboxViolation: Evernote(20296) deny file-write-create /private/var/folders/h8/1q71ktcd6fv_rbcd9ygkv6c80000gn/T/com.test.TestEvernoteBridge/example.pdf
Violation:       deny file-write-create /private/var/folders/h8/1q71ktcd6fv_rbcd9ygkv6c80000gn/T/com.test.TestEvernoteBridge/example.pdf
Process:         Evernote [20296]

Что пробовал: - проверял на El Capitan - все нормально. - попытался изменить теги файла прав со строки на массив и добавить туда исключение com.evernote.Evernote. - попытался добавить разрешение на выполнение сценариев - Evernote sdef не поддерживает его. - создать новый проект с нуля, чтобы проверить любые ошибки обновления - все равно. - удалено право на песочницу - проблема остается. - удалить исключение безопасности - я не получаю список заметок (что является правильным поведением). - попытался разрешить запись в папку «Загрузки», добавив еще одно исключение - проблема остается.

Я не могу понять, почему он не работает и как получить данные вложения к заметкам Evernote. Я полагаю, это связано с некоторыми механизмами защиты изолированного приложения NSTemporaryDirectory. Я здесь что-то делаю неправильно, и мне нужен совет.

Вот тестовый проект - Тестовый проект

Заранее спасибо.


person ilia510    schedule 24.12.2016    source источник


Ответы (1)


Apple дала ответ на мой отчет об ошибке - буквально: «Дубликат 29717097 (закрыт)».

Я не вижу отчета 29717097 (версия ПО с исправлением), но он все еще не работает.

--- ОБНОВЛЕНИЕ 08.04.2017 ----

Недавнее обновление macOS Sierra 10.12.4 решило проблему.

person ilia510    schedule 15.02.2017