diff --git a/app/BUILD.md b/app/BUILD.md index 85d8cb4..6c000bc 100644 --- a/app/BUILD.md +++ b/app/BUILD.md @@ -60,3 +60,39 @@ apksigner verify --print-certs build/app/outputs/flutter-apk/app-release.apk 현재 빌드는 **API 24** 로 나간다. 하한을 29 로 올리는 것은 위치 퀘스트의 `geofence_foreground_service` 인데 아직 넣지 않았다. **6주차 위치 퀘스트 구현 시점에 29 로 올라간다.** 그때 기준 단말 2종 충족을 다시 확인해 빌드 노트에 적는다. + +--- + +## iOS + +**2026-08-31 실증** — `flutter build ios --release --no-codesign` 통과. + +| 구성 | 값 | +|---|---| +| Xcode | **27.0** (`~/Downloads/Xcode-beta.app`) | +| CocoaPods | 1.17.0 (`brew install cocoapods`) | +| 산출물 | `build/ios/iphoneos/Runner.app` · 21.7MB · arm64 | +| bundle id | `kr.co.sweech.fancake` · 0.1.0(1) · label FANUZU | +| **MinimumOSVersion** | **15.0** — 문서(별첨 1 · 2주차 선검증)와 **일치** | + +`xcode-select --switch` 는 sudo 를 요구하므로 **`DEVELOPER_DIR` 로 우회**한다. + +```bash +export DEVELOPER_DIR=~/Downloads/Xcode-beta.app/Contents/Developer +fvm flutter build ios --release --no-codesign +``` + +**서명은 Apple Developer 계정이 있어야 한다.** 계정 없이 여기까지는 확인되므로, +TestFlight 제출에 남은 것은 **서명과 업로드뿐**이다. + +### 정리해야 할 것 — CocoaPods / SwiftPM 이중 상태 + +빌드 중 Flutter 가 경고한다. + +> All plugins found for ios are Swift Packages, but your project still has CocoaPods +> integration. … Removing CocoaPods integration will improve the project's build time. + +iOS 플러그인이 전부 Swift Package 로 옮겨졌는데 프로젝트에 CocoaPods 통합이 남아 있다. +동작에는 지장이 없으나 빌드 시간이 늘고 구성이 이중이다. `pod deintegrate` 와 +`Debug.xcconfig` · `Release.xcconfig` 의 Pods include 제거가 필요하다. +**11주차 최적화 구간에서 정리한다.** diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock index 5a03f92..b0b7b0a 100644 --- a/app/ios/Podfile.lock +++ b/app/ios/Podfile.lock @@ -1,158 +1,15 @@ PODS: - - AppAuth (2.1.0): - - AppAuth/Core (= 2.1.0) - - AppAuth/ExternalUserAgent (= 2.1.0) - - AppAuth/Core (2.1.0) - - AppAuth/ExternalUserAgent (2.1.0): - - AppAuth/Core - - AppCheckCore (11.3.1): - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) - - PromisesObjC (~> 2.4) - - PromisesSwift (~> 2.4) - - RecaptchaInterop (~> 101.0) - - Firebase/Auth (12.17.0): - - Firebase/CoreOnly - - FirebaseAuth (~> 12.17.0) - - Firebase/CoreOnly (12.17.0): - - FirebaseCore (~> 12.17.0) - - firebase_auth (6.5.7): - - Firebase/Auth (= 12.17.0) - - firebase_core - - Flutter - - firebase_core (4.13.0): - - Firebase/CoreOnly (= 12.17.0) - - Flutter - - FirebaseAppCheckInterop (12.17.0) - - FirebaseAuth (12.17.0): - - FirebaseAppCheckInterop (~> 12.17.0) - - FirebaseAuthInterop (~> 12.17.0) - - FirebaseCore (~> 12.17.0) - - FirebaseCoreExtension (~> 12.17.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/Environment (~> 8.1) - - GTMSessionFetcher/Core (< 6.0, >= 3.4) - - RecaptchaInterop (~> 101.0) - - FirebaseAuthInterop (12.17.0) - - FirebaseCore (12.17.0): - - FirebaseCoreInternal (~> 12.17.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreExtension (12.17.0): - - FirebaseCore (~> 12.17.0) - - FirebaseCoreInternal (12.17.0): - - "GoogleUtilities/NSData+zlib (~> 8.1)" - Flutter (1.0.0) - - google_sign_in_ios (0.0.1): - - Flutter - - FlutterMacOS - - GoogleSignIn (~> 9.0) - - GTMSessionFetcher (>= 3.4.0) - - GoogleSignIn (9.2.0): - - AppAuth (~> 2.1) - - AppCheckCore (~> 11.0) - - GTMAppAuth (~> 5.0) - - GTMSessionFetcher/Core (~> 3.3) - - GoogleUtilities/AppDelegateSwizzler (8.1.2): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.1.2): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.1.2): - - GoogleUtilities/Environment - - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.1.2): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Privacy - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.1.2)": - - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.1.2) - - GoogleUtilities/Reachability (8.1.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.1.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GTMAppAuth (5.0.0): - - AppAuth/Core (~> 2.0) - - GTMSessionFetcher/Core (< 4.0, >= 3.3) - - GTMSessionFetcher (3.5.0): - - GTMSessionFetcher/Full (= 3.5.0) - - GTMSessionFetcher/Core (3.5.0) - - GTMSessionFetcher/Full (3.5.0): - - GTMSessionFetcher/Core - - PromisesObjC (2.4.1) - - PromisesSwift (2.4.1): - - PromisesObjC (= 2.4.1) - - RecaptchaInterop (101.0.0) - - sign_in_with_apple (0.0.1): - - Flutter - - FlutterMacOS DEPENDENCIES: - - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - Flutter (from `Flutter`) - - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`) - - sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/darwin`) - -SPEC REPOS: - trunk: - - AppAuth - - AppCheckCore - - Firebase - - FirebaseAppCheckInterop - - FirebaseAuth - - FirebaseAuthInterop - - FirebaseCore - - FirebaseCoreExtension - - FirebaseCoreInternal - - GoogleSignIn - - GoogleUtilities - - GTMAppAuth - - GTMSessionFetcher - - PromisesObjC - - PromisesSwift - - RecaptchaInterop EXTERNAL SOURCES: - firebase_auth: - :path: ".symlinks/plugins/firebase_auth/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" Flutter: :path: Flutter - google_sign_in_ios: - :path: ".symlinks/plugins/google_sign_in_ios/darwin" - sign_in_with_apple: - :path: ".symlinks/plugins/sign_in_with_apple/darwin" SPEC CHECKSUMS: - AppAuth: ef4da5a3fc2e10b90c09a0a94a9baeaedc0341d5 - AppCheckCore: e215d35177a9cf469927863e69c13e220df32a8b - Firebase: e8400c058702940d53f31fc0653e4e7a06332326 - firebase_auth: 3e82fa3e632856cd5a8e2bedf458d682740c8168 - firebase_core: c94f9efeed0ded590b7eecaf6110a374eb865d7a - FirebaseAppCheckInterop: 6d4cd7b9df8047da8cfc98c3fef4618bab2a8e0d - FirebaseAuth: d27d2fc54508c3af9db2f617300fcf3042328d80 - FirebaseAuthInterop: 1679f5a45921270225b7eabf1ad4ebff8790fe82 - FirebaseCore: 52d4512296984a44a8c8870c6494870fc7aeee2f - FirebaseCoreExtension: be2d62bfcf339c7dd94646d43d910aaf37fe17c1 - FirebaseCoreInternal: 3b310521b34a51ce3a6c605e4618b9aef8f6c112 - Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 - google_sign_in_ios: 000870aa06da9b28d1d0bf7ef70ff0213059dd28 - GoogleSignIn: e449a40a92e9f2eea56e98b5214d13725dc5a00a - GoogleUtilities: 766ace00c6b10d8148408f329d10c4f051931850 - GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238 - GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 - PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273 - PromisesSwift: 217dea0fd5d2ad65222a109c48698add13cc1c5b - RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba - sign_in_with_apple: 5e34677a4e74c5f42760f41b3bbe05343e84d171 + Flutter: 71a624a5bc0c04062bf19101d501e466baf2fb47 PODFILE CHECKSUM: a9f0c3e5ff2dc240d258357afba1f66fdbe55a54 diff --git a/app/ios/Runner.xcodeproj/project.pbxproj b/app/ios/Runner.xcodeproj/project.pbxproj index e912abf..0a18c16 100644 --- a/app/ios/Runner.xcodeproj/project.pbxproj +++ b/app/ios/Runner.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 7884E8682EC3CC0700C636F2 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7884E8672EC3CC0400C636F2 /* SceneDelegate.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 87BFB00ABC23EA249E841B59 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CBE157220A7C382F845775F0 /* Pods_Runner.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; @@ -52,6 +53,7 @@ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7884E8672EC3CC0400C636F2 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 84C812EE6A3D1BC4184A5BEB /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 863F6782F18B38E1171A4FA5 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; @@ -82,6 +84,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, 87BFB00ABC23EA249E841B59 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -109,6 +112,7 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -201,14 +205,15 @@ 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 73128144E02B9818A990375F /* [CP] Embed Pods Frameworks */, - 530322A018F6E749E8AABA13 /* [CP] Copy Pods Resources */, ); buildRules = ( ); dependencies = ( ); name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); productName = Runner; productReference = 97C146EE1CF9000F007C117D /* Runner.app */; productType = "com.apple.product-type.application"; @@ -242,6 +247,9 @@ Base, ); mainGroup = 97C146E51CF9000F007C117D; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; projectRoot = ""; @@ -312,40 +320,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 530322A018F6E749E8AABA13 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 73128144E02B9818A990375F /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 8288A40396CD78821AC244E9 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -748,6 +722,20 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; } diff --git a/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..bc0e8f4 --- /dev/null +++ b/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,149 @@ +{ + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5", + "version" : "1.2024072200.0" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "3e33dd27dd4c69bd81c7c81fe61d8ccf58846902", + "version" : "11.3.1" + } + }, + { + "identity" : "appauth-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/openid/AppAuth-iOS.git", + "state" : { + "revision" : "a7caeda164dc5108bf4649472b28a5af65dc6f33", + "version" : "2.1.0" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "33a468adfdb75b53f05a37e7c886ca7c962b5c17", + "version" : "12.17.0" + } + }, + { + "identity" : "google-ads-on-device-conversion-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/google-ads-on-device-conversion-ios-sdk", + "state" : { + "revision" : "dc39082d8881109d35b94b1c122164c0e8d08a55", + "version" : "3.6.1" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "fceaffa07d22dcd5624d3639fd970351a4a5ad8c", + "version" : "12.17.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "ba3358d3c3dbae8ef230b58a46b97ad65e84e974", + "version" : "10.1.1" + } + }, + { + "identity" : "googlesignin-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleSignIn-iOS.git", + "state" : { + "revision" : "08d8dcecafb575f98879ffdbb8302c1b9ad65d19", + "version" : "9.2.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "92c8f6dc3ac375d6febdfcb3db68bc3d10633db3", + "version" : "8.1.3" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "75b31c842f664a0f46a2e590a570e370249fd8f6", + "version" : "1.69.1" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "a2ab612cb980066ee56d90d60d8462992c07f24b", + "version" : "3.5.0" + } + }, + { + "identity" : "gtmappauth", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GTMAppAuth.git", + "state" : { + "revision" : "56e0ccf09a6dd29dc7e68bdf729598240ca8aa16", + "version" : "5.0.0" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe", + "version" : "101.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", + "version" : "1.22.5" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "3851d94a41890dea16dc3db34caf60e585cb4163", + "version" : "2.30910.1" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "f4a19a3c313dc2616c70bb49d29a799fb16be837", + "version" : "2.4.1" + } + } + ], + "version" : 2 +} diff --git a/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index e3773d4..c3fedb2 100644 --- a/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -5,6 +5,24 @@ + + + + + + + + + +