xcrun через NSTask: как получить возвращаемое значение в той же форме, что и в терминале? - PullRequest
0 голосов
/ 28 июня 2019

Я создаю приложение, которое автоматизирует нотариальное заверение моих приложений.

Я столкнулся со следующей проблемой:

Когда я использую NSTasks для выполнения таких команд, как xcrun altool и xcrun степлер , возвращаемое значение намного длиннее, чем то, что я получаю в Терминале.

Например, когда я запускаю степлер в Терминале, я получаю три строки вывода:

Processing: <app path>
Processing: <app path>
The staple and validate action worked!

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

    [2019-06-27 04:18:57 EDT] <main>  INFO: Logging level set to eXtreme
    [2019-06-27 04:18:57 EDT] <main>  INFO: Logging configured successfully.
    [2019-06-27 04:18:57 EDT] <main> DEBUG: Attempting refresh of configuration data from https://contentdelivery.itunes.apple.com/transporter/Defaults.properties
    [2019-06-27 04:18:57 EDT] <main> DEBUG: Configuration refresh successful.
etc.

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

Но в некоторых случаях NSTask возвращает ТОЛЬКО не относящиеся к делу записи журнала, о которых я упоминал выше - и, по-видимому, еще до того, как задача даже закончила выполняться.В частности, это происходит при запуске команды xcrun altool --notarize-app .Поэтому мое приложение не знает, как действовать, поскольку оно не получает подтверждения успешной загрузки.

Я использую NSTask синхронно со стандартной подпрограммой для получения вывода:

thePipe = [NSPipe pipe];
[task setStandardOutput:thePipe];
[task setStandardError:thePipe];

[task launch];
[task waitUntilExit];

NSFileHandle *fh = [thePipe fileHandleForReading];
NSString *result = [[[NSString alloc] initWithData:[fh availableData] encoding:NSASCIIStringEncoding] autorelease];

Я не припоминаю, чтобы когда-либо возникала такая проблема при использовании NSTask с другими командами.

Итак, мне интересно, что я что-то упустил?И если есть способ получить только соответствующее возвращаемое значение - просто так, как я получаю его в Терминале?

1 Ответ

0 голосов
/ 29 июня 2019

Я нашел ответ: -availableData проблема:

Состояние гонки NSTask с блоком ReadabilityHandler

Он просто не получилвсе данные.Как только я заменил его на -readDataOfLength: NSUIntegerMax , я получил весь вывод NSTask, который содержал информацию о статусе загрузки.

Это не совсем отвечает на мой вопрос о том, какполучить из NSTask точно такое же возвращаемое значение, которое я получаю в Терминале, но этот ответ устраняет проблему, которая заставила меня задать этот вопрос.

...