I want to launch an application with NSWorkspaceMBS with the “NSWorkspaceLaunchAndHide” option but I encounter various problems:
The examples offered on the NSWorkspaceMBS page only work with third-party apps. Apple Apps (all) display this error message:
“Error: Unable to launch the application ‘Address Book.app’ because it was not found.”
How to get past it? Is there a solution ?
I tried:
NSWorkspaceMBS.launchApplicationAtFile(file as folderitem
and NSWorkspaceMBS.launchApplicationAtURL(URL as string,
with dim URL as String = ("file:///Applications/TextEdit.app")
Only the command:
NSWorkspaceMBS.launchApplication(appname as string) as boolean
works with Apple apps (TextEdit, for example, launches well) but it does not have the “Options” parameter!).
Does anyone have a solution? (or an explanation)
Thank you, @Christian_Schmitz, it works but I need to do 2 routines:
If the user launches an Apple app:
dim file as String = (“file:///” + “/System/Applications/TextEdit.app”) /
If it’s a third-party app:
dim file as String = (“file:///” + “Applications/Firefox.app”)
How do I distinguish an Apple app from a non-Apple app? I will have to test the BundleID of each App…
There’s also another method in NSWorkspace to get the path of an application by its bundleID. that would take care of situations where a user had an app in an uncommon location as well.
There is no need for the application path as Greg already mentioned.
Based on this discussion you can just use the CFBundleIdentifier:
Public Function LaunchAppFromBundleID(bundID as String) As Boolean
Declare Function NSClassFromString Lib "Foundation" ( className As CFStringRef ) As Ptr
Declare Function sharedWorkspace Lib "AppKit" Selector "sharedWorkspace" ( ref As Ptr ) As Ptr
Declare Function URLForApplicationWithBundleIdentifier Lib "AppKit" Selector "URLForApplicationWithBundleIdentifier:" ( NSWorkspace As Ptr , bundleIdentifier As CFStringRef ) As Ptr
Declare Function absoluteString Lib "AppKit" Selector "absoluteString" ( NSURLRef As Ptr ) As CFStringRef
Declare Function launchApp Lib "AppKit" Selector "launchAppWithBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifier:"_
( NSWorkspaceRef As Ptr, bundleIdentifier As CFStringRef, options As Ptr, descriptor As Ptr, identifier As Integer ) As Boolean
Dim URLRef As Ptr = URLForApplicationWithBundleIdentifier( sharedWorkspace( NSClassFromString( "NSWorkspace" ) ), bundID)
If URLRef <> Nil Then
Dim f As folderitem = GetFolderItem( absoluteString( URLRef ), folderItem.pathTypeURL )
If f <> Nil And f.exists Then
Call launchApp( sharedWorkspace( NSClassFromString( "NSWorkspace" ) ), "com.apple.TextEdit", Nil, Nil, 0 )
Return True
End
End
Return False
End Function