377 lines
14 KiB
Bash
Executable File
377 lines
14 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# iOS 앱 빌드 스크립트 (디버그 및 릴리즈 버전)
|
|
# 사용법: ./build-ios.sh
|
|
|
|
# 색상 정의
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
RED='\033[0;31m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# 프로젝트 디렉토리로 이동
|
|
cd "$(dirname "$0")"
|
|
|
|
# 설정 파일 확인 및 로드
|
|
CONFIG_FILE="$HOME/.zellyy_ios_build.conf"
|
|
if [ -f "$CONFIG_FILE" ]; then
|
|
source "$CONFIG_FILE"
|
|
fi
|
|
|
|
# 로그 폴더 설정
|
|
LOG_DIR="log"
|
|
mkdir -p "$LOG_DIR"
|
|
LOG_FILE="$LOG_DIR/app_build.log"
|
|
ERROR_LOG_FILE="$LOG_DIR/app_error.log"
|
|
|
|
# 모든 출력을 로그로 리다이렉트
|
|
exec > >(tee -a "$LOG_FILE") 2> >(tee -a "$ERROR_LOG_FILE" >&2)
|
|
|
|
# 캐시 삭제 함수
|
|
clean_cache() {
|
|
echo -e "${YELLOW}캐시 삭제 중...${NC}"
|
|
|
|
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}"
|
|
clean_cache
|
|
start_build_process
|
|
;;
|
|
2)
|
|
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}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 -allowProvisioningUpdates
|
|
|
|
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) [${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 archive -workspace App.xcworkspace -scheme App -configuration Debug -archivePath build/App.xcarchive -allowProvisioningUpdates
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}아카이브 생성 실패. 오류를 확인하세요.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# IPA Export (기본 경로 사용)
|
|
EXPORT_OPTIONS_PLIST_PATH="build/DebugExportOptions.plist"
|
|
cat > "$EXPORT_OPTIONS_PLIST_PATH" <<EOL
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>method</key>
|
|
<string>development</string>
|
|
<key>teamID</key>
|
|
<string>$TEAM_ID</string>
|
|
<key>signingStyle</key>
|
|
<string>automatic</string>
|
|
</dict>
|
|
</plist>
|
|
EOL
|
|
xcodebuild -exportArchive -archivePath build/App.xcarchive -exportPath build/debug_ipa -exportOptionsPlist "$EXPORT_OPTIONS_PLIST_PATH" -allowProvisioningUpdates
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}디버그 IPA 파일 생성 실패. 오류를 확인하세요.${NC}"
|
|
echo -e "${YELLOW}Apple 개발자 계정 정보(팀 ID: $TEAM_ID)가 정확한지, Xcode에서 서명 설정이 완료되었는지 확인하세요.${NC}"
|
|
echo -e "${GREEN}Xcode 빌드는 완료되었을 수 있습니다. Xcode에서 직접 확인하거나 실행해 보세요.${NC}"
|
|
else
|
|
echo -e "${GREEN}디버그 IPA 파일 생성 완료: build/debug_ipa/App.ipa${NC}"
|
|
fi
|
|
fi
|
|
else
|
|
echo -e "${YELLOW}개발자 등록이 필요하여 IPA 파일 생성 단계를 건너<0xEB><0x9B><0x81>니다.${NC}"
|
|
echo -e "${YELLOW}앱을 기기에서 테스트하려면 Xcode에서 '${WORKSPACE_DIR}/ios/App/App.xcworkspace' 파일을 열고,${NC}"
|
|
echo -e "${YELLOW}USB로 연결된 기기를 선택한 후 직접 빌드 및 실행하세요.${NC}"
|
|
fi
|
|
|
|
elif [ "$BUILD_TYPE" = "release" ]; then
|
|
# 릴리즈 빌드
|
|
echo -e "${YELLOW}릴리즈 빌드 시작...${NC}"
|
|
|
|
# 기본 Xcode 빌드
|
|
xcodebuild -workspace App.xcworkspace -scheme App -configuration Release -derivedDataPath build -allowProvisioningUpdates
|
|
|
|
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 archive -workspace App.xcworkspace -scheme App -configuration Release -archivePath build/App.xcarchive -allowProvisioningUpdates
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}아카이브 생성 실패. 오류를 확인하세요.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# IPA Export
|
|
RELEASE_DIR="$WORKSPACE_DIR/release"
|
|
EXPORT_OPTIONS_PLIST_PATH="build/ReleaseExportOptions.plist"
|
|
|
|
# release 디렉토리 생성
|
|
mkdir -p "$RELEASE_DIR"
|
|
|
|
cat > "$EXPORT_OPTIONS_PLIST_PATH" <<EOL
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>method</key>
|
|
<string>app-store</string>
|
|
<key>teamID</key>
|
|
<string>$TEAM_ID</string>
|
|
<key>signingStyle</key>
|
|
<string>automatic</string>
|
|
<key>uploadBitcode</key>
|
|
<true/>
|
|
<key>uploadSymbols</key>
|
|
<true/>
|
|
</dict>
|
|
</plist>
|
|
EOL
|
|
# exportPath는 디렉토리만 지정
|
|
xcodebuild -exportArchive -archivePath build/App.xcarchive -exportPath "$RELEASE_DIR" -exportOptionsPlist "$EXPORT_OPTIONS_PLIST_PATH" -allowProvisioningUpdates
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}릴리즈 IPA 파일 생성 실패. 오류를 확인하세요.${NC}"
|
|
echo -e "${YELLOW}Apple 개발자 계정 정보(팀 ID: $TEAM_ID)가 정확한지, Xcode에서 서명 및 배포 설정이 완료되었는지 확인하세요.${NC}"
|
|
echo -e "${GREEN}Xcode 빌드는 완료되었을 수 있습니다. Xcode에서 직접 확인하거나 실행해 보세요.${NC}"
|
|
else
|
|
# 버전 정보 읽기 (스크립트 상단에서 이미 읽었지만 명확성을 위해 다시 확인)
|
|
CURRENT_VERSION_NAME=$(grep "VERSION_NAME" "$PROPERTIES_FILE" | cut -d'=' -f2)
|
|
CURRENT_BUILD_NUMBER=$(grep "BUILD_NUMBER" "$PROPERTIES_FILE" | cut -d'=' -f2)
|
|
|
|
# IPA 파일 이름 변경 (기본 이름은 App.ipa 로 가정)
|
|
DEFAULT_IPA_NAME="App.ipa"
|
|
TARGET_IPA_NAME="App-v${CURRENT_VERSION_NAME}-b${CURRENT_BUILD_NUMBER}.ipa"
|
|
|
|
if [ -f "$RELEASE_DIR/$DEFAULT_IPA_NAME" ]; then
|
|
mv "$RELEASE_DIR/$DEFAULT_IPA_NAME" "$RELEASE_DIR/$TARGET_IPA_NAME"
|
|
if [ $? -eq 0 ]; then
|
|
echo -e "${GREEN}릴리즈 IPA 파일 생성 완료:${NC} ${BOLD}${RELEASE_DIR}/${TARGET_IPA_NAME}${NC}"
|
|
else
|
|
echo -e "${RED}IPA 파일 이름 변경 실패: ${RELEASE_DIR}/${DEFAULT_IPA_NAME} -> ${TARGET_IPA_NAME}${NC}"
|
|
echo -e "${YELLOW}생성된 IPA 파일은 ${RELEASE_DIR}/${DEFAULT_IPA_NAME} 에 있습니다.${NC}"
|
|
fi
|
|
else
|
|
echo -e "${RED}예상된 IPA 파일(${DEFAULT_IPA_NAME})을 찾을 수 없습니다. Export 과정을 확인하세요.${NC}"
|
|
fi
|
|
fi
|
|
fi
|
|
else
|
|
echo -e "${YELLOW}개발자 등록이 필요하여 아카이브 생성 단계를 건너<0xEB><0x9B><0x81>니다.${NC}"
|
|
echo -e "${YELLOW}앱을 App Store에 제출하거나 Ad Hoc 배포를 하려면 유료 Apple 개발자 계정이 필요합니다.${NC}"
|
|
echo -e "${YELLOW}개발 테스트는 Xcode에서 '${WORKSPACE_DIR}/ios/App/App.xcworkspace' 파일을 열고 직접 진행할 수 있습니다.${NC}"
|
|
fi
|
|
|
|
else
|
|
echo -e "${RED}지원되지 않는 빌드 타입입니다: $BUILD_TYPE${NC}"
|
|
echo -e "${YELLOW}사용법: ./build-ios.sh${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# 빌드 완료 후 인증서 신뢰 안내 표시
|
|
show_certificate_trust_guide
|
|
|
|
echo -e "${GREEN}빌드 프로세스 완료: $(date)${NC}"
|
|
}
|
|
|
|
# 메인 프로그램 시작
|
|
show_main_menu
|