LSGetApplicationForInfo is gone, but its replacements do not provide the same functionality
| Originator: | jtbandes | ||
| Number: | rdar://21698360 | Date Originated: | 7/6/2015 |
| Status: | Open | Resolved: | |
| Product: | OS X SDK | Product Version: | 10.10.4 (14E46) |
| Classification: | Reproducible: |
Summary:
LSGetApplicationForInfo is deprecated in 10.10 and missing from headers in the 10.11 SDK. The deprecation notice says "Use LSCopyDefaultApplicationURLForContentType instead."
However, the replacement APIs (and all other LaunchServices APIs) return different results when determining the application for a given content type.
Steps to Reproduce:
1. Obtain a Keynote .key presentation and a .m4v video.
2. Download VLC and make sure it's your default player for m4v files.
3. Run the following code in a Swift playground (Xcode 6):
import AppKit
func getApplicationForInfo(inType: Int, inCreator: Int, inExtension: String, inRoleMask: LSRolesMask) -> NSURL?
{
var val: Unmanaged<CFURL>?
withUnsafeMutablePointer(&val) { LSGetApplicationForInfo(OSType(inType), OSType(inCreator), inExtension, inRoleMask, nil, $0) }
return val?.takeRetainedValue()
}
NSWorkspace.sharedWorkspace().URLForApplicationToOpenURL(NSURL(fileURLWithPath: "/path/to/existing/file.key")!) // VLC
getApplicationForInfo(kLSUnknownType, kLSUnknownCreator, "key", kLSRolesAll) // Keynote
LSCopyDefaultRoleHandlerForContentType( "com.apple.iwork.keynote.key", kLSRolesAll)?.takeRetainedValue() // Keynote
LSCopyDefaultApplicationURLForContentType("com.apple.iwork.keynote.key", kLSRolesAll, nil)?.takeRetainedValue() // Keynote
getApplicationForInfo(kLSUnknownType, kLSUnknownCreator, "key", kLSRolesViewer) // Preview
LSCopyDefaultRoleHandlerForContentType( "com.apple.iwork.keynote.key", kLSRolesViewer)?.takeRetainedValue() // Preview
LSCopyDefaultApplicationURLForContentType("com.apple.iwork.keynote.key", kLSRolesViewer, nil)?.takeRetainedValue() // Preview
NSWorkspace.sharedWorkspace().URLForApplicationToOpenURL(NSURL(fileURLWithPath: "/path/to/existing/file.m4v")!) // VLC
getApplicationForInfo(kLSUnknownType, kLSUnknownCreator, "m4v", kLSRolesAll) // VLC
LSCopyDefaultRoleHandlerForContentType( "com.apple.m4v-video", kLSRolesAll)?.takeRetainedValue() // com.apple.system-library !??!
LSCopyDefaultApplicationURLForContentType("com.apple.m4v-video", kLSRolesAll, nil)?.takeRetainedValue() // CoreMedia.mdimporter !??!
getApplicationForInfo(kLSUnknownType, kLSUnknownCreator, "m4v", kLSRolesViewer) // VLC
LSCopyDefaultRoleHandlerForContentType( "com.apple.m4v-video", kLSRolesViewer)?.takeRetainedValue() // nil !??!
LSCopyDefaultApplicationURLForContentType("com.apple.m4v-video", kLSRolesViewer, nil)?.takeRetainedValue() // VLC
Expected Results:
Goal: determine which application would be used to open a given file type, if the user double-clicked it from Finder.
LSGetApplicationForInfo does this, but its replacements do not. The desired output for "key" or "com.apple.iwork.keynote.key" would be Keynote.app itself, and for "m4v" or "com.apple.m4v-video" we would expect to get VLC.app.
Actual Results:
LSCopyDefaultApplicationURLForContentType :: com.apple.m4v-video :: kLSRolesAll :: returns /System/Library/Spotlight/CoreMedia.mdimporter?!
LSCopyDefaultApplicationURLForContentType :: com.apple.m4v-video :: kLSRolesViewer :: returns VLC as expected
So I thought maybe kLSRolesViewer is the correct value to use, however,
LSCopyDefaultApplicationURLForContentType :: com.apple.iwork.keynote.key :: kLSRolesAll :: returns Keynote.app as expected
LSCopyDefaultApplicationURLForContentType :: com.apple.iwork.keynote.key :: kLSRolesViewer :: returns Preview.app?!
Note that LSCopyDefaultRoleHandlerForContentType also returns incorrect values as seen in the playground. It seems there is no alternative to LSGetApplicationForInfo.
Comments
Please note: Reports posted here will not necessarily be seen by Apple. All problems should be submitted at bugreport.apple.com before they are posted here. Please only post information for Radars that you have filed yourself, and please do not include Apple confidential information in your posts. Thank you!