(OSX)当用户在浏览器中单击电子邮件链接时,操作系统如何将电子邮件地址传送到默认邮件应用程序?

时间:2013-04-14 21:54:29

标签: macos email hyperlink client

我父亲很恼火,当他点击电子邮件超链接时,OSX会尝试打开Mail,这是他从未使用过的,也不想学习。他希望只打开一个浏览器窗口到他提供的ISP提供的电子邮件服务(bleh)。

我正在尝试编写一个基本上处理该交互的程序,但我无法弄清楚超链接中的电子邮件地址是如何传递给应用程序的。基本上......当我点击foo@example.com的mailto超链接时,操作系统如何告诉Mail.app(或任何默认客户端)编写一封新电子邮件到foo@example.com?

1 个答案:

答案 0 :(得分:1)

首先,Mail.app被动地告诉Launch Services它通过在Info.plist文件中包含以下内容来处理“mailto”URL方案:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>Email Address URL</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>mailto</string>
        </array>
        <key>LSIsAppleDefaultForScheme</key>
        <true/>
    </dict>
    ...
</array>

接下来,它为kInternetEventClass / kAEGetURL Apple事件设置处理程序。在Cocoa中,它看起来像:

NSAppleEventManager* appleEventManager = [NSAppleEventManager sharedAppleEventManager];
[appleEventManager setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];

您可以像这样实现处理程序方法:

- (BOOL)handleGetURLEvent:(NSAppleEventDescriptor*)event withReplyEvent:(NSAppleEventDescriptor*)replyEvent
{
    NSAppleEventDescriptor* directObjectDescriptor  = [event paramDescriptorForKeyword:keyDirectObject];
    NSString*               urlString               = [directObjectDescriptor stringValue];
    NSURL*                  url                     = [NSURL URLWithString:urlString];
    // ... do something with url ...
}

对于“mailto”URL,NSURL的大部分解析行为都无效,因为URL不符合RFC 1808(资源说明符不以“//”开头)。您实际上只能使用-resourceSpecifier方法获取方案(mailto)和资源说明符。某些mailto URL可能具有类似查询的语法,例如“?subject = Some%20subject%20text”,但NSURL将无法帮助您区分它们。所以,你需要手动完成。 (您可以考虑通过在资源说明符的前面注入“//”并使用NSURL解析它来构造伪造的URL。)