May 26, 2009

I needed a reliable way to find out a user’s default email client. After being fed up with monkey around with launchservice defaults and awk, I turned to XCode, and wrote this Foundation tool:

# GetHelper.m
# Return the helper app for a URL scheme
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
  if (argc < 2) {
    printf("Usage: GetHelper scheme");
    return 1;

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString * s = [NSString stringWithCString:argv[1]];

id helper;
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];

[defaults addSuiteNamed:@""];
NSArray * helpers = [defaults objectForKey:@"LSHandlers"];
NSEnumerator * helperEnum = [helpers objectEnumerator];

while (helper = [helperEnum nextObject]) {
  NSString * key = [helper objectForKey:@"LSHandlerURLScheme"];
  if ([key isEqualToString:s]) {
    printf([[helper objectForKey:@"LSHandlerRoleAll"] UTF8String]);

[pool drain];
return 0;


Which gives me:

./GetHelper mailto

It seems a bit overkill, but it works and eventually wasn’t all that hard to put together.