Схема URL - Qt и mac - PullRequest
       4

Схема URL - Qt и mac

7 голосов
/ 03 июля 2011

Я пытаюсь реализовать собственную схему 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

Приведенный выше код работает, если приложение запущено, но если URL-адрес вызывается и приложение завершается, событие не перехватывается. Я думаю, что это потому, что это: NSApplicationDidFinishLaunchingNotification. Изменение его на NSApplicationWillFinishLaunchingNotification приводит к тому, что перехватываются не события. Может быть, Qt справится с этим раньше меня, но я не могу найти обходной путь для этой проблемы.

Ответы [ 2 ]

5 голосов
/ 30 августа 2011

Я также пытался заставить мое приложение на базе Qt обрабатывать пользовательскую схему URL на Mac и пошел по тому же пути, что и оригинальный плакат.Оказывается, Qt4 уже поддерживает URL-события на Mac, и нет необходимости писать код Objective-C для их получения.На самом деле это причина того, что вы не получили никаких событий URL, когда вы устанавливаете обработчик событий в ответ на NSApplicationWillFinishLaunchingNotification: Qt впоследствии регистрирует свой собственный обработчик.Приложение Qt получит FileOpenEvent.Обратите внимание, что это экземпляр QApplication, который получает событие.Вы можете поймать его, сделав свое приложение подклассом QApplication или установив фильтр событий в стандартном QApplication.Я выбрал этот второй подход.

Вот метод eventFilter моего пользовательского класса фильтра событий, FileOpenEventFilter.Он просто испускает сигнал urlOpened, когда событие содержит непустой URL.Он также сохраняет последний открытый URL-адрес на тот случай, если мое главное окно не было полностью инициализировано при получении события (что происходит в моем приложении, когда оно еще не запущено при щелчке по пользовательскому URL-адресу.)

1 голос
/ 03 июля 2011

Я регистрирую свой обработчик в методе applicationWillFinishLaunching: моего делегата приложения, и я не пропускаю ни одного события.Возможно, вы слишком поздно инициализируете свой объект EventHandler, чтобы получить это уведомление.Если вы хотите сохранить его как отдельный класс, это нормально, но вы должны создать свой объект и зарегистрировать его с помощью NSAppleEventManager в методе applicationWillFinishLaunching: вашего делегата приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...