Mac OSX Mavericks处理应用程序的CFBundleURLName"自定义URL"启动方式有没有改变?

Mik*_*ver 5 url macos custom-url osx-mavericks

我在任何OSX浏览器中创建了一个从自定义URL启动的应用程序.通过向应用程序的plist添加标准CFBundleURLName条目,这可以正常工作.

我的应用程序通过解析自定义URL上的一些参数然后对它们做出反应来阅读.

例如,使用自定义网址:

foobar://param1/param2/param3

在浏览器中单击上面的URL时,OSX会启动我的应用程序并将实际的自定义URL本身作为应用程序的第一个参数传递.因此,在应用程序中,我可以读取第一个arg并获取打开应用程序的URL,并解析它我需要的参数.

这在OSX 10.5-10.8中运行良好,但在10.9 Mavericks中它的工作方式略有不同.即,如果应用程序尚未运行,它仍会启动应用程序,但不会将自定义URL作为第一个参数传递 - 因此应用程序认为它刚刚由用户手动启动(例如从启动板选择)而不是直接从一个浏览器.

奇怪的是,如果应用程序已经打开,那么单击自定义URL会将url字符串发送到应用程序作为第一个参数,应用程序中的功能按预期发生.

我已经使用我的应用程序的新旧版本在10.6-> 10.9上测试了这一点,并且都表现出相同的行为.在10.9 Mavericks之前的版本首次发布时都可以正常工作,但是在10.9中,他们没有将url作为第一个arg传递,但是在第二次单击已经运行时工作.

如果有人能对此有所了解,我将非常感激.

Mar*_*age 1

您在哪里设置 URL 处理程序?它需要尽早发生。如果您当前有它applicationDidFinishLaunching,请尝试将其移至applicationWillFinishLaunching.

例如,以下内容对我有用,即使在我在 Safari 中打开 URL 之前应用程序尚未运行,也会在启动时记录 URL。当我将 WillFinishLaunching 更改为 DidFinishLaunching 时,我完全看到了您所描述的行为。

@implementation AppDelegate

- (void)applicationWillFinishLaunching:(NSNotification *)notification
{
    NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager];
    [appleEventManager setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
}

- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
{
    NSAppleEventDescriptor *obj = [event descriptorForKeyword:keyDirectObject];
    DescType type = [obj descriptorType];
    if (type == typeChar) {
        NSData *data = [obj data];
        if (data) {
            NSString *urlString = [[NSString  alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSURL *url = [NSURL URLWithString:urlString];
            NSLog(@"url: %@", url);
        }
    }
}

@end
Run Code Online (Sandbox Code Playgroud)