본문으로 건너뛰기

dotgimon 제작기 17. Xcode 실행 경로와 Device Hub 정리

·6 min read·17 / 32

pnpm ios를 실행하면 Simulator 대신 Device Hub가 열렸다. dotgimon은 Expo로 만드는 가상 펫 게임인데, 앱 코드를 보기 전에 개발 도구부터 낯설었다. 기존 Simulator 창으로 열고 싶어서 설치된 Xcode와 실행 경로를 확인했다.

Device Hub를 미리 열어 두면 넘어갈 수는 있었다. 하지만 실행할 때마다 같은 준비가 필요했다. 왜 그 우회가 필요한지부터 다시 살폈다.

Device Hub로 열리는 것 자체는 문제가 아니었다

기본 Xcode는 27.0이었다. 이 버전에서는 기존 Simulator 앱 대신 Device Hub를 사용한다. Expo의 iOS Simulator 문서도 이 변경을 안내한다.

Mac에는 Xcode가 세 개 있었다. 기본 Xcode.app 외에 26.6과 16.4가 남아 있었고, 두 예전 버전에는 Simulator.app이 들어 있었다.

설치 경로버전확인한 앱
/Applications/Xcode.app27.0Device Hub
/Applications/Xcode-26.6.app26.6Simulator
/Applications/Xcode-16.4.0.app16.4Simulator

Expo CLI가 기기를 여는 코드를 보니 Simulator 실행에 실패했을 때 Device Hub URL로 넘어가는 경로가 있었다. Device Hub가 뜬다는 이유만으로 잘못된 앱이 열린 것은 아니었다.

26.6에 들어 있는 Simulator를 직접 열어 두거나, ios 스크립트 앞에 그 경로를 붙이는 방법도 생각했다. 하지만 그 전에 앱 이름으로 실행했을 때 어떤 설치본이 선택되는지 확인할 필요가 있었다. 기본 개발 도구를 고르는 xcode-select와 앱 이름을 찾는 LaunchServices는 같은 설정이 아니다.

Simulator 실행은 성공했는데 다른 설치본이었다

다시 pnpm ios를 실행하자 Simulator가 종료됐다. 진단 리포트의 실행 경로는 26.6이 아니라 Xcode-16.4.0.app 안의 Simulator였다. 로그에는 SimulatorKit에서 Swift 타입을 찾지 못한 채 SIGABRT로 끝난 흔적이 있었다.

앱 등록 목록에서도 예전 Simulator 두 개가 보였다. 등록된 설치 위치는 Spotlight 검색으로 찾았다.

mdfind "kMDItemCFBundleIdentifier == 'com.apple.iphonesimulator'"

open -a Simulator는 이 중 하나를 찾아 실행했다. 앱을 찾는 데 성공했으니 Expo의 Device Hub 대체 경로로는 넘어가지 않았다. 앱을 여는 명령의 성공과, 열린 앱이 정상 동작하는 것은 다른 문제였다.

앱 등록을 빼고 URL로 직접 열었다

LaunchServices는 macOS에서 앱 이름과 실행 경로를 연결하는 기능이다. 예전 Simulator가 이 목록에 남아 있어서 이름만으로 실행하는 명령에 선택되고 있었다. 설치 파일을 바로 지우기 전에 두 앱의 등록부터 해제했다.

L=/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister
$L -u /Applications/Xcode-16.4.0.app/Contents/Developer/Applications/Simulator.app
$L -u /Applications/Xcode-26.6.app/Contents/Developer/Applications/Simulator.app
open -a Simulator

그 뒤에는 Unable to find application named 'Simulator'가 나왔다. 이번에는 앱을 못 찾는 결과가 의도한 동작이었다. 예전 설치본이 선택되는 경로를 끊었기 때문이다.

Device Hub는 기기 식별자가 들어간 URL로 직접 열어 봤다. 아래의 <UDID>에는 실행할 시뮬레이터의 식별자를 넣었다.

open "devices://device/open?id=<UDID>"

명령은 종료 코드 0으로 끝났고 Device Hub 프로세스도 확인했다. 새 크래시 리포트는 생기지 않았다. 다만 여기서 확인한 것은 URL 실행까지였다. pnpm ios로 빌드부터 앱 실행까지 끝난 결과는 확인하지 못했다.

삭제할 Xcode를 다시 골랐다

설치 목록을 보고 “26.6 빼고 다 지워줘”라고 요청했다. 그대로 실행하면 기본으로 쓰는 Xcode 27.0도 지워지는 범위였다. 에이전트가 삭제 대상을 되물었고, 16.4만 지우는 쪽을 골랐다.

문제를 일으킨 Simulator가 들어 있던 Xcode 16.4를 삭제했다. 27.0은 기본 개발 도구로, 26.6은 별도 설치본으로 남겼다. 예전 Simulator 앱의 등록도 해제한 상태였다.

26.6을 다시 열었을 때 앱이 재등록될 가능성은 있었다. 등록 해제만으로 같은 증상이 언제나 해결된다고 확인한 것은 아니었다. 이번 작업에서는 예전 Simulator가 선택된 경로를 찾아 끊었고, Device Hub를 URL로 여는 데까지 확인했다.

처음에는 Simulator 창을 되찾으려 했다. 설치본을 확인하고 나서는 Xcode 27의 Device Hub를 쓰는 쪽으로 생각을 바꿨다. 익숙한 창의 이름보다 실제로 어느 앱이 열렸는지가 문제였다.