我用 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);
}
}];
此操作失败,并显示一个消息框,提示我的帮助应用程序没有足够的访问权限来启动其他应用程序。
这怎么办?
根据
arguments
类的 NSWorkspaceOpenConfiguration
属性的文档,沙盒应用程序无法将参数传递给它正在启动的另一个应用程序。因此,请确保您的帮助应用程序没有被沙箱化。