Сбой при использовании диалогового окна сохранения Mac

#objective-c #exception #macos-catalina #xcode12 #save-as

Вопрос:

У наших пользователей возникает исключение со следующим сценарием:

  1. Сохраните файл под произвольным именем, например «test1».
  2. Откройте диалоговое окно сохранить, чтобы сохранить снова (по умолчанию в диалоговом окне теперь предлагается «тест1»).
  3. Нажмите «Сохранить», а затем «Заменить», чтобы перезаписать существующий файл.

Результат: исключение.

Если непосредственно перед шагом 3 пользователь нажимает на файл в окне поиска диалогового окна (имя «test1» остается) — исключений нет.

Я нашел упоминание об этой проблеме здесь и попытался воспользоваться данным советом — однако это не помогло.

Вот сокращение моего кода:

 #define kMaxPathLength 1023
[self setDialogResult:[dialog runModal]];

if ([self dialogResult] == NSOKButton)
{
    char pathBuffer[kMaxPathLength];
    @try{
        NSString* pathcopy = [[dialog URL] path];  // <== Causes the exception
        [pathcopy getCString:pathBuffer maxLength:kMaxPathLength encoding: NSUTF8StringEncoding];
    }
    @catch(NSException* e){
        <breakpoint>
    }
}
 

Строка с замечанием вызывает исключение:

 ROSP: sandbox extension failure: nil result or wrong class type ((null)) for finalURL
 

Примечание: упомянутая отмеченная строка и строка ниже представляют собой разбивку использованного исходного утверждения:

 [[[dialog URL] path] getCString:pathBuffer maxLength:kMaxPathLength encoding:NSUTF8StringEncoding];
 

В котором также происходит исключение.

Используя Xcode 12, Каталина.

Есть какие-нибудь советы, как избежать исключения?

Комментарии:

1. Можно ли воспроизвести проблему в небольшом тестовом проекте?

Ответ №1:

Эта ошибка была в конечном итоге решена (фактически устранена) путем явного указания расширения файла в предлагаемом имени для диалогового окна Сохранить как. Ошибка возникает при указании только базового имени (без расширения).