You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:在Mac上为Cocoa/Qt应用实现自定义URL协议

macOS下QtWidgets实现浏览器唤起应用的可行方案

1. 配置Info.plist

在项目的Info.plist中添加URL协议配置,示例代码如下:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>com.yourcompany.yourapp</string> <!-- 替换为你的应用唯一标识 -->
        <key>CFBundleURLSchemes</key>
        <array>
            <string>yourapp</string> <!-- 自定义唤起协议,比如Teams的msteams -->
        </array>
    </dict>
</array>

Qt Creator项目可直接编辑Info.plist文件,或在项目设置的Deployment > Info.plist面板中添加对应键值对。

2. 实现URL唤起事件处理

由于是C++/Objective-C混合开发,需通过Objective-C监听macOS的URL唤起事件,并与Qt逻辑交互:

2.1 创建Objective-C事件处理类

新建AppDelegate.h:

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>
@end

新建AppDelegate.mm(用.mm后缀支持Objective-C++):

#import "AppDelegate.h"
#include <QApplication>
#include <QUrl>
#include <QEvent>

@implementation AppDelegate

- (BOOL)application:(NSApplication *)application openURLs:(NSArray<NSURL *> *)urls {
    // 将NSURL转换为Qt可处理的QUrl,传递给C++逻辑
    for (NSURL *url in urls) {
        QString qUrlStr = QString::fromNSString([url absoluteString]);
        QUrl qUrl(qUrlStr);
        // 示例:发送自定义事件给Qt应用,在主窗口中处理
        QCoreApplication::postEvent(QCoreApplication::instance(), new QEvent(QEvent::User));
        // 也可直接调用你的C++业务方法处理链接参数
    }
    return YES;
}

@end

2.2 在Qt主函数中关联AppDelegate

修改main.cpp为main.mm(确保编译支持Objective-C++):

#include <QApplication>
#include "MainWindow.h"
#import "AppDelegate.h"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 绑定macOS应用代理,监听唤起事件
    AppDelegate *delegate = [[AppDelegate alloc] init];
    [NSApplication sharedApplication].delegate = delegate;

    MainWindow w;
    w.show();

    return app.exec();
}

3. 编译与测试

  • 确保项目构建设置中开启Objective-C++支持(Qt Creator可在Compiler选项中调整)
  • 打包为.app后运行,或用终端命令测试:open yourapp://test?param=123
  • 应用未运行时会启动并触发事件;已运行时直接触发openURLs方法

常见问题排查

  • 自定义协议名不要与系统已有协议冲突(如http、https)
  • 不要直接用Qt Creator调试版本测试,需打包或用open命令触发
  • 检查AppDelegate是否正确绑定到NSApplication,确保application:openURLs:方法无语法错误

内容的提问来源于stack exchange,提问作者RED SOFT ADAIR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:40:01