Derived Data 에서 쏘카 앱 파일 추출하기

김상우·2025년 3월 27일
2
post-thumbnail

회사에서 일하다가 개선해보면 좋을 것 같았던 내용 기록.

(1) iOS 앱 빌드를 하고 싶은 사람들

사내에 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 앱 기기 등록은 포화 상태여서 이젠 추가 등록을 할 수 없는 상태였다.

(2) 까탈시런 iOS 의 보안 정책

iOS 보안 정책 - 코드 사이닝 개념 정리: iOS 코드사이닝

테스트 기기 등록을 해야하는 이유는 iOS 의 보안 정책 때문이다.
애플은 아이폰에 설치되는 앱이 보안적으로 문제가 없다는 것을 보장하기 위해 Provisioning Profile 을 사용한다.

간단하게 표현하면 앱을 말아줄 때 필요로 하는 앱에 대한 프로필인데, 크게는 다음 3가지를 보장해야 한다.

  1. App ID (어떤 앱인지)
  2. Certificate (누가 개발했는지)
  3. Device (이걸 어떤 기기에 설치해도 되는지)

위에서 설명했던 테스트 기기 등록이 바로 문제의 3. Device 등록이다.
프로필에 사전 등록 되어있지 않은 기기에서는 앱을 설치할 수 없도록 막아두었다.

(3) Derived Data 란

이거 일일이 빌드 도와주는 건 너무 불편한데.. 이 와중 웹 개발자 W 의 카더라 정보를 얻은적이 있었다. (퇴사하심)

Derived Data 에서 완성된 앱 파일만 쏙 뽑아낼 수 있다더라.
그리고 이 앱 파일만 전달해주면 Xcode 빌드고, 기기 등록이고 뭐고 필요없이 시뮬레이터에서 바로 실행할 수 있다.

Xcode의 Derived Data란?

Derived Data는 Xcode가 프로젝트를 빌드할 때 생성하는 캐시(Cache) 와 비슷한 디렉토리. 빌드 과정에서 필요한 중간 파일과 메타데이터를 저장하며, 프로젝트를 더 빠르게 컴파일하고 실행하는 데 도움을 준다.

📂 Derived Data에 포함된 주요 파일

  • Build/Products: 컴파일된 바이너리 파일(예: 앱 실행 파일) (이게 오늘의 주제)
  • Index: 코드 자동 완성, 검색, 구문 분석을 위한 인덱스 정보
  • Logs: 빌드 및 디버그 로그
  • Module Cache: 외부 프레임워크와 모듈의 캐시
  • Source Packages: Swift Package Manager(SPM)로 가져온 외부 라이브러리

→ 요 Derived Data 라는 놈은 항상 iOS 개발자들의 맥북 메모리 공간이 부족하게 만들어주며, 빌드를 한번에 성공할 수 없도록 도와주는 친구다. 👍🏻

그래서 항상 빌드 하기 전 삭제의 대상으로만 바라보던 Derived Data 가... 의외로 쓸모있는 친구일지도? 🤔

(4) .app 파일로 앱 추출하기

그래서 직접 해봤다. 생각보다 간단하다.
시뮬레이터로 쏘카 앱을 한번 빌드하면 Derived Data 가 생성되고, 이 Derived Data 안에 SOCAR.app 파일까지 생성이 된다.

.app 확장자의 파일은 그 자체로 실행가능한 쏘카 앱 파일. 이 파일 자체를 전달해서 시뮬레이터에 설치하면 곧바로 쏘카 앱을 실행할 수 있게 된다.

아래는 .app 파일이 생성되는 위치.

~/Xcode/DeriveData/(본인앱)-(해시값)/Build/Products/Debug-Dev-iphonesimulator/SOCAR.app

이 파일을 아래 gif 처럼 드래그해서 시뮬레이터에 얹으면 자동으로 설치가 시작된다.

이 파일을 다른 맥북에 전달해서 시뮬레이터에 설치 후 실행 성공하는 것까지 확인 완료했다. ✅
⚠️ 주의점: 시뮬레이터로 빌드해야 시뮬레이터에서 설치 가능한 .app 파일이 생성된다.

(5) 약간의 자동화 (스크립트)

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

(6) 요약

위에서 이야기 했었던 니즈 2가지를 어느정도 충족을 시킬 수 있을 것 같다.

  1. Xcode 의 시뮬레이터를 직접 돌려보면서 다양한 OS 와 기기로 웹 뷰를 실행해보고 싶음.

    → Xcode 시뮬레이터만 설치되어있으면 됨.

    → 완성된 앱 파일만 건네받으면 그걸 시뮬레이터에 설치하면 됨.

    → 코드 빌드할 필요 ❌.

  1. 다양한 앱 버전별 (브랜치별) 웹 뷰를 실행해보고 싶음.

    → 테스트 기기 등록을 하지 않아도, 다양한 앱 버전을 설치할 수 있음.

    → iOS 앱 개발자가 앱 파일만 말아서 건네주면 시뮬레이터에서 모든 앱 버전, 브랜치 별 버전 실행 가능.

CI/CD 과정에서 이 앱 파일을 어딘가의 공간에 올리는 과정도 포함시키면 좋을 것 같다는 생각도 들었다.

profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

2개의 댓글

comment-user-thumbnail
2025년 4월 4일

Device용으로 빌드된 .app을 Derived Data에서 찾아내면 등록 안된 기기에도 설치가 되나요..?
시뮬레이터라 기기 등록 관계 없이 된 것이 아닌가 싶어서요

1개의 답글

관련 채용 정보