2016-09-11 8 views
2

특정 파일 형식과 호환되는 응용 프로그램 목록을 가져와야합니다 (특정 파일에 대해 Finder에서 연결 프로그램에 표시되는 것과 동일).Finder의 "응용 프로그램에서 열기"대화 상자에 표시되는 응용 프로그램 목록을 대상 파일 형식 (또는 파일)으로 가져 오는 방법은 무엇입니까?

처음에는 "LSCopyAllRoleHandlersForContentType"함수를 시도했지만 모든 응용 프로그램이 아닌 (완전히 빈 목록 인 경우도 있음). Finder에서 적어도 한 번만 파일 형식의 기본값으로 설정 한 경우에만이 목록에 프로그램이 나타납니다.

그런 다음 Info.plist 응용 프로그램 ("CFBundleDocumentTypes"키 사용)에서 파일 연결 형식에 대한 정보를 얻으려고했습니다. 하지만 예를 들어 "PNG"에 대한 나는 단지 브라우저를 얻을 & 스케치, Skitch, 포토샵 등 응용 프로그램이 없습니다.

아마 내가 누락 된 뭔가 ... 사전에 감사드립니다. 경로가 유효 아마 때문에

+0

'LSCopyAllRoleHandlersForContentType는()'작동합니다. 어떤 역할 마스크를 통과하고 있습니까? 당신은'LSCopyApplicationURLsForURL()'을 시도 했습니까? –

+0

@KenThomases 역할 LSCopyApplicationURLsForURL()'나'시도 . CFString, LSRolesMask.all')로 - 모든 ('LSCopyAllRoleHandlersForContentType ("public.html을"마스크하지만) 어쩌면 내가 잘못을 사용 (A 전무를 얻을. 'URL을 보자 = NSURL.fileURL (withPath : "파일 : ///Users/xxx/Desktop/public.html") 할 CFURL = URL로 CFURL 인쇄 (LSCopyApplicationURLsForURL (CFURL, LSRolesMask.all)? takeRetainedValue()' 먼저 파일 형식의 변형에 관심이 있습니다. – Toronadoo

+1

형식에서 시작해야하고 해당 형식의 파일이 아닌 형식으로 시작해야하는 경우 'LSCopyAllRoleHandlersForContentType()'은 해당 콘텐츠 형식을 구체적으로 선언하는 응용 프로그램 만 반환하는 반면, 'LSCopyApplicationURLsForURL()'은 그 타입을 선언하는 어플리케이션과 그것이 따르는 타입을 반환합니다 ~에. 수동으로'UTTypeCopyDeclaration()'을 사용하고'kUTTypeConformsToKey' 값을 검사하여 체인을 걸을 수 있습니다. 'public.data','public.content' 그리고'public.item'에서 멈춰야 할 것 같습니다. 그것들은 Finder가 나열하는 앱을 추가하는 것처럼 보이지 않기 때문입니다. –

답변

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) 
}