diff --git a/build-ios.sh b/build-ios.sh
index de5ac58..2de07e3 100755
--- a/build-ios.sh
+++ b/build-ios.sh
@@ -12,297 +12,213 @@ NC='\033[0m' # No Color
# 프로젝트 디렉토리로 이동
cd "$(dirname "$0")"
-# 프로젝트 파일 경로
-XCODEPROJ_FILE="ios/App/App.xcodeproj/project.pbxproj"
-
-# 현재 버전 및 빌드 번호 가져오기
-if [ -f "$XCODEPROJ_FILE" ]; then
- MARKETING_VERSION=$(grep -A 1 "MARKETING_VERSION" "$XCODEPROJ_FILE" | grep -o 'MARKETING_VERSION = [0-9]\+\.[0-9]\+\(\.[0-9]\+\)*' | sed 's/MARKETING_VERSION = //' | head -1)
- CURRENT_PROJECT_VERSION=$(grep -A 1 "CURRENT_PROJECT_VERSION" "$XCODEPROJ_FILE" | grep -o '[0-9]\+' | head -1)
-
- echo -e "${YELLOW}현재 버전 정보:${NC}"
- echo -e "마케팅 버전: ${GREEN}$MARKETING_VERSION${NC}"
- echo -e "빌드 번호: ${GREEN}$CURRENT_PROJECT_VERSION${NC}"
-
- # 설정 파일 확인 및 로드
- CONFIG_FILE="$HOME/.zellyy_ios_build.conf"
- if [ -f "$CONFIG_FILE" ]; then
- source "$CONFIG_FILE"
- fi
-
- # 버전 수정 여부 확인
- echo -e "\n${YELLOW}버전 정보를 수정하시겠습니까? (y/n) [${LAST_VERSION_CHOICE:-n}]:${NC}"
- read -r UPDATE_VERSION
- UPDATE_VERSION=${UPDATE_VERSION:-${LAST_VERSION_CHOICE:-n}}
-
- if [[ "$UPDATE_VERSION" == "y" || "$UPDATE_VERSION" == "Y" ]]; then
- echo -e "\n${YELLOW}새 마케팅 버전을 입력하세요 (현재: $MARKETING_VERSION) [${LAST_MARKETING_VERSION:-$MARKETING_VERSION}]:${NC}"
- read -r NEW_MARKETING_VERSION
- NEW_MARKETING_VERSION=${NEW_MARKETING_VERSION:-${LAST_MARKETING_VERSION:-$MARKETING_VERSION}}
-
- if [ -z "$NEW_MARKETING_VERSION" ]; then
- NEW_MARKETING_VERSION=$MARKETING_VERSION
- fi
-
- echo -e "${YELLOW}새 빌드 번호를 입력하세요 (현재: $CURRENT_PROJECT_VERSION) [${LAST_BUILD_NUMBER:-$CURRENT_PROJECT_VERSION}]:${NC}"
- read -r NEW_PROJECT_VERSION
- NEW_PROJECT_VERSION=${NEW_PROJECT_VERSION:-${LAST_BUILD_NUMBER:-$CURRENT_PROJECT_VERSION}}
-
- if [ -z "$NEW_PROJECT_VERSION" ]; then
- NEW_PROJECT_VERSION=$CURRENT_PROJECT_VERSION
- fi
-
- # 버전 정보 업데이트
- # macOS에서는 sed -i에 백업 확장자를 지정해야 함
- sed -i '' "s/MARKETING_VERSION = [0-9][0-9]*\.[0-9][0-9]*\(\.[0-9][0-9]*\)*/MARKETING_VERSION = $NEW_MARKETING_VERSION/g" "$XCODEPROJ_FILE"
- sed -i '' "s/CURRENT_PROJECT_VERSION = $CURRENT_PROJECT_VERSION;/CURRENT_PROJECT_VERSION = $NEW_PROJECT_VERSION;/g" "$XCODEPROJ_FILE"
-
- echo -e "\n${GREEN}버전 정보가 업데이트되었습니다:${NC}"
- echo -e "마케팅 버전: ${GREEN}$NEW_MARKETING_VERSION${NC}"
- echo -e "빌드 번호: ${GREEN}$NEW_PROJECT_VERSION${NC}"
-
- # 설정 저장
- echo "LAST_VERSION_CHOICE=y" > "$CONFIG_FILE"
- echo "LAST_MARKETING_VERSION=$NEW_MARKETING_VERSION" >> "$CONFIG_FILE"
- echo "LAST_BUILD_NUMBER=$NEW_PROJECT_VERSION" >> "$CONFIG_FILE"
- else
- echo -e "${YELLOW}현재 버전 정보를 유지합니다.${NC}"
- # 설정 저장
- echo "LAST_VERSION_CHOICE=n" > "$CONFIG_FILE"
- fi
-else
- echo -e "${RED}프로젝트 파일을 찾을 수 없습니다: $XCODEPROJ_FILE${NC}"
- exit 1
+# 설정 파일 확인 및 로드
+CONFIG_FILE="$HOME/.zellyy_ios_build.conf"
+if [ -f "$CONFIG_FILE" ]; then
+ source "$CONFIG_FILE"
fi
-# 빌드 타입 선택 메뉴
-echo -e "\n${YELLOW}Zellyy Finance iOS 앱 빌드 스크립트${NC}"
-echo -e "${YELLOW}=============================${NC}"
-echo -e "빌드 타입을 선택하세요:"
-echo -e "1) 디버그 빌드 (개발 및 테스트용)"
-echo -e "2) 릴리즈 빌드 (App Store 배포용)"
-echo -e "3) 종료"
-echo -n "선택 (1-3) [${LAST_BUILD_TYPE:-1}]: "
-read -r CHOICE
-CHOICE=${CHOICE:-${LAST_BUILD_TYPE:-1}}
-
-case $CHOICE in
- 1)
- BUILD_TYPE="debug"
- CONFIGURATION="Debug"
- echo "LAST_BUILD_TYPE=1" >> "$CONFIG_FILE"
- ;;
- 2)
- BUILD_TYPE="release"
- CONFIGURATION="Release"
- echo "LAST_BUILD_TYPE=2" >> "$CONFIG_FILE"
- ;;
- 3)
- echo -e "${YELLOW}빌드를 취소합니다.${NC}"
- exit 0
- ;;
- *)
- echo -e "${RED}잘못된 선택입니다. 빌드를 취소합니다.${NC}"
- exit 1
- ;;
-esac
-
-echo -e "${YELLOW}Zellyy Finance iOS 앱 빌드 시작 (${BUILD_TYPE}, 마케팅 버전: ${MARKETING_VERSION}, 빌드 번호: ${NEW_PROJECT_VERSION}): $(date)${NC}"
-
-# 빌드 디렉토리 문제 해결
-echo -e "${YELLOW}빌드 디렉토리 준비 중...${NC}"
-BUILD_DIR="ios/App/build"
-if [ -d "$BUILD_DIR" ]; then
- echo -e "${YELLOW}기존 빌드 디렉토리에 Xcode 빌드 시스템 속성 추가 중...${NC}"
- xattr -w com.apple.xcode.CreatedByBuildSystem true "$BUILD_DIR"
-else
- echo -e "${YELLOW}빌드 디렉토리 생성 중...${NC}"
- mkdir -p "$BUILD_DIR"
- xattr -w com.apple.xcode.CreatedByBuildSystem true "$BUILD_DIR"
-fi
-
-# 캐시 정리
-echo -e "${YELLOW}캐시 정리 중...${NC}"
-if [ -d "node_modules/.cache" ]; then
- rm -rf node_modules/.cache
-fi
-if [ -d "ios/App/App/public" ]; then
- rm -rf ios/App/App/public
-fi
-
-# 1. 웹 앱 빌드
-echo -e "${YELLOW}1. 웹 앱 빌드 중...${NC}"
-npm run build
-if [ $? -ne 0 ]; then
- echo -e "${RED}웹 앱 빌드 실패. 빌드 프로세스를 중단합니다.${NC}"
- exit 1
-fi
-echo -e "${GREEN}웹 앱 빌드 완료${NC}"
-
-# 2. Capacitor에 웹 코드 복사 및 동기화
-echo -e "${YELLOW}2. Capacitor에 웹 코드 동기화 중...${NC}"
-npx cap sync ios
-if [ $? -ne 0 ]; then
- echo -e "${RED}Capacitor 동기화 실패. 빌드 프로세스를 중단합니다.${NC}"
- exit 1
-fi
-echo -e "${GREEN}Capacitor 동기화 완료${NC}"
-
-# 3. iOS 앱 빌드
-echo -e "${YELLOW}3. iOS 빌드 시작 (${BUILD_TYPE})...${NC}"
-
-# 빌드 타입에 따라 다른 명령어 실행
-cd ios/App
-if [ "$BUILD_TYPE" = "debug" ]; then
- # 디버그 빌드
- echo -e "${YELLOW}빌드 대상을 선택하세요:${NC}"
- echo -e "1) 시뮬레이터용 빌드"
- echo -e "2) 실제 기기용 빌드"
- echo -n "선택 (1-2): "
- read -r TARGET_CHOICE
+# 캐시 삭제 함수
+clean_cache() {
+ echo -e "${YELLOW}캐시 삭제 중...${NC}"
- case $TARGET_CHOICE in
+ echo -e "${YELLOW}1. Xcode 파생 데이터 삭제중...${NC}"
+ rm -rf ~/Library/Developer/Xcode/DerivedData/App-*
+
+ echo -e "${YELLOW}2. Pod 캐시 삭제중...${NC}"
+ rm -rf ios/App/Pods
+ rm -rf ios/App/Podfile.lock
+
+ echo -e "${YELLOW}3. iOS 빌드 디렉토리 삭제중...${NC}"
+ rm -rf ios/App/build
+ mkdir -p ios/App/build
+ xattr -w com.apple.xcode.CreatedByBuildSystem true ios/App/build
+
+ echo -e "${YELLOW}4. Node 모듈 캐시 삭제중...${NC}"
+ rm -rf node_modules/.cache
+
+ echo -e "${YELLOW}5. Capacitor 빌드 캐시 삭제중...${NC}"
+ rm -rf ios/App/App/public
+
+ echo -e "${GREEN}캐시 삭제 완료!${NC}"
+}
+
+# 신뢰 인증서 안내 함수
+show_certificate_trust_guide() {
+ echo -e "\n${YELLOW}=== 앱 실행 시 인증서 신뢰 문제가 발생하는 경우 ====${NC}"
+ echo -e "${YELLOW}실제 기기에서 앱을 실행하려면 개발자 인증서를 신뢰해야 합니다.${NC}"
+ echo -e "${YELLOW}다음 단계를 따라 인증서를 신뢰하세요:${NC}"
+ echo -e "1. iOS 기기에서 '설정' 앱을 엽니다."
+ echo -e "2. '일반' > 'VPN 및 기기 관리'로 이동합니다."
+ echo -e "3. 개발자 앱 인증서(사용자 이름 포함)를 선택합니다."
+ echo -e "4. '신뢰'를 탭하여 인증서를 신뢰합니다."
+ echo -e "${YELLOW}인증서 신뢰 후 다시 앱을 실행해보세요.${NC}"
+ echo -e "${YELLOW}=============================================${NC}\n"
+}
+
+# 메인 메뉴 표시
+show_main_menu() {
+ echo -e "\n${YELLOW}Zellyy Finance iOS 앱 빌드 스크립트${NC}"
+ echo -e "${YELLOW}=============================${NC}"
+ echo -e "작업을 선택하세요:"
+ echo -e "1) 앱 빌드"
+ echo -e "2) 캐시 삭제"
+ echo -e "3) 종료"
+ echo -n "선택 (1-3) [${LAST_MAIN_CHOICE:-1}]: "
+ read -r MAIN_CHOICE
+ MAIN_CHOICE=${MAIN_CHOICE:-${LAST_MAIN_CHOICE:-1}}
+ echo "LAST_MAIN_CHOICE=$MAIN_CHOICE" > "$CONFIG_FILE"
+
+ case $MAIN_CHOICE in
1)
- # 시뮬레이터용 빌드
- echo -e "${YELLOW}시뮬레이터용 빌드 시작...${NC}"
- xcodebuild -workspace App.xcworkspace -scheme App -configuration Debug -sdk iphonesimulator -derivedDataPath build
-
- if [ $? -ne 0 ]; then
- echo -e "${RED}디버그 빌드 실패. 오류를 확인하세요.${NC}"
- exit 1
- fi
-
- echo -e "${GREEN}시뮬레이터용 빌드 성공!${NC}"
- echo -e "앱 파일 위치: $(pwd)/build/Build/Products/Debug-iphonesimulator/App.app"
-
- # 시뮬레이터 실행 여부 확인
- echo -e "${YELLOW}iOS 시뮬레이터에서 앱을 실행하시겠습니까? (y/n)${NC}"
- read -r RUN_SIMULATOR
- if [ "$RUN_SIMULATOR" = "y" ] || [ "$RUN_SIMULATOR" = "Y" ]; then
- # 사용 가능한 시뮬레이터 목록 표시
- echo -e "${YELLOW}사용 가능한 시뮬레이터:${NC}"
- xcrun simctl list devices available | grep -v "unavailable" | grep "^ "
-
- echo -e "${YELLOW}시뮬레이터 이름을 입력하세요 (예: iPhone 15):${NC}"
- read -r SIMULATOR_NAME
-
- # 시뮬레이터 UDID 가져오기
- SIMULATOR_UDID=$(xcrun simctl list devices available | grep "$SIMULATOR_NAME" | grep -o -E '[A-Za-z0-9\-]{36}' | head -1)
-
- if [ -z "$SIMULATOR_UDID" ]; then
- echo -e "${RED}시뮬레이터를 찾을 수 없습니다. 정확한 이름을 입력하세요.${NC}"
- exit 1
- fi
-
- # 시뮬레이터 실행
- echo -e "${YELLOW}시뮬레이터 실행 중...${NC}"
- open -a Simulator --args -CurrentDeviceUDID "$SIMULATOR_UDID"
-
- # 앱 설치 및 실행
- xcrun simctl install "$SIMULATOR_UDID" "$(pwd)/build/Build/Products/Debug-iphonesimulator/App.app"
- xcrun simctl launch "$SIMULATOR_UDID" "io.ionic.starter"
-
- echo -e "${GREEN}앱이 시뮬레이터에서 실행 중입니다.${NC}"
- fi
+ # 앱 빌드 선택 시 자동으로 캐시 삭제 수행
+ echo -e "${YELLOW}빌드 전 자동 캐시 삭제 중...${NC}"
+ clean_cache
+ start_build_process
;;
-
2)
- # 실제 기기용 빌드
- echo -e "${YELLOW}실제 기기용 빌드 시작...${NC}"
-
- # 개발자 계정 정보 입력
+ clean_cache
+ echo -e "\n${YELLOW}메인 메뉴로 돌아갑니다...${NC}"
+ show_main_menu
+ ;;
+ 3)
+ echo -e "${YELLOW}스크립트를 종료합니다.${NC}"
+ exit 0
+ ;;
+ *)
+ echo -e "${RED}잘못된 선택입니다. 종료합니다.${NC}"
+ exit 1
+ ;;
+ esac
+}
+
+# 빌드 프로세스 시작
+start_build_process() {
+ # 버전 관리 스크립트 실행
+ echo -e "${YELLOW}버전 정보 관리 시작...${NC}"
+ source ./ios-version-manager.sh
+ if [ $? -ne 0 ]; then
+ echo -e "${RED}버전 정보 관리 중 오류가 발생했습니다.${NC}"
+ exit 1
+ fi
+ echo -e "${GREEN}버전 정보 관리 완료!${NC}"
+
+ # 빌드 타입 선택 메뉴
+ echo -e "\n${YELLOW}빌드 타입을 선택하세요:${NC}"
+ echo -e "1) 디버그 빌드 (개발 및 테스트용)"
+ echo -e "2) 릴리즈 빌드 (App Store 배포용)"
+ echo -e "3) 취소"
+ echo -n "선택 (1-3) [${LAST_BUILD_TYPE:-1}]: "
+ read -r CHOICE
+ CHOICE=${CHOICE:-${LAST_BUILD_TYPE:-1}}
+
+ case $CHOICE in
+ 1)
+ BUILD_TYPE="debug"
+ CONFIGURATION="Debug"
+ echo "LAST_BUILD_TYPE=1" >> "$CONFIG_FILE"
+ ;;
+ 2)
+ BUILD_TYPE="release"
+ CONFIGURATION="Release"
+ echo "LAST_BUILD_TYPE=2" >> "$CONFIG_FILE"
+ ;;
+ 3)
+ echo -e "${YELLOW}빌드를 취소합니다.${NC}"
+ exit 0
+ ;;
+ *)
+ echo -e "${RED}잘못된 선택입니다. 빌드를 취소합니다.${NC}"
+ exit 1
+ ;;
+ esac
+
+ # 개발자 등록 여부 확인
+ echo -e "${YELLOW}Apple 개발자 계정에 등록되어 있습니까? (y/n) [${LAST_DEV_REGISTERED:-n}]:${NC}"
+ read -r DEV_REGISTERED
+ DEV_REGISTERED=${DEV_REGISTERED:-${LAST_DEV_REGISTERED:-n}}
+ echo "LAST_DEV_REGISTERED=$DEV_REGISTERED" >> "$CONFIG_FILE"
+
+ # 개발자 등록이 된 경우에만 계정 정보 입력
+ if [[ "$DEV_REGISTERED" == "y" || "$DEV_REGISTERED" == "Y" ]]; then
echo -e "${YELLOW}Apple 개발자 계정 이메일을 입력하세요 [${LAST_APPLE_ID:-}]:${NC}"
read -r APPLE_ID
APPLE_ID=${APPLE_ID:-${LAST_APPLE_ID:-}}
-
- # 설정 저장
echo "LAST_APPLE_ID=$APPLE_ID" >> "$CONFIG_FILE"
- # 연결된 기기 확인
- echo -e "${YELLOW}연결된 iOS 기기 확인 중...${NC}"
- DEVICE_LIST=$(xcrun xctrace list devices | grep -v "^==" | sed '/^$/d')
-
- # 실제 기기와 시뮬레이터 분리
- REAL_DEVICES=$(echo "$DEVICE_LIST" | grep -v "Simulator" | grep -v "MacBook" | grep -v "Mac")
- SIMULATORS=$(echo "$DEVICE_LIST" | grep "Simulator" || echo "")
-
- # 기기 목록 표시
- echo -e "${YELLOW}연결된 실제 기기:${NC}"
- if [ -z "$REAL_DEVICES" ]; then
- echo "연결된 실제 기기가 없습니다."
- echo "USB 케이블로 iOS 기기를 연결하고 다시 시도하세요."
- echo "또는 시뮬레이터를 사용하려면 시뮬레이터용 빌드를 선택하세요."
- exit 1
- fi
-
- # 실제 기기 목록 표시 (번호 부여)
- DEVICE_COUNTER=1
- DEVICE_ARRAY=()
- DEVICE_ID_ARRAY=()
-
- while IFS= read -r line; do
- DEVICE_NAME=$(echo "$line" | sed -E 's/^(.*) \(([0-9\.]+)\) \((.*)\)$/\1/')
- DEVICE_OS=$(echo "$line" | sed -E 's/^(.*) \(([0-9\.]+)\) \((.*)\)$/\2/')
- DEVICE_ID=$(echo "$line" | sed -E 's/^(.*) \(([0-9\.]+)\) \((.*)\)$/\3/')
-
- echo "$DEVICE_COUNTER) $DEVICE_NAME (iOS $DEVICE_OS)"
- DEVICE_ARRAY+=("$DEVICE_NAME")
- DEVICE_ID_ARRAY+=("$DEVICE_ID")
- ((DEVICE_COUNTER++))
- done <<< "$REAL_DEVICES"
-
- # 기기 선택
- echo -e "${YELLOW}빌드 및 설치할 기기 번호를 선택하세요 [${LAST_DEVICE_INDEX:-1}]:${NC}"
- read -r DEVICE_INDEX
- DEVICE_INDEX=${DEVICE_INDEX:-${LAST_DEVICE_INDEX:-1}}
-
- # 인덱스 범위 검증
- if ! [[ "$DEVICE_INDEX" =~ ^[0-9]+$ ]] || [ "$DEVICE_INDEX" -lt 1 ] || [ "$DEVICE_INDEX" -gt ${#DEVICE_ARRAY[@]} ]; then
- echo -e "${RED}잘못된 기기 번호입니다. 1부터 ${#DEVICE_ARRAY[@]} 사이의 숫자를 입력하세요.${NC}"
- exit 1
- fi
-
- # 선택된 기기 정보
- SELECTED_INDEX=$((DEVICE_INDEX-1))
- DEVICE_NAME="${DEVICE_ARRAY[$SELECTED_INDEX]}"
- DEVICE_ID="${DEVICE_ID_ARRAY[$SELECTED_INDEX]}"
- echo -e "${YELLOW}선택된 기기: $DEVICE_NAME (ID: $DEVICE_ID)${NC}"
-
- # 설정 저장
- echo "LAST_DEVICE_INDEX=$DEVICE_INDEX" >> "$CONFIG_FILE"
-
- # 디버그 빌드 및 기기 설치
- echo -e "${YELLOW}디버그 빌드 및 기기 설치 중...${NC}"
- # 프로비저닝 프로파일 자동 관리 옵션으로 빌드
- xcodebuild -workspace App.xcworkspace -scheme App -configuration Debug -destination "id=$DEVICE_ID" -allowProvisioningUpdates -derivedDataPath build
-
- if [ $? -ne 0 ]; then
- echo -e "${RED}디버그 빌드 실패. 오류를 확인하세요.${NC}"
- echo -e "${YELLOW}가능한 원인:${NC}"
- echo "1. 개발자 계정이 유효하지 않거나 로그인되지 않음"
- echo "2. 프로비저닝 프로파일이 없거나 유효하지 않음"
- echo "3. 기기가 개발자 모드로 설정되지 않음"
- exit 1
- fi
-
- echo -e "${GREEN}디버그 빌드 및 기기 설치 성공!${NC}"
+ echo -e "${YELLOW}Apple 개발자 팀 ID를 입력하세요 [${LAST_TEAM_ID:-}]:${NC}"
+ read -r TEAM_ID
+ TEAM_ID=${TEAM_ID:-${LAST_TEAM_ID:-}}
+ echo "LAST_TEAM_ID=$TEAM_ID" >> "$CONFIG_FILE"
+ CREATE_IPA="y"
+ else
+ echo -e "${YELLOW}개발자 등록 없이 진행합니다. IPA 파일 생성 기능은 제한됩니다.${NC}"
+ APPLE_ID=""
+ TEAM_ID=""
+ CREATE_IPA="n"
+ fi
+
+ # 빌드 시작
+ echo -e "\n${YELLOW}iOS $CONFIGURATION 빌드를 시작합니다...${NC}"
+
+ # 웹 앱 빌드
+ echo -e "${YELLOW}웹 앱 빌드 중...${NC}"
+ npm run build
+
+ if [ $? -ne 0 ]; then
+ echo -e "${RED}웹 앱 빌드 중 오류가 발생했습니다.${NC}"
+ exit 1
+ fi
+
+ # Capacitor 동기화
+ echo -e "${YELLOW}Capacitor 동기화 중...${NC}"
+ npx cap sync ios
+
+ if [ $? -ne 0 ]; then
+ echo -e "${RED}Capacitor 동기화 중 오류가 발생했습니다.${NC}"
+ exit 1
+ fi
+
+ # iOS 앱 빌드
+ echo -e "${YELLOW}iOS 네이티브 앱 빌드 중...${NC}"
+ cd ios/App
+ pod install
+
+ if [ $? -ne 0 ]; then
+ echo -e "${RED}CocoaPods 설치 중 오류가 발생했습니다.${NC}"
+ exit 1
+ fi
+
+ # 빌드 타입에 따른 처리
+ if [ "$BUILD_TYPE" = "debug" ]; then
+ # 디버그 빌드
+ echo -e "${YELLOW}디버그 빌드 시작...${NC}"
+
+ # 기본적인 빌드 (IPA 없이)
+ xcodebuild -workspace App.xcworkspace -scheme App -configuration Debug -derivedDataPath build
+
+ if [ $? -ne 0 ]; then
+ echo -e "${RED}디버그 빌드 실패. 오류를 확인하세요.${NC}"
+ exit 1
+ fi
+
+ echo -e "${GREEN}디버그 빌드 성공!${NC}"
+ echo -e "빌드 경로: $(pwd)/build/Build/Products/Debug-iphoneos"
+
+ # 개발자 등록이 된 경우에만 IPA 생성 옵션 제공
+ if [[ "$DEV_REGISTERED" == "y" || "$DEV_REGISTERED" == "Y" ]]; then
# IPA 파일 생성 여부 확인
- echo -e "${YELLOW}IPA 파일을 생성하시겠습니까? (y/n)${NC}"
- read -r CREATE_IPA
- if [ "$CREATE_IPA" = "y" ] || [ "$CREATE_IPA" = "Y" ]; then
+ echo -e "${YELLOW}디버그용 IPA 파일을 생성하시겠습니까? (y/n) [${LAST_DEBUG_IPA_CHOICE:-n}]:${NC}"
+ read -r CREATE_DEBUG_IPA
+ CREATE_DEBUG_IPA=${CREATE_DEBUG_IPA:-${LAST_DEBUG_IPA_CHOICE:-n}}
+ echo "LAST_DEBUG_IPA_CHOICE=$CREATE_DEBUG_IPA" >> "$CONFIG_FILE"
+
+ if [[ "$CREATE_DEBUG_IPA" == "y" || "$CREATE_DEBUG_IPA" == "Y" ]]; then
echo -e "${YELLOW}디버그용 IPA 파일 생성 중...${NC}"
- # 아카이브 생성
- xcodebuild -workspace App.xcworkspace -scheme App -configuration Debug -destination "generic/platform=iOS" clean archive -archivePath "build/App.xcarchive" -allowProvisioningUpdates
-
- if [ $? -ne 0 ]; then
- echo -e "${RED}아카이브 생성 실패. 오류를 확인하세요.${NC}"
- exit 1
- fi
-
- # 익스포트 옵션 파일 생성
- cat > build/ExportOptions.plist << EOF
+ # exportOptions.plist 파일 생성
+ cat > exportOptionsDebug.plist << EOF
@@ -310,129 +226,96 @@ if [ "$BUILD_TYPE" = "debug" ]; then
method
development
teamID
- 54RZTAU6NX
+ ${TEAM_ID}
compileBitcode
- provisioningProfiles
-
- com.lovable.zellyfinance
- iOS Team Provisioning Profile: com.lovable.zellyfinance
-
EOF
- # IPA 생성
- xcodebuild -exportArchive -archivePath "build/App.xcarchive" -exportPath "build/export" -exportOptionsPlist "build/ExportOptions.plist" -allowProvisioningUpdates
+ # 아카이브 생성
+ xcodebuild -workspace App.xcworkspace -scheme App -configuration Debug clean archive -archivePath "build/App-Debug.xcarchive" -allowProvisioningUpdates
if [ $? -ne 0 ]; then
- echo -e "${RED}IPA 생성 실패. 오류를 확인하세요.${NC}"
+ echo -e "${RED}아카이브 생성 실패. 오류를 확인하세요.${NC}"
+ rm exportOptionsDebug.plist
exit 1
fi
- # IPA 파일 이동
- DEBUG_IPA_PATH="build/export/App.ipa"
- DEBUG_DEST_PATH="$HOME/Dev/zellyy-debug.ipa"
+ # IPA 파일 생성
+ xcodebuild -exportArchive -archivePath "build/App-Debug.xcarchive" -exportOptionsPlist exportOptionsDebug.plist -exportPath "build/export-debug" -allowProvisioningUpdates
+
+ if [ $? -ne 0 ]; then
+ echo -e "${RED}IPA 파일 생성 실패. 오류를 확인하세요.${NC}"
+ rm exportOptionsDebug.plist
+ exit 1
+ fi
+
+ rm exportOptionsDebug.plist
+
+ DEBUG_IPA_PATH="build/export-debug/App.ipa"
+ DEBUG_DEST_PATH="$HOME/Dev/zellyy-finance-ios-debug.ipa"
if [ -f "$DEBUG_IPA_PATH" ]; then
echo -e "${GREEN}디버그용 IPA 파일 생성 성공!${NC}"
echo -e "IPA 파일 위치: $(pwd)/$DEBUG_IPA_PATH"
- # Dev 디렉토리로 IPA 복사
+ # 홈 디렉토리로 IPA 복사
cp "$DEBUG_IPA_PATH" "$DEBUG_DEST_PATH"
- echo -e "${GREEN}IPA를 Dev 디렉토리에 복사했습니다: $DEBUG_DEST_PATH${NC}"
+ echo -e "${GREEN}IPA를 홈 디렉토리에 복사했습니다: $DEBUG_DEST_PATH${NC}"
echo -e "${YELLOW}다음 방법으로 다른 기기에 설치할 수 있습니다:${NC}"
echo "1. Apple Configurator 2 앱 사용"
- echo "2. iTunes를 통한 설치"
- echo "3. 무선 설치 서비스 사용"
+ echo "2. 기기 등록 및 프로비저닝 프로파일이 있는 경우 iTunes로 설치"
+ echo "3. TestFlight를 통한 배포 (App Store Connect에 업로드 필요)"
else
- echo -e "${RED}IPA 파일을 찾을 수 없습니다.${NC}"
+ echo -e "${RED}IPA 파일 생성 실패. 오류를 확인하세요.${NC}"
fi
fi
- ;;
-
- *)
- echo -e "${RED}잘못된 선택입니다. 빌드를 취소합니다.${NC}"
- exit 1
- ;;
- esac
-
-elif [ "$BUILD_TYPE" = "release" ]; then
- # 릴리즈 빌드
- echo -e "${YELLOW}릴리즈 빌드 시작...${NC}"
-
- # 개발자 계정 정보 입력
- echo -e "${YELLOW}Apple 개발자 계정 이메일을 입력하세요 [${LAST_APPLE_ID:-}]:${NC}"
- read -r APPLE_ID
- APPLE_ID=${APPLE_ID:-${LAST_APPLE_ID:-}}
-
- # 설정 저장
- echo "LAST_APPLE_ID=$APPLE_ID" >> "$CONFIG_FILE"
-
- # 연결된 기기 확인
- echo -e "${YELLOW}연결된 iOS 기기 확인 중...${NC}"
- DEVICE_LIST=$(xcrun xctrace list devices | grep -v "^==" | sed '/^$/d')
-
- # 실제 기기와 시뮬레이터 분리
- REAL_DEVICES=$(echo "$DEVICE_LIST" | grep -v "Simulator" | grep -v "MacBook" | grep -v "Mac")
- SIMULATORS=$(echo "$DEVICE_LIST" | grep "Simulator" || echo "")
-
- # 기기 목록 표시
- echo -e "${YELLOW}연결된 실제 기기:${NC}"
- if [ -z "$REAL_DEVICES" ]; then
- echo "연결된 실제 기기가 없습니다."
- echo "USB 케이블로 iOS 기기를 연결하고 다시 시도하세요."
- exit 1
- fi
-
- # 실제 기기 목록 표시 (번호 부여)
- DEVICE_COUNTER=1
- DEVICE_ARRAY=()
- DEVICE_ID_ARRAY=()
-
- while IFS= read -r line; do
- DEVICE_NAME=$(echo "$line" | sed -E 's/^(.*) \(([0-9\.]+)\) \((.*)\)$/\1/')
- DEVICE_OS=$(echo "$line" | sed -E 's/^(.*) \(([0-9\.]+)\) \((.*)\)$/\2/')
- DEVICE_ID=$(echo "$line" | sed -E 's/^(.*) \(([0-9\.]+)\) \((.*)\)$/\3/')
+ else
+ echo -e "${YELLOW}개발자 등록이 필요하여 IPA 파일 생성 단계를 건너뜁니다.${NC}"
+ echo -e "${YELLOW}시뮬레이터에서 앱을 테스트하거나 Apple 개발자 계정을 등록하세요.${NC}"
+ fi
- echo "$DEVICE_COUNTER) $DEVICE_NAME (iOS $DEVICE_OS)"
- DEVICE_ARRAY+=("$DEVICE_NAME")
- DEVICE_ID_ARRAY+=("$DEVICE_ID")
- ((DEVICE_COUNTER++))
- done <<< "$REAL_DEVICES"
-
- # 기기 선택
- echo -e "${YELLOW}빌드 및 설치할 기기 번호를 선택하세요 [${LAST_DEVICE_INDEX:-1}]:${NC}"
- read -r DEVICE_INDEX
- DEVICE_INDEX=${DEVICE_INDEX:-${LAST_DEVICE_INDEX:-1}}
-
- # 인덱스 범위 검증
- if ! [[ "$DEVICE_INDEX" =~ ^[0-9]+$ ]] || [ "$DEVICE_INDEX" -lt 1 ] || [ "$DEVICE_INDEX" -gt ${#DEVICE_ARRAY[@]} ]; then
- echo -e "${RED}잘못된 기기 번호입니다. 1부터 ${#DEVICE_ARRAY[@]} 사이의 숫자를 입력하세요.${NC}"
- exit 1
- fi
-
- # 선택된 기기 정보
- SELECTED_INDEX=$((DEVICE_INDEX-1))
- DEVICE_NAME="${DEVICE_ARRAY[$SELECTED_INDEX]}"
- DEVICE_ID="${DEVICE_ID_ARRAY[$SELECTED_INDEX]}"
- echo -e "${YELLOW}선택된 기기: $DEVICE_NAME (ID: $DEVICE_ID)${NC}"
-
- # 설정 저장
- echo "LAST_DEVICE_INDEX=$DEVICE_INDEX" >> "$CONFIG_FILE"
-
- # 아카이브 생성
- echo -e "${YELLOW}App Store 배포용 아카이브 생성 중...${NC}"
- xcodebuild -workspace App.xcworkspace -scheme App -configuration Release -destination "id=$DEVICE_ID" clean archive -archivePath "build/App.xcarchive" -allowProvisioningUpdates
-
- if [ $? -ne 0 ]; then
- echo -e "${RED}아카이브 생성 실패. 오류를 확인하세요.${NC}"
- exit 1
- fi
-
- # 익스포트 옵션 파일 생성
- cat > build/ExportOptions.plist << EOF
+ elif [ "$BUILD_TYPE" = "release" ]; then
+ # 릴리즈 빌드
+ echo -e "${YELLOW}릴리즈 빌드 시작...${NC}"
+
+ # 기본 Xcode 빌드
+ xcodebuild -workspace App.xcworkspace -scheme App -configuration Release -derivedDataPath build
+
+ if [ $? -ne 0 ]; then
+ echo -e "${RED}릴리즈 빌드 실패. 오류를 확인하세요.${NC}"
+ exit 1
+ fi
+
+ echo -e "${GREEN}릴리즈 빌드 성공!${NC}"
+ echo -e "빌드 경로: $(pwd)/build/Build/Products/Release-iphoneos"
+
+ # 개발자 등록이 된 경우에만 아카이브 생성 옵션 제공
+ if [[ "$DEV_REGISTERED" == "y" || "$DEV_REGISTERED" == "Y" ]]; then
+ # App Store 배포용 아카이브 생성 여부 확인
+ echo -e "${YELLOW}App Store 배포용 아카이브를 생성하시겠습니까? (y/n) [${LAST_RELEASE_ARCHIVE_CHOICE:-n}]:${NC}"
+ read -r CREATE_RELEASE_ARCHIVE
+ CREATE_RELEASE_ARCHIVE=${CREATE_RELEASE_ARCHIVE:-${LAST_RELEASE_ARCHIVE_CHOICE:-n}}
+ echo "LAST_RELEASE_ARCHIVE_CHOICE=$CREATE_RELEASE_ARCHIVE" >> "$CONFIG_FILE"
+
+ if [[ "$CREATE_RELEASE_ARCHIVE" == "y" || "$CREATE_RELEASE_ARCHIVE" == "Y" ]]; then
+ echo -e "${YELLOW}App Store 배포용 아카이브 생성 중...${NC}"
+
+ # 아카이브 생성
+ xcodebuild -workspace App.xcworkspace -scheme App -configuration Release clean archive -archivePath "build/App.xcarchive" -allowProvisioningUpdates
+
+ if [ $? -ne 0 ]; then
+ echo -e "${RED}아카이브 생성 실패. 오류를 확인하세요.${NC}"
+ exit 1
+ fi
+
+ echo -e "${GREEN}아카이브 생성 성공!${NC}"
+ echo -e "아카이브 위치: $(pwd)/build/App.xcarchive"
+
+ # exportOptions.plist 파일 생성
+ cat > exportOptions.plist << EOF
@@ -440,58 +323,69 @@ elif [ "$BUILD_TYPE" = "release" ]; then
method
app-store
teamID
- 54RZTAU6NX
- uploadSymbols
-
+ ${TEAM_ID}
uploadBitcode
+ uploadSymbols
+
provisioningProfiles
com.lovable.zellyfinance
- Zellyy Finance Distribution
+ Zellyy Finance App Store
EOF
-
- # IPA 생성
- echo -e "${YELLOW}App Store 제출용 IPA 파일 생성 중...${NC}"
- xcodebuild -exportArchive -archivePath "build/App.xcarchive" -exportPath "build/export" -exportOptionsPlist "build/ExportOptions.plist" -allowProvisioningUpdates
-
- if [ $? -ne 0 ]; then
- echo -e "${RED}IPA 생성 실패. 오류를 확인하세요.${NC}"
- exit 1
- fi
-
- IPA_PATH="build/export/App.ipa"
- DEST_PATH="$HOME/Dev/zellyy-release/zellyy-ios.ipa"
-
- if [ -f "$IPA_PATH" ]; then
- echo -e "${GREEN}IPA 파일 생성 성공!${NC}"
- echo -e "IPA 파일 위치: $(pwd)/$IPA_PATH"
-
- # 저장 디렉토리 확인 및 생성
- RELEASE_DIR="$HOME/Dev/zellyy-release"
- if [ ! -d "$RELEASE_DIR" ]; then
- mkdir -p "$RELEASE_DIR"
+
+ # IPA 파일 생성
+ echo -e "${YELLOW}IPA 파일 생성 중...${NC}"
+ xcodebuild -exportArchive -archivePath "build/App.xcarchive" -exportOptionsPlist exportOptions.plist -exportPath "build/export" -allowProvisioningUpdates
+
+ if [ $? -ne 0 ]; then
+ echo -e "${RED}IPA 파일 생성 실패. 오류를 확인하세요.${NC}"
+ rm exportOptions.plist
+ exit 1
+ fi
+
+ rm exportOptions.plist
+
+ IPA_PATH="build/export/App.ipa"
+ DEST_PATH="$HOME/Dev/zellyy-finance-ios.ipa"
+
+ if [ -f "$IPA_PATH" ]; then
+ echo -e "${GREEN}IPA 파일 생성 성공!${NC}"
+ echo -e "IPA 파일 위치: $(pwd)/$IPA_PATH"
+
+ # 홈 디렉토리로 IPA 복사
+ cp "$IPA_PATH" "$DEST_PATH"
+ echo -e "${GREEN}IPA를 홈 디렉토리에 복사했습니다: $DEST_PATH${NC}"
+
+ echo -e "${YELLOW}다음 단계:${NC}"
+ echo "1. App Store Connect에 로그인: https://appstoreconnect.apple.com"
+ echo "2. 앱 > 젤리의 적자탈출 > iOS 앱 > 빌드 섹션으로 이동"
+ echo "3. Transporter 앱을 사용하여 IPA 파일 업로드: $DEST_PATH"
+ echo "4. 검토 과정이 완료될 때까지 기다리기 (보통 몇 시간에서 24시간 소요)"
+ else
+ echo -e "${RED}IPA 파일 생성 실패. 오류를 확인하세요.${NC}"
+ exit 1
+ fi
+ fi
+ else
+ echo -e "${YELLOW}개발자 등록이 필요하여 아카이브 생성 단계를 건너뜁니다.${NC}"
+ echo -e "${YELLOW}시뮬레이터에서 앱을 테스트하거나 Apple 개발자 계정을 등록하세요.${NC}"
fi
- # Dev 디렉토리로 IPA 복사
- cp "$IPA_PATH" "$DEST_PATH"
- echo -e "${GREEN}IPA를 저장했습니다: $DEST_PATH${NC}"
-
- echo -e "${YELLOW}다음 단계:${NC}"
- echo "1. App Store Connect에 로그인: https://appstoreconnect.apple.com"
- echo "2. 앱 업로드 도구(Application Loader)를 사용하여 IPA 파일 업로드"
- echo "3. 또는 다음 명령어로 직접 업로드: xcrun altool --upload-app -f \"$DEST_PATH\" -t ios -u \"$APPLE_ID\" -p \"앱 전용 비밀번호\""
else
- echo -e "${RED}IPA 파일을 찾을 수 없습니다.${NC}"
+ echo -e "${RED}지원되지 않는 빌드 타입입니다: $BUILD_TYPE${NC}"
+ echo -e "${YELLOW}사용법: ./build-ios.sh${NC}"
+ exit 1
fi
-else
- echo -e "${RED}알 수 없는 빌드 타입입니다: $BUILD_TYPE${NC}"
- exit 1
-fi
-echo -e "\n${GREEN}빌드 프로세스가 완료되었습니다.${NC}"
-echo -e "빌드 종료 시간: $(date)"
-exit 0
+ # 빌드 완료 후 인증서 신뢰 안내 표시
+ show_certificate_trust_guide
+
+ echo -e "${GREEN}빌드 프로세스 완료: $(date)${NC}"
+}
+
+# 메인 프로그램 시작
+show_main_menu
diff --git a/ios-version-manager.sh b/ios-version-manager.sh
new file mode 100755
index 0000000..e9d0695
--- /dev/null
+++ b/ios-version-manager.sh
@@ -0,0 +1,127 @@
+#!/bin/bash
+
+# iOS 앱 버전 관리 스크립트
+# 사용법: ./ios-version-manager.sh
+
+# 색상 정의
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+RED='\033[0;31m'
+NC='\033[0m' # No Color
+
+# 프로젝트 디렉토리로 이동
+cd "$(dirname "$0")"
+
+# 프로젝트 파일 경로
+XCODEPROJ_FILE="ios/App/App.xcodeproj/project.pbxproj"
+
+# 설정 파일 경로
+CONFIG_FILE="$HOME/.zellyy_ios_build.conf"
+
+# 버전 정보 관리 함수
+manage_version_info() {
+ # 현재 버전 및 빌드 번호 가져오기
+ if [ -f "$XCODEPROJ_FILE" ]; then
+ MARKETING_VERSION=$(grep -A 1 "MARKETING_VERSION" "$XCODEPROJ_FILE" | grep -o 'MARKETING_VERSION = [0-9]\+\.[0-9]\+\(\.[0-9]\+\)*' | sed 's/MARKETING_VERSION = //' | head -1)
+ CURRENT_PROJECT_VERSION=$(grep -A 1 "CURRENT_PROJECT_VERSION" "$XCODEPROJ_FILE" | grep -o '[0-9]\+' | head -1)
+
+ echo -e "${YELLOW}현재 버전 정보:${NC}"
+ echo -e "마케팅 버전: ${GREEN}$MARKETING_VERSION${NC}"
+ echo -e "빌드 번호: ${GREEN}$CURRENT_PROJECT_VERSION${NC}"
+
+ # 설정 파일 확인 및 로드
+ if [ -f "$CONFIG_FILE" ]; then
+ source "$CONFIG_FILE"
+ fi
+
+ # 버전 수정 여부 확인
+ echo -e "\n${YELLOW}버전 정보를 수정하시겠습니까? (y/n) [${LAST_VERSION_CHOICE:-n}]:${NC}"
+ read -r UPDATE_VERSION
+ UPDATE_VERSION=${UPDATE_VERSION:-${LAST_VERSION_CHOICE:-n}}
+
+ if [[ "$UPDATE_VERSION" == "y" || "$UPDATE_VERSION" == "Y" ]]; then
+ echo -e "\n${YELLOW}새 마케팅 버전을 입력하세요 (현재: $MARKETING_VERSION) [${LAST_MARKETING_VERSION:-$MARKETING_VERSION}]:${NC}"
+ read -r NEW_MARKETING_VERSION
+ NEW_MARKETING_VERSION=${NEW_MARKETING_VERSION:-${LAST_MARKETING_VERSION:-$MARKETING_VERSION}}
+
+ if [ -z "$NEW_MARKETING_VERSION" ]; then
+ NEW_MARKETING_VERSION=$MARKETING_VERSION
+ fi
+
+ echo -e "${YELLOW}새 빌드 번호를 입력하세요 (현재: $CURRENT_PROJECT_VERSION) [${LAST_BUILD_NUMBER:-$CURRENT_PROJECT_VERSION}]:${NC}"
+ read -r NEW_PROJECT_VERSION
+ NEW_PROJECT_VERSION=${NEW_PROJECT_VERSION:-${LAST_BUILD_NUMBER:-$CURRENT_PROJECT_VERSION}}
+
+ if [ -z "$NEW_PROJECT_VERSION" ]; then
+ NEW_PROJECT_VERSION=$CURRENT_PROJECT_VERSION
+ fi
+
+ # 버전 정보 업데이트
+ # macOS에서는 sed -i에 백업 확장자를 지정해야 함
+ sed -i '' "s/MARKETING_VERSION = [0-9][0-9]*\.[0-9][0-9]*\(\.[0-9][0-9]*\)*/MARKETING_VERSION = $NEW_MARKETING_VERSION/g" "$XCODEPROJ_FILE"
+ sed -i '' "s/CURRENT_PROJECT_VERSION = $CURRENT_PROJECT_VERSION;/CURRENT_PROJECT_VERSION = $NEW_PROJECT_VERSION;/g" "$XCODEPROJ_FILE"
+
+ echo -e "\n${GREEN}버전 정보가 업데이트되었습니다:${NC}"
+ echo -e "마케팅 버전: ${GREEN}$NEW_MARKETING_VERSION${NC}"
+ echo -e "빌드 번호: ${GREEN}$NEW_PROJECT_VERSION${NC}"
+
+ # AppVersionInfo.tsx 파일의 하드코딩된 버전 정보 업데이트
+ update_app_version_info "$NEW_MARKETING_VERSION" "$NEW_PROJECT_VERSION"
+
+ # 설정 저장
+ echo "LAST_VERSION_CHOICE=y" > "$CONFIG_FILE"
+ echo "LAST_MARKETING_VERSION=$NEW_MARKETING_VERSION" >> "$CONFIG_FILE"
+ echo "LAST_BUILD_NUMBER=$NEW_PROJECT_VERSION" >> "$CONFIG_FILE"
+
+ # 성공 코드 반환
+ return 0
+ else
+ echo -e "${YELLOW}현재 버전 정보를 유지합니다.${NC}"
+ # 설정 저장
+ echo "LAST_VERSION_CHOICE=n" > "$CONFIG_FILE"
+
+ # 성공 코드 반환
+ return 0
+ fi
+ else
+ echo -e "${RED}프로젝트 파일을 찾을 수 없습니다: $XCODEPROJ_FILE${NC}"
+ # 실패 코드 반환
+ return 1
+ fi
+}
+
+# AppVersionInfo.tsx 파일 업데이트 함수
+update_app_version_info() {
+ local version_name=$1
+ local build_number=$2
+ local app_version_file="src/components/AppVersionInfo.tsx"
+
+ if [ ! -f "$app_version_file" ]; then
+ echo -e "${RED}AppVersionInfo.tsx 파일을 찾을 수 없습니다.${NC}"
+ return 1
+ fi
+
+ echo -e "${YELLOW}AppVersionInfo.tsx 파일의 버전 정보 업데이트 중...${NC}"
+
+ # 백업 파일 생성
+ cp "$app_version_file" "${app_version_file}.bak"
+
+ # AppVersionInfo.tsx 파일에서 하드코딩된 버전 정보 업데이트
+ # 인터페이스/타입 정의와 실제 값 할당 구분하여 패턴 수정
+ sed -i '' "s/versionName: '[^']*'/versionName: '$version_name'/" "$app_version_file"
+
+ # buildNumber 수정 - 객체 내에서만 수정
+ sed -i '' "/hardcodedVersionInfo/,/}/s/buildNumber: [0-9]*/buildNumber: $build_number/" "$app_version_file"
+
+ # versionCode 수정 - 객체 내에서만 수정 (iOS에서는 versionCode를 빌드 번호와 동일하게 설정)
+ sed -i '' "/hardcodedVersionInfo/,/}/s/versionCode: [0-9]*/versionCode: $build_number/" "$app_version_file"
+
+ echo -e "${GREEN}AppVersionInfo.tsx 파일의 버전 정보가 업데이트되었습니다.${NC}"
+ return 0
+}
+
+# 스크립트가 직접 실행될 때만 버전 관리 함수 실행
+if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
+ manage_version_info
+ exit $?
+fi