bir*_*her 7 url macos cocoa qt
我正在尝试为我的应用程序实现自定义URL方案.我为Info.plist添加了必要的行.在调用指定的url(例如:myapp://)后,应用程序启动.
如果我想处理URL,我发现了以下步骤:
@interface EventHandler : NSObject {
}
@end
@implementation EventHandler
- (id)init {
self = [super init];
if (self) {
NSLog(@"eventHandler::init");
NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self
selector:@selector(applicationDidFinishLaunching:)
// name:NSApplicationWillFinishLaunchingNotification
name:NSApplicationDidFinishLaunchingNotification
object:nil];
}
return self;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager];
[appleEventManager setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
}
- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
{
NSString* url = [[event paramDescriptorForKeyword:keyDirectObject] stringValue];
NSLog(@"%@", url);
}
@end
Run Code Online (Sandbox Code Playgroud)
如果应用程序正在运行,上面的代码正常工作,但如果调用URL并终止应用程序,则不会捕获该事件.我认为这是因为:NSApplicationDidFinishLaunchingNotification.将其更改为NSApplicationWillFinishLaunchingNotification会导致捕获到非事件.也许Qt在我之前处理它,但我找不到解决问题的方法.
我也试图让我的基于Qt的应用程序在Mac上处理自定义URL方案,并沿着与原始海报相同的路径.事实证明,Qt4已经支持Mac上的URL事件,并且不需要编写Objective-C代码来接收它们.事实上,当您为响应NSApplicationWillFinishLaunchingNotification而设置事件处理程序时,您没有收到任何URL事件:Qt之后注册了自己的处理程序.
当触发带有自定义方案的URL时,您的Qt应用程序将收到FileOpenEvent.请注意,它是接收事件的QApplication实例.您可以通过创建应用程序子类QApplication或在标准QApplication上安装事件过滤器来捕获它.我选择了第二种方法.
这是我的自定义事件过滤器类FileOpenEventFilter的eventFilter方法.当事件包含非空URL时,它只会发出信号urlOpened.它还保存了最后打开的URL,以防我的主窗口在事件到达时未完全初始化(当我的应用程序在单击自定义URL时尚未运行时会发生这种情况.)
bool FileOpenEventFilter::eventFilter(QObject* obj, QEvent* event)
{
if (event->type() == QEvent::FileOpen)
{
QFileOpenEvent* fileEvent = static_cast<QFileOpenEvent*>(event);
if (!fileEvent->url().isEmpty())
{
m_lastUrl = fileEvent->url().toString();
emit urlOpened(m_lastUrl);
}
else if (!fileEvent->file().isEmpty())
{
emit fileOpened(fileEvent->file());
}
return false;
}
else
{
// standard event processing
return QObject::eventFilter(obj, event);
}
}
Run Code Online (Sandbox Code Playgroud)