Как получить список приложений, отображаемый в диалоговом окне Finder «Открыть в приложении» для целевого формата файла (или файла)?

Мне нужно получить список приложений, совместимых с определенным форматом файла (так же, как отображается в «Открыть с помощью» в Finder для определенного файла).

Сначала попробовал функцию "LSCopyAllRoleHandlersForContentType", но взамен не все приложения (часто совсем пустой список). Программы появляются в этом списке только в том случае, если хотя бы раз в Finder сделать их форматом файла по умолчанию.

Затем я попытался получить информацию о форматах ассоциаций файлов из Info.plist приложений (используя ключ «CFBundleDocumentTypes»). Но, например, для «png» я получаю только браузеры и никаких приложений, таких как Sketch, Skitch, Photoshop и т. Д.

Может быть, я что-то упустил... Заранее спасибо.


person Toronadoo    schedule 11.09.2016    source источник
comment
LSCopyAllRoleHandlersForContentType() должно работать. Какую маску ролей вы проходите? Вы пробовали LSCopyApplicationURLsForURL()?   -  person Ken Thomases    schedule 11.09.2016
comment
@KenThomases Маска ролей -Все (LSCopyAllRoleHandlersForContentType("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.2016
comment
Если вам нужно начать с типа, а не с файла этого типа, возможно, LSCopyAllRoleHandlersForContentType() возвращает только приложения, которые конкретно объявляют этот тип контента, а LSCopyApplicationURLsForURL() возвращает приложения, которые объявляют этот тип и типы, которым он соответствует. Вы можете вручную использовать UTTypeCopyDeclaration() и проверить значение kUTTypeConformsToKey, чтобы пройти по цепочке. Кажется, вам следует остановиться на public.data, public.content и public.item, так как они не добавляют приложения в списки Finder.   -  person Ken Thomases    schedule 11.09.2016


Ответы (1)


Вероятно, потому что ваш путь был недействительным:

// don't include file://
let url = NSURL.fileURL(withPath: "file:///Users/xxx/Desktop/public.html")

Это работает для меня:

let url = URL(fileURLWithPath: "/Users/xxx/Desktop/public.html") as CFURL

if let applicationURLs = LSCopyApplicationURLsForURL(url, .all)?.takeRetainedValue() {
    print(applicationURLs)
}
person Code Different    schedule 11.09.2016