Я написал приложение на Qt для macOS и Windows. Теперь мы хотим общаться с этим приложением из браузера, используя специальные протоколы. Поскольку добавить это в Qt кажется невозможным, я попытался создать вспомогательное приложение Cocoa, которое просто получает сообщение, созданное в браузере, из macOS, используя специальный протокол. До сих пор это работало и было просто.
Но мне не удается заставить его открыть документ в моем (отдельном Qt) приложении.
Испытание 1:
void launchApplicationBundleWithArguments(NSString *bundleIdentifier, NSString *executablePath, NSArray<NSString *> *arguments)
{
NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
NSURL *url = [workspace URLForApplicationWithBundleIdentifier:bundleIdentifier];
if (url) {
NSError *error = nil;
NSDictionary *configuration = @{NSWorkspaceLaunchConfigurationArguments: launchArguments};
if (![workspace launchApplicationAtURL:url options:NSWorkspaceLaunchDefault configuration:configuration error:&error]) {
NSLog(@"Error launching application: %@", error);
}
} else {
NSLog(@"Application bundle with identifier %@ not found", bundleIdentifier);
}
}
Это запускает мое приложение, но не отправляет путь к файлу (хранящийся в аргументах) в командную строку моего основного приложения. Об ошибках не сообщается.
Испытание 2:
NSWorkspaceOpenConfiguration* configuration = [NSWorkspaceOpenConfiguration new];
[configuration setArguments: launchArguments];
[configuration setPromptsUserIfNeeded: YES];
[workspace openApplicationAtURL: [NSURL fileURLWithPath: executablePath] configuration: configuration completionHandler:^(NSRunningApplication* app, NSError* error) {
if (error) {
NSLog(@"Failed to run the app: %@", error.localizedDescription);
}
}];
Это не удается: появляется окно сообщения о том, что мое вспомогательное приложение не имеет достаточных прав доступа для запуска другого приложения.
Как это может быть сделано?
@JWWalker Я не могу сказать. Как мне это узнать?
Обычно вы знаете, находится ли оно в песочнице, потому что вы задали этот параметр при создании приложения. Но также можно отобразить столбец в утилите «Монитор активности», чтобы увидеть, какие запущенные приложения находятся в «песочнице».
Извините за задержку - сейчас я проверил Монитор активности - и отчеты приложений НЕ помещены в песочницу. Я могу успешно запустить приложение с терминала с параметрами. Есть идеи?
Здесь есть два приложения, одно запускается, другое запускает. Какой из них, вы говорите, не находится в песочнице?
Вспомогательное приложение действительно было помещено в песочницу! Очевидно, это настройка по умолчанию! В этом была проблема. Теперь работайте как положено. @JWWalker Большое спасибо.
@JWWalker: Пожалуйста, ответьте на этот вопрос, чтобы я мог его принять.





Согласно документации свойства arguments класса NSWorkspaceOpenConfiguration, изолированное приложение не может передавать аргументы другому приложению, которое оно запускает. Поэтому убедитесь, что ваше вспомогательное приложение не изолировано в песочнице.
Ваши приложения находятся в песочнице? В документации к свойству
argumentsNSWorkspaceOpenConfigurationговорится: «Если вызывающий процесс находится в песочнице, система игнорирует значение этого свойства».