如何解决我的自定义URL方案?

时间:2008-12-03 16:04:03

标签: objective-c cocoa appleevents

我设置了一个简单的事件处理程序,如here所述,但似乎没有调用选择器。我把代码放在我的AppDelegate类中,并在IB中连接代理。尝试在我希望被调用的选择器中放入一些NSLog()和断点,但没有一个被击中。 URL方案的工作原理是它启动我的应用程序,但之后它没有做任何事情。任何人都可以建议如何解决这个问题?谢谢!

4 个答案:

答案 0 :(得分:2)

好吧,我不禁注意到你的-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类中,并打印出我在Safari中输入的URL(使用自定义方案)。我在-init方法上放了一个断点并逐步执行它以确保调用-setEventHandler:方法。

答案 1 :(得分:0)

最大的问题是:你在哪里调用NSAppleEventManager的-setEventHandler:...?如果要捕获启动应用程序的URL,则需要在应用程序完成启动之前调用此方法。如果您的应用程序委托是在MainMenu.nib中创建的,那么它的-init或-awakeFromNib方法都可以工作,但是,例如,-applicationDidFinishLaunching:不会。

另外,请确保您提供给-setEventHandler的选择器与您的方法名称完全相同,特别注意大小写和正确的冒号数。

显然,如果您发布了应用代理的相关代码,那将非常有用。

答案 2 :(得分:0)

感谢您的建议。我仔细检查了那些东西。我确定这是一个新手的错误,但我很欣赏任何看过代码的人。 (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
}

答案 3 :(得分:0)

新手的错误#2:没有在IB中设置我的app委托的类。修复这个和上面的init方法让我走了。哎呀...