회사에서 일하다가 개선해보면 좋을 것 같았던 내용 기록.
사내에 iOS 개발자가 아닌 분들도, Xcode 의 iOS 시뮬레이터로 직접 빌드를 해보고 싶어하시거나, Firebase AppDistribution 의 다양한 앱 빌드들(쏘카에선 FC 라고 부른다)을 직접 실기기에 설치해보고 싶어하시는 분들이 많았다. (특히 웹 개발자분들이 웹 뷰를 보기 위해)
→ 웹 개발자 C
와의 DM 캡처
→ 웹 개발자 R
과의 DM 캡처 (FC 에서 사파리 웹 인스펙터가 동작하지 않아서 빠른 개선을 부탁해주시는 내용)
이외에도 iOS 시뮬레이터를 빌드하고 싶거나 FC 빌드를 설치하고 싶은 분들이 많이들 계셨다.
니즈는 크게 2가지였던 것 같다.
(A) Xcode 의 시뮬레이터를 직접 돌려보면서 다양한 iOS 버전과 다양한 아이폰 기종으로 웹 뷰를 실행해보고 싶음.
→ 웹 개발자분들이 시뮬레이터와 사파리 웹 인스펙터를 같이 띄우고, 로그를 보고 싶어하는 니즈가 있었다.
→ 하지만 iOS 개발자에게조차 Xcode 빌드는 쉽지 않다.
→ 클린빌드, Derived Data 삭제, 코코아팟 재설치, Tuist Generate 등 별의 별 똥꼬쇼를 펼쳐야 “OK. 너 그정도 했으면 빌드 시켜줄게.” 해줌. 응 쉽게 안해줘.
(B) 다양한 앱 버전별 (브랜치별) 웹 뷰를 실행해보고 싶음.
→ FC 를 실기기에 설치하면 되지만, iOS 보안 정책상 테스트 기기 등록을 해야만 실기기에서 앱을 설치할 수 있다.
→ 기기 등록은 개수 제한이 있다. 현재 쏘카 iOS 앱 기기 등록은 포화 상태여서 이젠 추가 등록을 할 수 없는 상태였다.
iOS 보안 정책 - 코드 사이닝 개념 정리: iOS 코드사이닝
테스트 기기 등록을 해야하는 이유는 iOS 의 보안 정책 때문이다.
애플은 아이폰에 설치되는 앱이 보안적으로 문제가 없다는 것을 보장하기 위해 Provisioning Profile 을 사용한다.
간단하게 표현하면 앱을 말아줄 때 필요로 하는 앱에 대한 프로필인데, 크게는 다음 3가지를 보장해야 한다.
위에서 설명했던 테스트 기기 등록이 바로 문제의 3. Device 등록이다.
프로필에 사전 등록 되어있지 않은 기기에서는 앱을 설치할 수 없도록 막아두었다.
이거 일일이 빌드 도와주는 건 너무 불편한데.. 이 와중 웹 개발자 W
의 카더라 정보를 얻은적이 있었다. (퇴사하심)
Derived Data 에서 완성된 앱 파일만 쏙 뽑아낼 수 있다더라.
그리고 이 앱 파일만 전달해주면 Xcode 빌드고, 기기 등록이고 뭐고 필요없이 시뮬레이터에서 바로 실행할 수 있다.
Derived Data
는 Xcode가 프로젝트를 빌드할 때 생성하는 캐시(Cache) 와 비슷한 디렉토리. 빌드 과정에서 필요한 중간 파일과 메타데이터를 저장하며, 프로젝트를 더 빠르게 컴파일하고 실행하는 데 도움을 준다.
→ 요 Derived Data 라는 놈은 항상 iOS 개발자들의 맥북 메모리 공간이 부족하게 만들어주며, 빌드를 한번에 성공할 수 없도록 도와주는 친구다. 👍🏻
그래서 항상 빌드 하기 전 삭제의 대상으로만 바라보던 Derived Data 가... 의외로 쓸모있는 친구일지도? 🤔
.app
파일로 앱 추출하기그래서 직접 해봤다. 생각보다 간단하다.
시뮬레이터로 쏘카 앱을 한번 빌드하면 Derived Data 가 생성되고, 이 Derived Data 안에 SOCAR.app
파일까지 생성이 된다.
이 .app
확장자의 파일은 그 자체로 실행가능한 쏘카 앱 파일. 이 파일 자체를 전달해서 시뮬레이터에 설치하면 곧바로 쏘카 앱을 실행할 수 있게 된다.
아래는 .app
파일이 생성되는 위치.
~/Xcode/DeriveData/(본인앱)-(해시값)/Build/Products/Debug-Dev-iphonesimulator/SOCAR.app
이 파일을 아래 gif 처럼 드래그해서 시뮬레이터에 얹으면 자동으로 설치가 시작된다.
이 파일을 다른 맥북에 전달해서 시뮬레이터에 설치 후 실행 성공하는 것까지 확인 완료했다. ✅
⚠️ 주의점: 시뮬레이터로 빌드해야 시뮬레이터에서 설치 가능한 .app
파일이 생성된다.
DeriveData 에서 .app
파일 찾기가 귀찮으니 알아서 찾고 압축 파일까지 생성하는 스크립트를 만들어봤다.
#!/bin/bash
# 변수 설정
PROJECT_NAME="SOCAR" # 프로젝트 이름
SCHEME_NAME="socar" # 스킴 이름
DEST_PATH="./ExtractedApp" # 추출할 .app 저장 경로
# Derived Data 경로
BUILD_DIR=~/Library/Developer/Xcode/DerivedData
# 최신 빌드에서 .app 파일 찾기
APP_PATH=$(find $BUILD_DIR -name "$PROJECT_NAME.app" -path "*iphonesimulator*" | tail -n 1)
if [ -z "$APP_PATH" ]; then
echo "❌ .app 파일을 찾을 수 없습니다. Derived Data 경로를 확인하세요."
exit 1
fi
echo "추출된 .app 경로: $APP_PATH"
# 결과물 복사 및 압축
mkdir -p "$DEST_PATH"
cp -R "$APP_PATH" "$DEST_PATH"
ZIP_PATH="$DEST_PATH/$PROJECT_NAME.zip"
# 경로 확인 및 압축 수행
echo "📦 .app을 .zip으로 압축 중..."
if [ -d "$DEST_PATH/$PROJECT_NAME.app" ]; then
zip -r "$ZIP_PATH" "$DEST_PATH/$PROJECT_NAME.app"
echo "✅ 압축 완료: $ZIP_PATH"
else
echo "❌ 압축할 .app 경로를 찾을 수 없습니다."
exit 1
fi
위에서 이야기 했었던 니즈 2가지를 어느정도 충족을 시킬 수 있을 것 같다.
Xcode 의 시뮬레이터를 직접 돌려보면서 다양한 OS 와 기기로 웹 뷰를 실행해보고 싶음.
→ Xcode 시뮬레이터만 설치되어있으면 됨.
→ 완성된 앱 파일만 건네받으면 그걸 시뮬레이터에 설치하면 됨.
→ 코드 빌드할 필요 ❌.
다양한 앱 버전별 (브랜치별) 웹 뷰를 실행해보고 싶음.
→ 테스트 기기 등록을 하지 않아도, 다양한 앱 버전을 설치할 수 있음.
→ iOS 앱 개발자가 앱 파일만 말아서 건네주면 시뮬레이터에서 모든 앱 버전, 브랜치 별 버전 실행 가능.
CI/CD 과정에서 이 앱 파일을 어딘가의 공간에 올리는 과정도 포함시키면 좋을 것 같다는 생각도 들었다.
Device용으로 빌드된 .app을 Derived Data에서 찾아내면 등록 안된 기기에도 설치가 되나요..?
시뮬레이터라 기기 등록 관계 없이 된 것이 아닌가 싶어서요