我父亲很恼火,当他点击电子邮件超链接时,OSX会尝试打开Mail,这是他从未使用过的,也不想学习。他希望只打开一个浏览器窗口到他提供的ISP提供的电子邮件服务(bleh)。
我正在尝试编写一个基本上处理该交互的程序,但我无法弄清楚超链接中的电子邮件地址是如何传递给应用程序的。基本上......当我点击foo@example.com的mailto超链接时,操作系统如何告诉Mail.app(或任何默认客户端)编写一封新电子邮件到foo@example.com?
答案 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。)