Мне нужно получить список приложений, совместимых с определенным форматом файла (так же, как отображается в «Открыть с помощью» в Finder для определенного файла).
Сначала попробовал функцию "LSCopyAllRoleHandlersForContentType", но взамен не все приложения (часто совсем пустой список). Программы появляются в этом списке только в том случае, если хотя бы раз в Finder сделать их форматом файла по умолчанию.
Затем я попытался получить информацию о форматах ассоциаций файлов из Info.plist приложений (используя ключ «CFBundleDocumentTypes»). Но, например, для «png» я получаю только браузеры и никаких приложений, таких как Sketch, Skitch, Photoshop и т. Д.
Может быть, я что-то упустил... Заранее спасибо.
LSCopyAllRoleHandlersForContentType()
должно работать. Какую маску ролей вы проходите? Вы пробовалиLSCopyApplicationURLsForURL()
? - person Ken Thomases   schedule 11.09.2016LSCopyAllRoleHandlersForContentType("public.html" as CFString, LSRolesMask.all
) . Я попробовалLSCopyApplicationURLsForURL()
, но получил ноль (возможно, я неправильно его использую).let url = NSURL.fileURL(withPath: "file:///Users/xxx/Desktop/public.html") let CFUrl = url as CFURL print(LSCopyApplicationURLsForURL(CFUrl,LSRolesMask.all)?.takeRetainedValue()
В первую очередь меня интересовал вариант формата файла. - person Toronadoo   schedule 11.09.2016LSCopyAllRoleHandlersForContentType()
возвращает только приложения, которые конкретно объявляют этот тип контента, аLSCopyApplicationURLsForURL()
возвращает приложения, которые объявляют этот тип и типы, которым он соответствует. Вы можете вручную использоватьUTTypeCopyDeclaration()
и проверить значениеkUTTypeConformsToKey
, чтобы пройти по цепочке. Кажется, вам следует остановиться наpublic.data
,public.content
иpublic.item
, так как они не добавляют приложения в списки Finder. - person Ken Thomases   schedule 11.09.2016