Как устранить неполадки в моей пользовательской схеме URL?

Я настроил простой обработчик событий, как уже упоминалось здесь, но похоже, что селектор не вызывается. Я поместил код в свой класс AppDelegate и подключил делегата в IB. Пытался вставить некоторые NSLog() и точки останова в селектор, который, как я ожидаю, будет вызван, но ни один из них не попал. Схема URL работает, поскольку запускает мое приложение, но после этого ничего не делает. Кто-нибудь может подсказать, как решить эту проблему? Спасибо!


person jxpx777    schedule 03.12.2008    source источник


Ответы (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: вызывается.

person Boaz Stuller    schedule 04.12.2008

Большой вопрос: где вы вызываете -setEventHandler NSAppleEventManager:...? Вам нужно вызвать это до того, как ваше приложение завершит запуск, если вы хотите перехватить URL-адрес, который запустил ваше приложение. Если ваш делегат приложения создан в вашем MainMenu.nib, то его методы -init или -awakeFromNib будут работать, но, например, -applicationDidFinishLaunching: не будет.

Кроме того, убедитесь, что селектор, который вы предоставляете для -setEventHandler:, точно совпадает с именем вашего метода, обращая особое внимание на использование заглавных букв и правильное количество двоеточий.

Очевидно, что если бы вы разместили соответствующий код делегата вашего приложения, это было бы очень полезно.

person Boaz Stuller    schedule 03.12.2008

Спасибо за предложения. Я перепроверил эти вещи. Я уверен, что это какая-то ошибка новичка, но я был бы признателен, если бы кто-нибудь посмотрел код. (Биты 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
}
person jxpx777    schedule 04.12.2008
comment
Я должен добавить, что я пытался переместить вызов метода в -awakeFromNib, но без особого удовольствия. - person jxpx777; 04.12.2008

Ошибка новичка №2: Не установил класс делегата моего приложения в IB. Исправление этого и метода инициализации, как указано выше, заставило меня двигаться дальше. Гррр...

person jxpx777    schedule 04.12.2008