Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .claude/settings.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"permissions": {
"allow": [
"Bash(firebase --version:*)"
"Bash(firebase --version:*)",
"Bash(find:*)"
]
}
}
179 changes: 159 additions & 20 deletions .github/workflows/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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/<string>//" -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/<string>//" -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/<string>//" -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>\(.*\)<\/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/<string>//" -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>\(.*\)<\/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
<?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>${{ secrets.APPLE_TEAM_ID }}</string>
<key>provisioningProfiles</key>
<dict>
<key>com.elipair.mapsy</key>
<string>${{ steps.install_profile.outputs.profile_name }}</string>
<key>com.elipair.mapsy.share</key>
<string>${{ steps.install_profile.outputs.share_profile_name }}</string>
</dict>
<key>signingStyle</key>
<string>manual</string>
<key>signingCertificate</key>
<string>Apple Distribution</string>
<key>stripSwiftSymbols</key>
<true/>
<key>uploadBitcode</key>
<false/>
<key>uploadSymbols</key>
<true/>
</dict>
</plist>
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
<?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>${{ secrets.APPLE_TEAM_ID }}</string>
<key>provisioningProfiles</key>
<dict>
<key>com.elipair.mapsy</key>
<string>${{ steps.install_profile.outputs.profile_name }}</string>
</dict>
<key>signingStyle</key>
<string>manual</string>
<key>signingCertificate</key>
<string>Apple Distribution</string>
<key>stripSwiftSymbols</key>
<true/>
<key>uploadBitcode</key>
<false/>
<key>uploadSymbols</key>
<true/>
</dict>
</plist>
EOF
echo "βœ… ExportOptions.plist 생성 μ™„λ£Œ (메인 μ•±λ§Œ)"
echo " Main Profile: ${{ steps.install_profile.outputs.profile_name }}"
fi

- name: Flutter build (no codesign)
Expand All @@ -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 <<RUBY_SCRIPT
require 'xcodeproj'

project = Xcodeproj::Project.open('Runner.xcodeproj')

# Runner νƒ€κ²Ÿ μ„€μ •
runner_target = project.targets.find { |t| t.name == 'Runner' }
if runner_target
runner_target.build_configurations.each do |config|
if config.name == 'Release'
config.build_settings['CODE_SIGN_STYLE'] = 'Manual'
config.build_settings['CODE_SIGN_IDENTITY'] = 'Apple Distribution'
config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = '${{ steps.install_profile.outputs.profile_name }}'
puts "βœ… Runner target configured with profile: ${{ steps.install_profile.outputs.profile_name }}"
end
end
end

# Share Extension νƒ€κ²Ÿ μ„€μ • (μžˆλŠ” 경우)
share_profile = '${{ steps.install_profile.outputs.share_profile_name }}'
if !share_profile.empty?
share_target = project.targets.find { |t| t.name == 'com.elipair.mapsy.share' }
if share_target
share_target.build_configurations.each do |config|
if config.name == 'Release'
config.build_settings['CODE_SIGN_STYLE'] = 'Manual'
config.build_settings['CODE_SIGN_IDENTITY'] = 'Apple Distribution'
config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = share_profile
puts "βœ… com.elipair.mapsy.share target configured with profile: #{share_profile}"
end
end
end
end

project.save
puts "βœ… Project signing configuration saved"
RUBY_SCRIPT

- name: Create Archive
env:
IOS_PROVISIONING_PROFILE_NAME: ${{ secrets.IOS_PROVISIONING_PROFILE_NAME }}
run: |
cd ios
echo "πŸ“¦ Creating Archive with Manual Signing"

xcodebuild -workspace Runner.xcworkspace \
-scheme Runner \
-configuration Release \
-archivePath build/Runner.xcarchive \
-destination 'generic/platform=iOS' \
archive \
CODE_SIGN_STYLE=Manual \
PROVISIONING_PROFILE_SPECIFIER="$IOS_PROVISIONING_PROFILE_NAME" \
CODE_SIGN_IDENTITY="Apple Distribution"
archive

- name: Export IPA
run: |
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ migrate_working_dir/
/build/
/coverage/

# iOS CI/CD generated files
ios/ExportOptions.plist

# Symbolication related
app.*.symbols

Expand Down
29 changes: 26 additions & 3 deletions CHANGELOG.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,34 @@
{
"metadata": {
"lastUpdated": "2026-01-19T11:49:01Z",
"currentVersion": "1.0.10",
"lastUpdated": "2026-01-19T13:27:22Z",
"currentVersion": "1.0.13",
"projectType": "flutter",
"totalReleases": 3
"totalReleases": 4
},
"releases": [
{
"version": "1.0.13",
"project_type": "flutter",
"date": "2026-01-19",
"pr_number": 8,
"raw_summary": "## Summary by CodeRabbit\n\n## 릴리슀 λ…ΈνŠΈ\n\n* **버전 μ—…λ°μ΄νŠΈ**\n * 버전을 1.0.13으둜 μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€.\n\n* **κ°œμ„  사항**\n * iOS λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€ 및 μ½”λ“œ μ„œλͺ… 방식을 κ°œμ„ ν•˜μ—¬ λ”μš± μ•ˆμ •μ μΈ 배포λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.\n * ν”„λ‘œλΉ„μ €λ‹ ν”„λ‘œν•„ 관리 및 μΆ”μΆœ λ‘œμ§μ„ μ΅œμ ν™”ν–ˆμŠ΅λ‹ˆλ‹€.",
"parsed_changes": {
"버전_μ—…λ°μ΄νŠΈ": {
"title": "버전 μ—…λ°μ΄νŠΈ",
"items": [
"버전을 1.0.13으둜 μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€."
]
},
"κ°œμ„ _사항": {
"title": "κ°œμ„  사항",
"items": [
"iOS λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€ 및 μ½”λ“œ μ„œλͺ… 방식을 κ°œμ„ ν•˜μ—¬ λ”μš± μ•ˆμ •μ μΈ 배포λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.",
"ν”„λ‘œλΉ„μ €λ‹ ν”„λ‘œν•„ 관리 및 μΆ”μΆœ λ‘œμ§μ„ μ΅œμ ν™”ν–ˆμŠ΅λ‹ˆλ‹€."
]
}
},
"parse_method": "markdown"
},
{
"version": "1.0.10",
"project_type": "flutter",
Expand Down
17 changes: 15 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,20 @@
# Changelog

**ν˜„μž¬ 버전:** 1.0.10
**λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈ:** 2026-01-19T11:49:01Z
**ν˜„μž¬ 버전:** 1.0.13
**λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈ:** 2026-01-19T13:27:22Z

---

## [1.0.13] - 2026-01-19

**PR:** #8

**버전 μ—…λ°μ΄νŠΈ**
- 버전을 1.0.13으둜 μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€.

**κ°œμ„  사항**
- iOS λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€ 및 μ½”λ“œ μ„œλͺ… 방식을 κ°œμ„ ν•˜μ—¬ λ”μš± μ•ˆμ •μ μΈ 배포λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.
- ν”„λ‘œλΉ„μ €λ‹ ν”„λ‘œν•„ 관리 및 μΆ”μΆœ λ‘œμ§μ„ μ΅œμ ν™”ν–ˆμŠ΅λ‹ˆλ‹€.

---

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ samples, guidance on mobile development, and a full API reference.
---

<!-- AUTO-VERSION-SECTION: DO NOT EDIT MANUALLY -->
## μ΅œμ‹  버전 : v1.0.10 (2026-01-19)
## μ΅œμ‹  버전 : v1.0.12 (2026-01-19)

[전체 버전 기둝 보기](CHANGELOG.md)
2 changes: 1 addition & 1 deletion ios/Runner.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
18 changes: 18 additions & 0 deletions ios/com.elipair.mapsy.share/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,24 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Mapsy Share</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
8 changes: 4 additions & 4 deletions version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down