Я хочу создать URI (или схема URL) поддержка в моем приложении.
Я делаю a LSSetDefaultHandlerForURLScheme()
в моем + (void)initialize
и я setted определенные схемы URL также в моем info.plist
. Таким образом, у меня есть схемы URL без Apple Script
или Apple Events
.
Когда я звоню myScheme:
в моем любимом браузере система активирует мое приложение.
Проблема, как обработать схемы, когда их называют. Или лучше сказал: Как может я определять то, что мое приложение должно сделать, когда myScheme:
назван.
Существует ли специальный метод, который я должен реализовать, или я должен зарегистрировать тот где-нибудь?
Поскольку вы упоминаете AppleScript, я полагаю, что вы работаете на Mac OS X.
Простой способ регистрации и использования пользовательской схемы URL - это определить схему в вашем .plist:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>URLHandlerTestApp</string>
<key>CFBundleURLSchemes</key>
<array>
<string>urlHandlerTestApp</string>
</array>
</dict>
</array>
Чтобы зарегистрировать схему, поместите это в инициализацию AppDelegate:
[[NSAppleEventManager sharedAppleEventManager]
setEventHandler:self
andSelector:@selector(handleURLEvent:withReplyEvent:)
forEventClass:kInternetEventClass
andEventID:kAEGetURL];
Всякий раз, когда ваше приложение активируется по схеме URL, вызывается определённый селектор.
Клубок для метода обработки событий, который показывает, как получить URL-строку:
- (void)handleURLEvent:(NSAppleEventDescriptor*)event
withReplyEvent:(NSAppleEventDescriptor*)replyEvent
{
NSString* url = [[event paramDescriptorForKeyword:keyDirectObject]
stringValue];
NSLog(@"%@", url);
}
Документация Apple: Установка обработчика Get URL
Обновление.
Я только что заметил проблему для песочницы приложений, которые устанавливают обработчик событий в приложениеDidFinishLaunching:
. При включенной песочнице метод обработчика не вызывается при запуске приложения путем нажатия на URL, который использует пользовательскую схему.
Установив обработчик немного раньше, в applicationWillFinishLaunching:
, метод получает вызов, как и ожидалось:
- (void)applicationWillFinishLaunching:(NSNotification *)aNotification
{
[[NSAppleEventManager sharedAppleEventManager]
setEventHandler:self
andSelector:@selector(handleURLEvent:withReplyEvent:)
forEventClass:kInternetEventClass
andEventID:kAEGetURL];
}
- (void)handleURLEvent:(NSAppleEventDescriptor*)event
withReplyEvent:(NSAppleEventDescriptor*)replyEvent
{
NSString* url = [[event paramDescriptorForKeyword:keyDirectObject]
stringValue];
NSLog(@"%@", url);
}
На iPhone, самый простой способ обработки URL-схема активации является, для реализации UIApplicationDelegate's application:handleOpenURL:
- Документация
Проблема в том, как работать со схемами, когда они вызываются.
В этом и заключается суть событий Apple. Когда служба запуска хочет, чтобы ваше приложение, чтобы открыть URL, он посылает ваше приложение событие kInternetEventClass
/kAEGetURL
.
Руководство по сценариям какао использует эту самую задачу в качестве примера установки обработчика событий.
.