Поймать зарегистрированную схему URL и запустить приложение

Мне удалось запустить свое приложение всякий раз, когда URL-схема вызывается через браузер, поместив эту схему в info.plist и добавив эти 2 строки:

NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager];
[appleEventManager setEventHandler:self andSelector:@selector(getUrl:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];

и правильно реализовать мою функцию getUrl.

Поэтому я попытался поместить две строки выше в моем appDelegates's applicationWillFinishLaunching, applicationDidFinishLaunching а также init, Но в трех случаях у меня один и тот же сценарий: если мое приложение уже запущено, то функция getUrl вызывается правильно, если приложение не запущено, getUrl никогда не вызывается.

Я нашел в других сообщениях ( Как работать со схемой URL по умолчанию и получить событие url в приложении, открытом в задаче c (Mac OSX)), но часто приходит предложение использовать applicationWillFinishLaunching, который не работал в моем случае.

Изменить: вот мой info.plist: http://pastebin.com/yM8zabvY

2 ответа

Решение

Я не уверен, где дела идут плохо для тебя. Я создал тестовый проект, в котором я просто вставил CFBundleURLTypes ключ из вашего Info.plist, и я использовал это в моем делегате приложения:

-(void)getUrl:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor*)reply
{
    NSLog(@"%@", event);
}

-(void)applicationWillFinishLaunching:(NSNotification *)aNotification
{
    // Register ourselves as a URL handler for this URL
    [[NSAppleEventManager sharedAppleEventManager]
     setEventHandler:self
     andSelector:@selector(getUrl:withReplyEvent:)
     forEventClass:kInternetEventClass
     andEventID:kAEGetURL];
}

И это работает так, как я ожидал. Я получаю сообщение журнала независимо от того, было ли приложение уже запущено или нет, когда я запускаю open "feed://test" в терминале.

Вы убедились, что ваше приложение является обработчиком по умолчанию для feed: схема?

Вы можете проверить схемы URL системы, используя RCDefaultApp или API Launch Services (LSCopyDefaultHandlerForURLScheme).

Другие вопросы по тегам