macOS 앱의 파일 연결을 더블클릭까지 검증하기

CI/CD ·약 6분 읽기

macOS 앱의 파일 연결을 더블클릭까지 검증하기

원격 Mac에서 macOS 문서 앱을 디버깅하다 보면, 터미널에서 앱을 지정해 샘플 파일을 열 때는 잘 열리는데 같은 파일을 데스크톱에서 더블클릭하면 다른 앱이 실행되거나 사용할 앱을 선택하라는 메시지가 나타날 수 있습니다. 첫 번째 테스트가 성공했다는 사실은 앱에 파일을 전달할 수 있다는 뜻일 뿐, 파일 연결이 올바르다는 증거는 아닙니다. 원인을 찾으려면 파일 유형 선언, 앱의 파일 처리, 기본 앱으로 열기를 서로 다른 결과로 나누어 확인해야 합니다.

이 글에서는 사용자 정의 .notejson 파일을 예로 듭니다. 내용은 JSON이지만, 확장자는 해당 앱의 문서임을 나타냅니다. 검사는 빌드가 끝나고 실행 가능한 macOS 앱에서 진행하세요. 테스트 파일에는 가상의 데이터만 넣고 실제 운영 문서는 사용하지 마세요.

확장자만 확인하지 말고 파일 유형부터 선언하기

앱 고유 형식에는 안정적인 유형 식별자가 필요합니다. 이 예에서는 식별자를 dev.sample.notejson, 확장자를 notejson으로 정하고 파일 내용은 JSON 형식을 따릅니다. 앱의 유형 선언에는 이 유형을 내보내는 설정과 앱이 이 유형의 파일을 열 수 있다는 설정이 모두 있어야 합니다. 코드에서 파일명 확장자만 검사한다고 Finder에 파일 연결이 자동으로 등록되지는 않습니다.

Xcode의 앱 타깃에서 내보내는 유형과 Document Types를 설정한 뒤, 최종 앱 번들의 Info.plist를 확인하세요. 내보내는 유형에는 유형 식별자, 확장자, 상위 유형과의 관계가 있어야 하며, 문서 유형은 같은 식별자를 참조해야 합니다. 예시 앱이 보기 기능만 제공한다면 문서 역할을 Viewer로 설정하세요. 아직 구현하지 않은 편집 기능을 지원한다고 선언해서는 안 됩니다.

검사할 대상은 빌드된 앱 번들입니다. 프로젝트 화면에 설정했더라도 빌드 결과물에 반영되지 않았다면 소용없습니다.

실제 파일 형식이 JSON이 아니라면 예시를 통과시키기 위해 JSON 유형을 따른다고 선언하지 마세요. 유형 간 관계는 실제 내용을 반영해야 합니다. 선언을 수정했다면 앱을 다시 빌드해야 합니다. 프로젝트 설정이 바뀌어도 기존 앱 번들은 저절로 업데이트되지 않습니다.

배포할 앱 번들의 선언 확인하기

먼저 이번에 검증할 앱을 고정된 경로에 놓습니다. 아래 명령은 /Applications/NoteReader.app을 예로 사용합니다. 실행하기 전에 APP을 자신의 앱 경로로 바꾸세요.

APP="/Applications/NoteReader.app"
test -d "$APP/Contents" || exit 1
plutil -extract UTExportedTypeDeclarations json -o - "$APP/Contents/Info.plist"
plutil -extract CFBundleDocumentTypes json -o - "$APP/Contents/Info.plist"

첫 번째 출력에서 dev.sample.notejson과 notejson을 확인하고, 두 번째 출력에서 동일한 유형 식별자와 문서 역할을 확인하세요. plutil이 키를 찾을 수 없다고 보고하면 더블클릭 테스트로 넘어가지 말고 타깃 설정과 빌드 결과물부터 확인해야 합니다. 최종 목록을 빌드 설정에서 생성하는 프로젝트라면 특히 번들 안의 파일을 기준으로 판단하세요.

원격 Mac에서는 검증 중인 앱이 방금 빌드한 바로 그 앱인지도 확인해야 합니다. 같은 이름의 앱이 다운로드 폴더와 응용 프로그램 폴더에 모두 남아 있다면, 터미널에서 경로를 지정해 여는 테스트와 Finder에서 기본 앱으로 여는 테스트가 서로 다른 복사본을 가리킬 수 있습니다. 번들 경로를 기록하고 이번 테스트에 사용하지 않는 오래된 복사본을 치우는 편이 유형 선언을 반복해서 수정하는 것보다 효과적입니다.

두 가지 열기 방식으로 문제 구분하기

임시 샘플을 만들고, 먼저 앱을 명시적으로 지정해 연 다음 시스템의 기본 선택을 테스트합니다.

APP="/Applications/NoteReader.app"
CASE="$(mktemp -d)"
printf '{"title":"association-check"}\n' > "$CASE/demo.notejson"

open -a "$APP" "$CASE/demo.notejson"
open "$CASE/demo.notejson"

open -a가 성공했다는 것은 지정한 앱에 파일을 처리하도록 요청했다는 뜻입니다. 이어서 앱이 실제로 샘플 내용을 표시하는지 확인해야 합니다. 창이 나타났다는 것만으로 파일 읽기가 완료된 것은 아닙니다. 두 번째 명령은 앱을 지정하지 않으므로 기본 앱 선택 과정을 거칩니다. Finder에서 같은 샘플을 더블클릭하고 실제로 어느 앱이 열리는지 비교해도 됩니다.

기본 연결은 해당 Mac에 설치된 앱과 사용자의 선택에 영향을 받습니다. 따라서 검증 기록에는 ‘지정한 앱으로 열었을 때의 결과’와 ‘현재 사용자의 기본 앱으로 열었을 때의 결과’를 따로 남기세요. 후자가 모든 Mac에서 동일하다고 단정해서는 안 됩니다. 시스템이 앱 선택 화면을 표시했다면 이 역시 기록해야 하며, 자동 연결에 성공한 것으로 처리해서는 안 됩니다.

증상에 따라 원인을 찾아 파일 읽기 코드를 잘못 수정하지 않기

관찰한 현상 우선 확인할 항목
앱 번들에 유형 또는 문서 선언이 없음 타깃 설정, 실제 빌드 결과물
앱을 지정해도 파일을 읽지 못함 파일 내용, 앱의 파일 수신 및 파싱 로직
앱을 지정하면 읽지만 기본으로 열면 다른 앱이 실행됨 현재 사용자의 기본 연결, 다른 앱 복사본
앱은 실행되지만 빈 문서가 표시됨 파일 수신 후 오류 처리와 화면 상태

표의 마지막 두 경우는 특히 혼동하기 쉽습니다. 시스템이 파일을 앱에 전달했더라도 샘플 형식이 잘못되면 앱이 파싱을 거부할 수 있습니다. 반대로 앱이 파일을 문제없이 파싱하더라도 시스템이 그 앱을 기본으로 선택한다는 보장은 없습니다. 어느 단계에서 문제가 생겼는지 먼저 확인한 뒤 해당 코드를 수정하세요.

검증을 마치면 임시 샘플을 삭제하고, 빌드 기록에 앱 번들 경로, 유형 식별자, 샘플 확장자, 두 가지 열기 결과를 남기세요. 다음에 Info.plist나 문서 읽기 코드를 수정할 때 같은 절차로 검사하면, 변화가 파일 유형 연결에서 생겼는지 앱 내부에서 생겼는지 구분할 수 있습니다. ‘한 번 더블클릭해 봤다’는 사실만으로 결론을 내릴 필요가 없습니다.

자주 묻는 질문

open -a는 성공하는데 더블클릭하면 다른 앱이 열리는 이유는 무엇인가요?

open -a는 앱을 직접 지정하므로 기본 파일 연결을 검사하지 않습니다. 번들의 형식 선언을 확인한 뒤 -a 없이 파일을 열거나 더블클릭해 별도로 검증하세요.

파일이 앱으로 전달됐지만 내용을 읽지 못하면 무엇을 확인해야 하나요?

파일 연결과 내용 파싱은 서로 다른 단계입니다. 실제 파일 형식이 선언과 맞는지 확인하고 앱의 읽기 코드와 오류 메시지를 살펴보세요.

클라우드 Mac을 워크플로에 연결하세요

VPSPush는 원격으로 연결할 수 있는 전용 물리 Mac을 제공합니다. 노드와 이용 기간을 선택한 뒤 주문에서 접속 정보와 최종 금액을 확인하세요.

클라우드 Mac 요금제 확인 및 주문