Я настроил простой обработчик событий, как уже упоминалось здесь, но похоже, что селектор не вызывается. Я поместил код в свой класс AppDelegate и подключил делегата в IB. Пытался вставить некоторые NSLog() и точки останова в селектор, который, как я ожидаю, будет вызван, но ни один из них не попал. Схема URL работает, поскольку запускает мое приложение, но после этого ничего не делает. Кто-нибудь может подсказать, как решить эту проблему? Спасибо!
Как устранить неполадки в моей пользовательской схеме URL?
Ответы (4)
Ну, я не могу не заметить, что ваш -init
метод объявлен неверно. Если должен иметь возвращаемый тип id
и иметь return self;
в конце.
- (id)init
{
self = [super init];
if (self) {
[[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(getUrl:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
}
return self;
}
Благодаря этим исправлениям я смог вставить эти две подпрограммы в тестовый класс AppController и заставить его распечатать URL-адреса (с пользовательской схемой), которые я ввел в Safari. Я бы поставил точку останова на этот метод -init и прошелся по нему, чтобы быть абсолютно уверенным, что метод -setEventHandler: вызывается.
Большой вопрос: где вы вызываете -setEventHandler NSAppleEventManager:...? Вам нужно вызвать это до того, как ваше приложение завершит запуск, если вы хотите перехватить URL-адрес, который запустил ваше приложение. Если ваш делегат приложения создан в вашем MainMenu.nib, то его методы -init или -awakeFromNib будут работать, но, например, -applicationDidFinishLaunching: не будет.
Кроме того, убедитесь, что селектор, который вы предоставляете для -setEventHandler:, точно совпадает с именем вашего метода, обращая особое внимание на использование заглавных букв и правильное количество двоеточий.
Очевидно, что если бы вы разместили соответствующий код делегата вашего приложения, это было бы очень полезно.
Спасибо за предложения. Я перепроверил эти вещи. Я уверен, что это какая-то ошибка новичка, но я был бы признателен, если бы кто-нибудь посмотрел код. (Биты URL-адреса хранятся в info.plist.) Прямо сейчас я просто пытаюсь убедиться, что он работает, прежде чем пытаться что-либо сделать с URL-адресом.
- (void)init{
self = [super init];
if(self){
[[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(getUrl:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
}
}
- (void)getUrl:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
{
NSString *url = [[event paramDescriptorForKeyword:keyDirectObject] stringValue];
NSLog(url);
// now you can create an NSURL and grab the necessary parts
}
Ошибка новичка №2: Не установил класс делегата моего приложения в IB. Исправление этого и метода инициализации, как указано выше, заставило меня двигаться дальше. Гррр...