diff --git a/.claude/settings.json b/.claude/settings.json index 363cc45..ac2e729 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -1,7 +1,8 @@ { "permissions": { "allow": [ - "Bash(firebase --version:*)" + "Bash(firebase --version:*)", + "Bash(find:*)" ] } } diff --git a/.github/workflows/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml b/.github/workflows/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml index 0981d0f..46d03b5 100644 --- a/.github/workflows/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml +++ b/.github/workflows/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml @@ -278,26 +278,121 @@ jobs: p12-file-base64: ${{ secrets.APPLE_CERTIFICATE_BASE64 }} p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - - name: Install Provisioning Profiles (Main App + Share Extension) + - name: Install Provisioning Profiles + id: install_profile run: | - # 메인 앱 프로비저닝 프로파일 설치 - echo "${{ secrets.APPLE_PROVISIONING_PROFILE_BASE64 }}" | base64 --decode > profile_main.mobileprovision mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles - uuid_main=$(grep -A1 -a "UUID" profile_main.mobileprovision | grep string | sed -e "s///" -e "s/<\/string>//" -e "s/[[:space:]]//g") - cp profile_main.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$uuid_main.mobileprovision - echo "✅ 메인 앱 프로파일 설치 완료: ${{ secrets.IOS_PROVISIONING_PROFILE_NAME }}" - # Share Extension 프로비저닝 프로파일 설치 - echo "${{ secrets.APPLE_PROVISIONING_PROFILE_SHARE_BASE64 }}" | base64 --decode > profile_share.mobileprovision - uuid_share=$(grep -A1 -a "UUID" profile_share.mobileprovision | grep string | sed -e "s///" -e "s/<\/string>//" -e "s/[[:space:]]//g") - cp profile_share.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$uuid_share.mobileprovision - echo "✅ Share Extension 프로파일 설치 완료: ${{ secrets.IOS_PROVISIONING_PROFILE_SHARE_NAME }}" + # 메인 앱 프로파일 설치 + echo "${{ secrets.APPLE_PROVISIONING_PROFILE_BASE64 }}" | base64 --decode > profile.mobileprovision + cp profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/ - - name: Verify ExportOptions.plist + # UUID 추출 + uuid=$(grep -A1 -a "UUID" profile.mobileprovision | grep string | sed -e "s///" -e "s/<\/string>//" -e "s/[[:space:]]//g") + cp profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$uuid.mobileprovision + + # 프로파일 이름 추출 (동적) + profile_name=$(security cms -D -i profile.mobileprovision | plutil -extract Name xml1 -o - - | sed -n 's/.*\(.*\)<\/string>.*/\1/p') + + echo "✅ Main App Provisioning Profile installed" + echo " UUID: $uuid" + echo " Name: $profile_name" + + # 출력 저장 + echo "profile_uuid=$uuid" >> $GITHUB_OUTPUT + echo "profile_name=$profile_name" >> $GITHUB_OUTPUT + + # Share Extension 프로파일 설치 (선택적) + if [ -n "${{ secrets.APPLE_PROVISIONING_PROFILE_SHARE_BASE64 }}" ]; then + echo "${{ secrets.APPLE_PROVISIONING_PROFILE_SHARE_BASE64 }}" | base64 --decode > share_extension_profile.mobileprovision + cp share_extension_profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/ + + # Share Extension UUID 추출 + share_uuid=$(grep -A1 -a "UUID" share_extension_profile.mobileprovision | grep string | sed -e "s///" -e "s/<\/string>//" -e "s/[[:space:]]//g") + cp share_extension_profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$share_uuid.mobileprovision + + # Share Extension 프로파일 이름 추출 (동적) + share_profile_name=$(security cms -D -i share_extension_profile.mobileprovision | plutil -extract Name xml1 -o - - | sed -n 's/.*\(.*\)<\/string>.*/\1/p') + + echo "✅ Share Extension Provisioning Profile installed" + echo " UUID: $share_uuid" + echo " Name: $share_profile_name" + + # 출력 저장 + echo "share_profile_uuid=$share_uuid" >> $GITHUB_OUTPUT + echo "share_profile_name=$share_profile_name" >> $GITHUB_OUTPUT + fi + + - name: Create ExportOptions.plist run: | cd ios - if [ ! -f "ExportOptions.plist" ]; then - exit 1 + + # Share Extension 프로파일이 있는지 확인 + if [ -n "${{ steps.install_profile.outputs.share_profile_name }}" ]; then + # Share Extension 포함 + cat > ExportOptions.plist << EOF + + + + + method + app-store + teamID + ${{ secrets.APPLE_TEAM_ID }} + provisioningProfiles + + com.elipair.mapsy + ${{ steps.install_profile.outputs.profile_name }} + com.elipair.mapsy.share + ${{ steps.install_profile.outputs.share_profile_name }} + + signingStyle + manual + signingCertificate + Apple Distribution + stripSwiftSymbols + + uploadBitcode + + uploadSymbols + + + + EOF + echo "✅ ExportOptions.plist 생성 완료 (Share Extension 포함)" + echo " Main Profile: ${{ steps.install_profile.outputs.profile_name }}" + echo " Share Extension Profile: ${{ steps.install_profile.outputs.share_profile_name }}" + else + # 메인 앱만 + cat > ExportOptions.plist << EOF + + + + + method + app-store + teamID + ${{ secrets.APPLE_TEAM_ID }} + provisioningProfiles + + com.elipair.mapsy + ${{ steps.install_profile.outputs.profile_name }} + + signingStyle + manual + signingCertificate + Apple Distribution + stripSwiftSymbols + + uploadBitcode + + uploadSymbols + + + + EOF + echo "✅ ExportOptions.plist 생성 완료 (메인 앱만)" + echo " Main Profile: ${{ steps.install_profile.outputs.profile_name }}" fi - name: Flutter build (no codesign) @@ -306,19 +401,63 @@ jobs: --build-name="${{ needs.prepare-build.outputs.version }}" \ --build-number="${{ needs.prepare-build.outputs.build_number }}" + - name: Configure Code Signing in Project + run: | + cd ios + + # xcodeproj gem 설치 + gem install xcodeproj + + # Ruby 스크립트로 프로젝트 설정 수정 + ruby < -## 최신 버전 : v1.0.10 (2026-01-19) +## 최신 버전 : v1.0.12 (2026-01-19) [전체 버전 기록 보기](CHANGELOG.md) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 2213142..96a80af 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -398,7 +398,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\n#!/bin/bash\nPATH=\"${PATH}:$FLUTTER_ROOT/bin:${PUB_CACHE}/bin:$HOME/.pub-cache/bin\"\n\nif [ -z \"$PODS_ROOT\" ] || [ ! -d \"$PODS_ROOT/FirebaseCrashlytics\" ]; then\n # Cannot use \"BUILD_DIR%/Build/*\" as per Firebase documentation, it points to \"flutter-project/build/ios/*\" path which doesn't have run script\n DERIVED_DATA_PATH=$(echo \"$BUILD_ROOT\" | sed -E 's|(.*DerivedData/[^/]+).*|\\1|')\n PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT=\"${DERIVED_DATA_PATH}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run\"\nelse\n PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT=\"$PODS_ROOT/FirebaseCrashlytics/run\"\nfi\n\n# Command to upload symbols script used to upload symbols to Firebase server\nflutterfire upload-crashlytics-symbols --upload-symbols-script-path=\"$PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT\" --platform=ios --apple-project-path=\"${SRCROOT}\" --env-platform-name=\"${PLATFORM_NAME}\" --env-configuration=\"${CONFIGURATION}\" --env-project-dir=\"${PROJECT_DIR}\" --env-built-products-dir=\"${BUILT_PRODUCTS_DIR}\" --env-dwarf-dsym-folder-path=\"${DWARF_DSYM_FOLDER_PATH}\" --env-dwarf-dsym-file-name=\"${DWARF_DSYM_FILE_NAME}\" --env-infoplist-path=\"${INFOPLIST_PATH}\" --default-config=default\n"; + shellScript = "\n#!/bin/bash\n\n# CI 환경이거나 flutterfire가 없으면 조건부 스크립트 사용\nif [ -f \"${SRCROOT}/scripts/upload_crashlytics_symbols.sh\" ]; then\n bash \"${SRCROOT}/scripts/upload_crashlytics_symbols.sh\"\nelse\n echo \"⚠️ upload_crashlytics_symbols.sh not found, skipping...\"\nfi\n"; }; 2705C21E3BC5614AA64835E3 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; diff --git a/ios/com.elipair.mapsy.share/Info.plist b/ios/com.elipair.mapsy.share/Info.plist index e8d58f5..faa0de4 100644 --- a/ios/com.elipair.mapsy.share/Info.plist +++ b/ios/com.elipair.mapsy.share/Info.plist @@ -2,6 +2,24 @@ + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Mapsy Share + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) NSExtension NSExtensionAttributes diff --git a/pubspec.yaml b/pubspec.yaml index 9b4cc2b..234b80c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: mapsy description: "MapSy - Flutter Application" publish_to: "none" -version: 1.0.10+10 +version: 1.0.13+13 environment: sdk: ^3.9.2 dependencies: diff --git a/version.yml b/version.yml index d9f5455..091d397 100644 --- a/version.yml +++ b/version.yml @@ -34,12 +34,12 @@ # - 버전은 항상 높은 버전으로 자동 동기화됩니다 # =================================================================== -version: "1.0.10" -version_code: 11 # app build number +version: "1.0.13" +version_code: 14 # app build number project_type: "flutter" # spring, flutter, react, react-native, react-native-expo, node, python, basic metadata: - last_updated: "2026-01-19 11:47:22" - last_updated_by: "Cassiiopeia" + last_updated: "2026-01-19 13:25:05" + last_updated_by: "EM-H20" default_branch: "main" integrated_from: "SUH-DEVOPS-TEMPLATE" integration_date: "2026-01-19"