How do you get the Bundle Identifier from an application's name in Cocoa?

The following method will return an application's Bundle Identifier for a named application:

- (NSString *) bundleIdentifierForApplicationName:(NSString *)appName
{
    NSWorkspace * workspace = [NSWorkspace sharedWorkspace];
    NSString * appPath = [workspace fullPathForApplication:appName];
    if (appPath) {
        NSBundle * appBundle = [NSBundle bundleWithPath:appPath];
        return [appBundle bundleIdentifier];
    }
    return nil; 
}

For Mail you can call the method like so:

NSString * appID = [self bundleIdentifierForApplicationName:@"Mail"];

appID now contains com.apple.mail

Swift 5.1

import AppKit

func bundleIdentifier(forAppName appName: String) -> String? {

    let workspace = NSWorkspace.shared
    let appPath = workspace.fullPath(forApplication: appName)
    if let appPath = appPath {
        let appBundle = Bundle(path: appPath)
        return appBundle?.bundleIdentifier
    }
    return nil
}

// For Mail you can call the method like so:

let appID = bundleIdentifier(forAppName: "Mail")

Deprecation

The fullPathForApplication: / fullPath(forApplication:) method has been deprecated in macOS 10.15 - it is unclear what the answer is going forward.

Tags:

Cocoa

Nsbundle