diff --git a/build-apk.sh b/build-apk.sh index 615d2a5..58998b7 100755 --- a/build-apk.sh +++ b/build-apk.sh @@ -87,14 +87,30 @@ rm -rf dist echo -e "${GREEN}빌드 캐시가 삭제되었습니다.${NC}" # 빌드 넘버 및 버전 코드 업데이트 -echo -e "${YELLOW}build.gradle 파일 업데이트 중...${NC}" -# 빌드 넘버 업데이트 +echo -e "${YELLOW}버전 정보 파일 업데이트 중...${NC}" + +# version.properties 파일 업데이트 +echo "buildNumber=$BUILD_NUMBER" > android/version.properties +echo "versionCode=$NEW_VERSION_CODE" >> android/version.properties +echo "versionName=$(grep -o 'versionName "[^"]*"' android/app/build.gradle | sed 's/versionName "//' | sed 's/"//')" >> android/version.properties + +# app_version.json 파일 업데이트 +VERSION_NAME=$(grep -o 'versionName "[^"]*"' android/app/build.gradle | sed 's/versionName "//' | sed 's/"//') +cat > android/app_version.json << EOF +{ + "versionCode": $NEW_VERSION_CODE, + "versionName": "$VERSION_NAME", + "buildNumber": $BUILD_NUMBER, + "notes": "사용자가 수정한 버전 정보입니다. 이 파일을 편집하여 앱 버전 정보를 변경할 수 있습니다." +} +EOF + +# build.gradle 파일 업데이트 (이전 방식 유지) sed -i '' "s/buildConfigField \"int\", \"BUILD_NUMBER\", \"[0-9]*\"/buildConfigField \"int\", \"BUILD_NUMBER\", \"$BUILD_NUMBER\"/" android/app/build.gradle -# 버전 코드 업데이트 sed -i '' "s/versionCode [0-9]*/versionCode $NEW_VERSION_CODE/" android/app/build.gradle if [ $? -ne 0 ]; then - echo -e "${RED}build.gradle 업데이트 실패. 빌드 프로세스를 중단합니다.${NC}" + echo -e "${RED}버전 정보 파일 업데이트 실패. 빌드 프로세스를 중단합니다.${NC}" exit 1 fi echo -e "${GREEN}빌드 넘버가 ${BUILD_NUMBER}(으)로, 버전 코드가 ${NEW_VERSION_CODE}(으)로 업데이트되었습니다.${NC}" diff --git a/build-ios.sh b/build-ios.sh old mode 100644 new mode 100755 index 533c62a..de5ac58 --- a/build-ios.sh +++ b/build-ios.sh @@ -12,24 +12,90 @@ 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 +fi + # 빌드 타입 선택 메뉴 -echo -e "${YELLOW}Zellyy Finance iOS 앱 빌드 스크립트${NC}" +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): " +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}" @@ -41,55 +107,28 @@ case $CHOICE in ;; esac -# 현재 버전 및 빌드 번호 가져오기 -MARKETING_VERSION=$(grep -A 1 "MARKETING_VERSION" ios/App/App.xcodeproj/project.pbxproj | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1) -CURRENT_PROJECT_VERSION=$(grep -A 1 "CURRENT_PROJECT_VERSION" ios/App/App.xcodeproj/project.pbxproj | grep -o '[0-9]\+' | head -1) +echo -e "${YELLOW}Zellyy Finance iOS 앱 빌드 시작 (${BUILD_TYPE}, 마케팅 버전: ${MARKETING_VERSION}, 빌드 번호: ${NEW_PROJECT_VERSION}): $(date)${NC}" -echo -e "${YELLOW}현재 마케팅 버전: ${MARKETING_VERSION}${NC}" -echo -e "${YELLOW}현재 빌드 번호: ${CURRENT_PROJECT_VERSION}${NC}" - -# 빌드 넘버 입력 받기 -echo -e "${YELLOW}새 빌드 번호를 입력하세요 (현재: ${CURRENT_PROJECT_VERSION}):${NC}" -read -r BUILD_NUMBER - -# 빌드 넘버 유효성 검사 -if ! [[ "$BUILD_NUMBER" =~ ^[0-9]+$ ]]; then - echo -e "${RED}유효하지 않은 빌드 번호입니다. 숫자만 입력해주세요.${NC}" - exit 1 +# 빌드 디렉토리 문제 해결 +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 -# 릴리즈 빌드인 경우 마케팅 버전 업데이트 여부 확인 -if [[ "$BUILD_TYPE" == "release" ]]; then - echo -e "${YELLOW}마케팅 버전을 업데이트하시겠습니까? 현재 버전: ${MARKETING_VERSION} (y/n)${NC}" - read -r UPDATE_VERSION - if [[ "$UPDATE_VERSION" == "y" || "$UPDATE_VERSION" == "Y" ]]; then - echo -e "${YELLOW}새 마케팅 버전을 입력하세요 (형식: x.y.z):${NC}" - read -r NEW_MARKETING_VERSION - - # 마케팅 버전 유효성 검사 - if ! [[ "$NEW_MARKETING_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo -e "${RED}유효하지 않은 마케팅 버전입니다. x.y.z 형식으로 입력해주세요.${NC}" - exit 1 - fi - - echo -e "${GREEN}마케팅 버전이 ${NEW_MARKETING_VERSION}(으)로 업데이트됩니다.${NC}" - # 마케팅 버전 업데이트 - sed -i '' "s/MARKETING_VERSION = $MARKETING_VERSION;/MARKETING_VERSION = $NEW_MARKETING_VERSION;/g" ios/App/App.xcodeproj/project.pbxproj - MARKETING_VERSION=$NEW_MARKETING_VERSION - fi +# 캐시 정리 +echo -e "${YELLOW}캐시 정리 중...${NC}" +if [ -d "node_modules/.cache" ]; then + rm -rf node_modules/.cache fi - -echo -e "${YELLOW}Zellyy Finance iOS 앱 빌드 시작 (${BUILD_TYPE}, 마케팅 버전: ${MARKETING_VERSION}, 빌드 번호: ${BUILD_NUMBER}): $(date)${NC}" - -# 빌드 번호 업데이트 -echo -e "${YELLOW}project.pbxproj 파일 업데이트 중...${NC}" -sed -i '' "s/CURRENT_PROJECT_VERSION = $CURRENT_PROJECT_VERSION;/CURRENT_PROJECT_VERSION = $BUILD_NUMBER;/g" ios/App/App.xcodeproj/project.pbxproj - -if [ $? -ne 0 ]; then - echo -e "${RED}project.pbxproj 업데이트 실패. 빌드 프로세스를 중단합니다.${NC}" - exit 1 +if [ -d "ios/App/App/public" ]; then + rm -rf ios/App/App/public fi -echo -e "${GREEN}빌드 번호가 ${BUILD_NUMBER}(으)로 업데이트되었습니다.${NC}" # 1. 웹 앱 빌드 echo -e "${YELLOW}1. 웹 앱 빌드 중...${NC}" @@ -172,104 +211,143 @@ if [ "$BUILD_TYPE" = "debug" ]; then echo -e "${YELLOW}실제 기기용 빌드 시작...${NC}" # 개발자 계정 정보 입력 - echo -e "${YELLOW}Apple 개발자 계정 이메일을 입력하세요:${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}" - CONNECTED_DEVICES=$(xcrun xctrace list devices 2>/dev/null | grep -v "Simulator" | grep -v "===" | grep -v "^$" | grep -v "Devices" | sed 's/ (.*)//') + DEVICE_LIST=$(xcrun xctrace list devices | grep -v "^==" | sed '/^$/d') - if [ -z "$CONNECTED_DEVICES" ]; then - echo -e "${RED}연결된 iOS 기기가 없습니다. 기기를 연결하고 다시 시도하세요.${NC}" + # 실제 기기와 시뮬레이터 분리 + 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 - echo -e "${YELLOW}연결된 기기:${NC}" - echo "$CONNECTED_DEVICES" + # 실제 기기 목록 표시 (번호 부여) + DEVICE_COUNTER=1 + DEVICE_ARRAY=() + DEVICE_ID_ARRAY=() - echo -e "${YELLOW}빌드 및 설치할 기기 이름을 정확히 입력하세요:${NC}" - read -r DEVICE_NAME + 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 "name=$DEVICE_NAME" -allowProvisioningUpdates -derivedDataPath build + # 프로비저닝 프로파일 자동 관리 옵션으로 빌드 + 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. 기기가 개발자 계정에 등록되지 않음" - echo "4. 기기 이름을 정확히 입력하지 않음" - echo -e "${YELLOW}해결 방법:${NC}" - echo "1. Xcode에서 수동으로 프로젝트를 열고 계정 설정 확인" - echo "2. Xcode > Settings > Accounts에서 Apple ID 로그인 확인" - echo "3. 기기를 개발자 계정에 등록 (Xcode > Window > Devices and Simulators)" + echo "3. 기기가 개발자 모드로 설정되지 않음" exit 1 fi echo -e "${GREEN}디버그 빌드 및 기기 설치 성공!${NC}" - echo -e "${YELLOW}앱이 '$DEVICE_NAME' 기기에 설치되었습니다.${NC}" - # IPA 파일 생성 (선택 사항) - echo -e "${YELLOW}디버그용 IPA 파일을 생성하시겠습니까? (y/n)${NC}" + # IPA 파일 생성 여부 확인 + echo -e "${YELLOW}IPA 파일을 생성하시겠습니까? (y/n)${NC}" read -r CREATE_IPA if [ "$CREATE_IPA" = "y" ] || [ "$CREATE_IPA" = "Y" ]; then echo -e "${YELLOW}디버그용 IPA 파일 생성 중...${NC}" - # 임시 exportOptions.plist 생성 - cat > exportOptionsDebug.plist << EOF + # 아카이브 생성 + 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 method development - signingStyle - automatic - stripSwiftSymbols + teamID + 54RZTAU6NX + compileBitcode + provisioningProfiles + + com.lovable.zellyfinance + iOS Team Provisioning Profile: com.lovable.zellyfinance + EOF - # 아카이브 생성 - xcodebuild -workspace App.xcworkspace -scheme App -configuration Debug clean archive -archivePath "build/App-Debug.xcarchive" -allowProvisioningUpdates + # IPA 생성 + xcodebuild -exportArchive -archivePath "build/App.xcarchive" -exportPath "build/export" -exportOptionsPlist "build/ExportOptions.plist" -allowProvisioningUpdates if [ $? -ne 0 ]; then - echo -e "${RED}아카이브 생성 실패. 오류를 확인하세요.${NC}" - rm exportOptionsDebug.plist + echo -e "${RED}IPA 생성 실패. 오류를 확인하세요.${NC}" exit 1 fi - # 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" + # IPA 파일 이동 + DEBUG_IPA_PATH="build/export/App.ipa" + DEBUG_DEST_PATH="$HOME/Dev/zellyy-debug.ipa" if [ -f "$DEBUG_IPA_PATH" ]; then echo -e "${GREEN}디버그용 IPA 파일 생성 성공!${NC}" echo -e "IPA 파일 위치: $(pwd)/$DEBUG_IPA_PATH" - # 홈 디렉토리로 IPA 복사 + # Dev 디렉토리로 IPA 복사 cp "$DEBUG_IPA_PATH" "$DEBUG_DEST_PATH" - echo -e "${GREEN}IPA를 홈 디렉토리에 복사했습니다: $DEBUG_DEST_PATH${NC}" + echo -e "${GREEN}IPA를 Dev 디렉토리에 복사했습니다: $DEBUG_DEST_PATH${NC}" echo -e "${YELLOW}다음 방법으로 다른 기기에 설치할 수 있습니다:${NC}" echo "1. Apple Configurator 2 앱 사용" - echo "2. 기기 등록 및 프로비저닝 프로파일이 있는 경우 iTunes로 설치" - echo "3. TestFlight를 통한 배포 (App Store Connect에 업로드 필요)" + echo "2. iTunes를 통한 설치" + echo "3. 무선 설치 서비스 사용" else - echo -e "${RED}IPA 파일 생성 실패. 오류를 확인하세요.${NC}" + echo -e "${RED}IPA 파일을 찾을 수 없습니다.${NC}" fi fi ;; @@ -282,57 +360,138 @@ EOF elif [ "$BUILD_TYPE" = "release" ]; then # 릴리즈 빌드 - echo -e "${YELLOW}App Store 배포용 아카이브 생성 중...${NC}" + echo -e "${YELLOW}릴리즈 빌드 시작...${NC}" # 개발자 계정 정보 입력 - echo -e "${YELLOW}Apple 개발자 계정 이메일을 입력하세요:${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/') + + 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" # 아카이브 생성 - xcodebuild -workspace App.xcworkspace -scheme App -configuration Release clean archive -archivePath "build/App.xcarchive" -allowProvisioningUpdates + 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 - echo -e "${GREEN}아카이브 생성 성공!${NC}" - echo -e "아카이브 위치: $(pwd)/build/App.xcarchive" + # 익스포트 옵션 파일 생성 + cat > build/ExportOptions.plist << EOF + + + + + method + app-store + teamID + 54RZTAU6NX + uploadSymbols + + uploadBitcode + + provisioningProfiles + + com.lovable.zellyfinance + Zellyy Finance Distribution + + + +EOF - # IPA 파일 생성 - echo -e "${YELLOW}IPA 파일 생성 중...${NC}" - xcodebuild -exportArchive -archivePath "build/App.xcarchive" -exportOptionsPlist exportOptions.plist -exportPath "build/export" -allowProvisioningUpdates + # 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}" + echo -e "${RED}IPA 생성 실패. 오류를 확인하세요.${NC}" exit 1 fi IPA_PATH="build/export/App.ipa" - DEST_PATH="$HOME/Dev/zellyy-finance-ios.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" - # 홈 디렉토리로 IPA 복사 + # 저장 디렉토리 확인 및 생성 + RELEASE_DIR="$HOME/Dev/zellyy-release" + if [ ! -d "$RELEASE_DIR" ]; then + mkdir -p "$RELEASE_DIR" + fi + + # Dev 디렉토리로 IPA 복사 cp "$IPA_PATH" "$DEST_PATH" - echo -e "${GREEN}IPA를 홈 디렉토리에 복사했습니다: $DEST_PATH${NC}" + 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시간 소요)" + 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}" - exit 1 + echo -e "${RED}IPA 파일을 찾을 수 없습니다.${NC}" fi - else - echo -e "${RED}지원되지 않는 빌드 타입입니다: $BUILD_TYPE${NC}" - echo -e "${YELLOW}사용법: ./build-ios.sh${NC}" + echo -e "${RED}알 수 없는 빌드 타입입니다: $BUILD_TYPE${NC}" exit 1 fi -echo -e "${GREEN}빌드 프로세스 완료: $(date)${NC}" +echo -e "\n${GREEN}빌드 프로세스가 완료되었습니다.${NC}" +echo -e "빌드 종료 시간: $(date)" +exit 0