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

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

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

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

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

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

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


person jeanpaul62    schedule 02.05.2014    source источник
comment
Можете ли вы опубликовать то, что у вас есть в файле Info.plist?   -  person zneak    schedule 03.05.2014
comment
Да, я разместил свой info.plist   -  person jeanpaul62    schedule 03.05.2014


Ответы (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" в терминале.

person zneak    schedule 03.05.2014
comment
Что ж, я как и вы создал свежий проект, и теперь он работает. Я просто попытаюсь скопировать и вставить свой код из старого проекта и посмотреть, ведет ли он себя так, как должен. - person jeanpaul62; 09.05.2014
comment
Немного странно, что вы не смогли заставить его работать с вашим другим проектом. Удачи в остальном! - person zneak; 09.05.2014

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

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

person AriX    schedule 09.05.2014
comment
Да, как я уже сказал, если мое приложение уже запущено, то функция getUrl вызывается корректно, а значит, обработчиком по умолчанию является мое приложение. И я только что установил RCDefaultApp, чтобы проверить это. - person jeanpaul62; 09.05.2014
comment
А, понял. Хотя не обязательно - я видел поведение, при котором запущенные приложения имеют приоритет над приложением по умолчанию. Не уверен, в каком случае это происходит, но это может быть связано с объявленным обработчиком роли или чем-то еще. - person AriX; 10.05.2014