Skip to content

[SOU-646] FCM 인프라·APNs 설정#73

Merged
gnoes-ios merged 5 commits into
developfrom
feat/SOU-646/fcm-infrastructure
Jun 7, 2026
Merged

[SOU-646] FCM 인프라·APNs 설정#73
gnoes-ios merged 5 commits into
developfrom
feat/SOU-646/fcm-infrastructure

Conversation

@gnoes-ios

@gnoes-ios gnoes-ios commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

📌 변경 요약

Story fcm-infrastructure (SOU-646): Firebase SDK·Push 설정·Core FCM 모듈·App 부트스트랩을 연결해 실기기에서 FCM 토큰을 확인할 수 있는 인프라까지 구축합니다.

서버 토큰 API·푸시 수신·알림 UI는 후행 Story 범위입니다.

📌 변경 내용

1. Tuist · Core FCM 모듈

  • Firebase iOS SDK SPM 추가 (FirebaseCore, FirebaseMessaging)
  • Projects/Core/FCM/FCMManager, FCMTokenStore, FCMTokenProviding, FCMFactory
  • static SPM 빌드 대응 (OTHER_SWIFT_FLAGS $(inherited), frameworkConfigurations 등)
  • App → FCM 모듈 의존 (App에서 Firebase 직접 import 없음)

2. Push 빌드 설정

  • Debug/Release entitlements 분리 (aps-environment: development / production)
  • GoogleService-Info-Debug / Release plist 빌드 시 번들 복사
  • UIBackgroundModes: remote-notification
  • GoogleService-Info*.plist gitignore

3. App 부트스트랩

  • AppDelegate: Firebase configure, APNs 콜백, FCM 토큰 AsyncStream 관찰
  • PushNotificationRegistrar: 권한 요청·설정에서 허용 후 APNs 재등록
  • SceneDelegate: 권한 요청·sceneDidBecomeActive 동기화
  • DeferredPushTokenSyncer: Story 2 서버 API 연동 placeholder
  • AppFactory.fcmTokenProvider — 후행 Story 주입 지점

Note

Medium Risk
Touches app launch, push entitlements, and Firebase config; misconfigured plists or APNs env would block tokens, but no server or notification handling yet.

Overview
Adds Firebase Cloud Messaging infrastructure so the app can obtain FCM tokens on real devices; server registration, inbound push handling, and notification UI are explicitly out of scope.

A new Core FCM module wraps FirebaseCore / FirebaseMessaging (FCMManager, actor-backed FCMTokenStore, AsyncStream token updates). The App layer bootstraps Firebase in AppDelegate, forwards APNs device tokens, and observes token updates via DeferredPushTokenSyncer (logs only until a backend API exists). PushNotificationRegistrar requests notification permission once, registers for remote notifications, and re-syncs when the app becomes active after the user enables push in Settings.

Tuist / build: Firebase iOS SDK via SPM; App depends on the FCM module (no direct Firebase imports in App). Debug vs Release entitlements (aps-environment development/production), remote-notification background mode, pre-build copy of per-flavor GoogleService-Info plists from Config/ (gitignored), plus static-SPM build fixes (OTHER_SWIFT_FLAGS, frameworkConfigurations, module verifier off for FCM).

Reviewed by Cursor Bugbot for commit 34fe225. Configure here.

@coderabbitai

coderabbitai Bot commented Jun 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Summary by CodeRabbit

Release Notes

  • New Features

    • 푸시 알림 시스템이 추가되었습니다. 앱은 이제 백그라운드에서 원격 알림을 수신할 수 있으며, 사용자 권한 요청 시 알림, 배지, 사운드 권한을 요청합니다.
    • Apple Sign-In 엔티틀먼트가 추가되었습니다.
  • Chores

    • Firebase Cloud Messaging 의존성이 추가되었습니다.
    • 빌드 설정 및 Google 서비스 구성이 업데이트되었습니다.

Walkthrough

Firebase Cloud Messaging 푸시 알림 기능을 iOS 앱에 통합합니다. 새로운 FCM 프레임워크 모듈을 추가하고, 앱 초기화 시 APNs 등록 및 FCM 토큰 동기화를 구현하며, 필요한 빌드 설정과 Firebase 의존성을 구성합니다.

Changes

FCM 푸시 알림 통합

Layer / File(s) Summary
FCM 프레임워크 모듈 기본 구조
Projects/Core/FCM/Project.swift, Projects/Core/FCM/Sources/FCMTokenProviding.swift, Projects/Core/FCM/Sources/FCMTokenStore.swift, Projects/Core/FCM/Sources/FCMManager.swift, Projects/Core/FCM/Sources/Factory/FCMFactory.swift
새로운 FCM 모듈이 추가되며, 토큰 제공 프로토콜(FCMTokenProviding)과 구현(FCMManager), 스레드 안전한 토큰 저장소(FCMTokenStore), 팩토리 추상화(FCMFactory)를 포함합니다. Firebase 초기화, APNs 토큰 설정, 토큰 갱신 스트림을 관리합니다.
앱 푸시 권한 및 APNs 등록 통합
Projects/App/Sources/Push/PushNotificationRegistrar.swift, Projects/App/Sources/Push/PushTokenSyncer.swift, Projects/App/Sources/AppDelegate.swift, Projects/App/Sources/SceneDelegate.swift, Projects/App/Sources/Factory/AppFactory.swift
앱 시작 시 사용자 푸시 권한을 요청하고 APNs에 등록하는 PushNotificationRegistrar를 추가합니다. AppDelegate는 FCM 토큰 제공자를 구성하고 토큰 업데이트를 감시하며, 각 토큰 변경 시 PushTokenSyncer.sync()를 호출합니다. SceneDelegate는 장면 활성화 시 권한 상태를 재동기화합니다.
빌드 설정 및 권한 구성
Projects/App/App-Debug.entitlements, Projects/App/App-Release.entitlements, Tuist/ProjectDescriptionHelpers/Configuration/DefaultSettings.swift, Tuist/ProjectDescriptionHelpers/Configuration/DefaultInfoPlist.swift, Tuist/ProjectDescriptionHelpers/Templates/Project+Framework.swift
Debug/Release entitlements 파일에서 APNs 환경(development/production) 및 Apple Sign-In 권한을 설정합니다. 명시적 모듈 검증을 비활성화하고, 백그라운드 원격 알림 모드를 활성화하며, 프레임워크 타깃이 추가 빌드 설정을 병합할 수 있도록 확장합니다.
Firebase 의존성 및 모듈 통합
Tuist/Package.swift, Tuist/Package.resolved, Tuist/ProjectDescriptionHelpers/Core/Module.swift, Tuist/ProjectDescriptionHelpers/Dependencies/ExternalLibrary.swift, Tuist/ProjectDescriptionHelpers/Dependencies/ModuleDependencies.swift
Firebase iOS SDK(11.14.0)와 관련 의존성들을 패키지에 추가합니다. FCM 모듈을 Tuist 시스템에 등록하고, Firebase 라이브러리(firebaseCore, firebaseMessaging)를 외부 라이브러리로 정의하며, 앱 모듈의 의존성에 FCM을 추가합니다.
빌드 자동화 및 문서
Tuist/ProjectDescriptionHelpers/Scripts/BuildScripts.swift, .gitignore, .codex/skills/souzip-pr/SKILL.md
Google Service Info plist 파일을 빌드 시 자동으로 복사하는 copyGoogleServiceInfo 스크립트를 추가하고, 앱 타깃의 entitlement 파일 지정을 제거하며, PR 생성 절차에 메타데이터 설정 단계를 추가합니다.

Sequence Diagram(s)

sequenceDiagram
  participant App as App Launch
  participant Registry as PushNotificationRegistrar
  participant UNCenter as UNUserNotificationCenter
  participant Delegate as AppDelegate
  participant FCM as FCMManager
  participant Store as FCMTokenStore
  participant Syncer as PushTokenSyncer
  
  App->>Registry: requestPermissionIfNeeded()
  Registry->>UNCenter: requestAuthorization()
  UNCenter-->>Registry: granted
  Registry->>App: registerForRemoteNotifications()
  App->>Delegate: didFinishLaunching()
  Delegate->>FCM: configure()
  FCM->>FCM: FirebaseApp.configure()
  Delegate->>FCM: fcmTokenUpdates() → AsyncStream
  FCM->>Store: registerStream()
  Delegate->>Delegate: for await token in stream
  Note over Delegate: 토큰 수신 시
  Delegate->>Syncer: sync(fcmToken: token)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • souzip/souzip-iOS#59: AppFactory 클래스의 초기화자 및 의존성 구성을 변경하는 이전 PR와 동일한 지점에서 FCM 토큰 제공자 의존성을 추가하고 있습니다.

Suggested labels

chore, docs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 18.52% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 주요 변경 사항인 FCM 인프라 및 APNs 설정을 명확하게 요약하고 있으며, 전체 changeset의 핵심을 잘 반영합니다.
Description check ✅ Passed PR 설명은 템플릿의 필수 섹션을 모두 포함하고 있으며, 변경 요약과 변경 내용을 상세히 기술하고 있습니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 34fe225. Configure here.

Comment thread Projects/App/Sources/Push/PushNotificationRegistrar.swift
@gnoes-ios gnoes-ios added the feat label Jun 6, 2026
@gnoes-ios gnoes-ios self-assigned this Jun 6, 2026
@gnoes-ios gnoes-ios force-pushed the feat/SOU-646/fcm-infrastructure branch from 34fe225 to 5f15292 Compare June 7, 2026 06:02

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Projects/App/Sources/Push/PushNotificationRegistrar.swift`:
- Around line 22-28: When handling the result of requestAuthorization, you
currently return early inside the error branch after logging via
Logger.shared.error; update that branch to also set the same "push permission
requested" flag you set on success (e.g., the pushPermissionRequested /
hasRequestedPushPermissions UserDefaults flag or the existing setter used
elsewhere in PushNotificationRegistrar) before returning so the app records that
a request was attempted even when an error occurs; keep the Logger.shared.error
call, then persist the flag (using the same method/path used in the success
flow) and only then return.

In `@Projects/Core/FCM/Project.swift`:
- Around line 8-9: 현재 Project.swift에 전역으로
ENABLE_MODULE_VERIFIER/CLANG_ENABLE_MODULE_VERIFIER를 "NO"로 설정한 근거가 부족하므로 빌드를 재현해
Xcode/Tuist 빌드 로그에서 "module verifier" 또는 "module map"/"umbrella
header"/"DEFINES_MODULE" 관련 정확한 경고·에러 문자열을 캡처하세요; 로그 메시지가 모듈 맵(또는 DEFINES_MODULE
누락) 문제를 가리키면 Project.swift에서 전역 모듈 검증기 비활성화 대신 해당 타겟의 모듈 맵 또는 DEFINES_MODULE
속성(타겟 정의 코드에서 DEFINES_MODULE 설정 또는 custom modulemap 사용)을 수정하여 문제를 해결하고, 만약 로그가
실제로 모듈 검증기 자체 오류를 지목하면 영향을 받는 특정 타겟에만
ENABLE_MODULE_VERIFIER/CLANG_ENABLE_MODULE_VERIFIER을 끄도록 변경해 전역 설정을 제거하세요.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0eb9e022-21f5-43bf-880c-422721346a4e

📥 Commits

Reviewing files that changed from the base of the PR and between 36a6cda and 5f15292.

⛔ Files ignored due to path filters (1)
  • Config/Example.xcconfig is excluded by !Config/**
📒 Files selected for processing (24)
  • .codex/skills/souzip-pr/SKILL.md
  • .gitignore
  • Projects/App/App-Debug.entitlements
  • Projects/App/App-Release.entitlements
  • Projects/App/Sources/AppDelegate.swift
  • Projects/App/Sources/Factory/AppFactory.swift
  • Projects/App/Sources/Push/PushNotificationRegistrar.swift
  • Projects/App/Sources/Push/PushTokenSyncer.swift
  • Projects/App/Sources/SceneDelegate.swift
  • Projects/Core/FCM/Project.swift
  • Projects/Core/FCM/Sources/FCMManager.swift
  • Projects/Core/FCM/Sources/FCMTokenProviding.swift
  • Projects/Core/FCM/Sources/FCMTokenStore.swift
  • Projects/Core/FCM/Sources/Factory/FCMFactory.swift
  • Tuist/Package.resolved
  • Tuist/Package.swift
  • Tuist/ProjectDescriptionHelpers/Configuration/DefaultInfoPlist.swift
  • Tuist/ProjectDescriptionHelpers/Configuration/DefaultSettings.swift
  • Tuist/ProjectDescriptionHelpers/Core/Module.swift
  • Tuist/ProjectDescriptionHelpers/Dependencies/ExternalLibrary.swift
  • Tuist/ProjectDescriptionHelpers/Dependencies/ModuleDependencies.swift
  • Tuist/ProjectDescriptionHelpers/Scripts/BuildScripts.swift
  • Tuist/ProjectDescriptionHelpers/Templates/Project+App.swift
  • Tuist/ProjectDescriptionHelpers/Templates/Project+Framework.swift
💤 Files with no reviewable changes (1)
  • Tuist/ProjectDescriptionHelpers/Templates/Project+App.swift

Comment on lines +22 to +28
if let error {
Logger.shared.error(
"푸시 권한 요청 실패: \(error.localizedDescription)",
category: .general
)
return
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

권한 요청 실패 시에도 플래그를 설정해야 합니다.

현재 requestAuthorization 호출이 에러를 반환하면(네트워크 문제 등) 플래그가 설정되지 않은 채로 early return되어, 다음번 앱 실행 시 사용자가 다시 권한 프롬프트를 보게 됩니다. 권한 요청 시도 자체를 기록하려면 에러 발생 시에도 플래그를 설정해야 합니다.

🛡️ 제안 수정
         ]) { granted, error in
             if let error {
+                UserDefaults.standard.set(
+                    true,
+                    forKey: UserDefaultsKey.hasPresentedPushPermissionPrompt
+                )
                 Logger.shared.error(
                     "푸시 권한 요청 실패: \(error.localizedDescription)",
                     category: .general
                 )
                 return
             }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if let error {
Logger.shared.error(
"푸시 권한 요청 실패: \(error.localizedDescription)",
category: .general
)
return
}
if let error {
UserDefaults.standard.set(
true,
forKey: UserDefaultsKey.hasPresentedPushPermissionPrompt
)
Logger.shared.error(
"푸시 권한 요청 실패: \(error.localizedDescription)",
category: .general
)
return
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Projects/App/Sources/Push/PushNotificationRegistrar.swift` around lines 22 -
28, When handling the result of requestAuthorization, you currently return early
inside the error branch after logging via Logger.shared.error; update that
branch to also set the same "push permission requested" flag you set on success
(e.g., the pushPermissionRequested / hasRequestedPushPermissions UserDefaults
flag or the existing setter used elsewhere in PushNotificationRegistrar) before
returning so the app records that a request was attempted even when an error
occurs; keep the Logger.shared.error call, then persist the flag (using the same
method/path used in the success flow) and only then return.

Comment on lines +8 to +9
"ENABLE_MODULE_VERIFIER": "NO",
"CLANG_ENABLE_MODULE_VERIFIER": "NO",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🌐 Web query:

Firebase iOS SDK 11.14.0 Tuist SPM integration module verifier settings requirements

💡 Result:

You asked about “Firebase iOS SDK 11.14.0 Tuist SPM integration module verifier settings requirements”. Here’s what can be asserted from current sources about (a) Firebase 11.14.0 and (b) the Tuist/SPM settings patterns relevant to module verification/module-map problems. 1) Firebase iOS SDK 11.14.0 context Firebase Apple SDK 11.14.0 (June 3, 2025) is a released version of the “Firebase Apple SDK” distribution [1]. Release notes indicate it’s available as version 11.14.0 [1], and the SDK version is tracked in the repo release/compare tooling for 11.14.0 [2][3]. 2) What “module verifier settings” means (Xcode) Apple’s guidance for the Apple Clang Module Verifier is to enable the “Enable Module Verifier” build setting (Build Settings -> Apple Clang Module Verifier) and ensure “Supported Languages”/“Supported Language Dialects” match your requirements [4]. This is general Xcode guidance for identifying framework module issues before distribution [4]. 3) Tuist + SPM + Firebase: the practical “requirements” that map to module-verifier failures In Tuist, the most relevant build-setting category for Firebase SPM integration problems is the handling of module maps and DEFINES_MODULE. 3.1 Tuist generates/adjusts DEFINES_MODULE when a module map exists Tuist’s PackageInfoMapper logic sets “DEFINES_MODULE=NO” when it decides there is a module map coming from a directory/header/custom module-map setup (specifically when moduleMap is present and moduleMap kind is directory/header/custom) [5]. This is precisely the kind of setting that can affect module-map/module-verifier correctness. 3.2 Known Firebase-in-SPM issues in Tuist are usually solved by adjusting DEFINES_MODULE for specific targets There are multiple Tuist issue reports where developers ran into “DEFINE_MODULE was set, but no umbrella header could be found to generate the module map”, and one workaround was to set “DEFINES_MODULE”: false for Firebase-related targets (e.g., “Firebase”, “FirebaseAnalytics…”, “FirebaseCoreExtension”, etc.) via Tuist dependency targetSettings [6]. 3.3 Tuist had to change module-map generation behavior for a Firebase case A Tuist PR (“Fix integration of latest Firebase”) describes a Firebase Remote Config scenario where Tuist/module-map generation logic caused a compilation failure because a Swift-only target had publicHeadersSearchPath set but no headers; the fix was to “don’t generate a modulemap when a publicHeadersDir exists but it has no headers” and to “skip setting the DEFINES_MODULE=NO in those cases, so the objc target can consume the bridging header automatically generated by Xcode” [7]. So, if your question is “what Tuist module verifier settings requirements exist for Firebase 11.14.0 when integrating via SPM?”, the sourced answer is that Tuist’s SPM integration uses/affects module-map behavior through settings like DEFINES_MODULE, and Firebase-specific edge cases can require Tuist to avoid generating module maps (or avoid setting DEFINES_MODULE=NO) when there are no headers, so the objc targets can consume the bridging header automatically generated by Xcode [7]. 4) What you should actually configure in Tuist (actionable, grounded) A) Ensure your Xcode module verifier build settings are set correctly (general) - In Xcode, set “Enable Module Verifier” to Yes, and set “Supported Languages” and “Supported Language Dialects” to match what you need [4]. B) If you hit module-map/module-verifier failures specifically with Firebase SPM via Tuist, start by checking Tuist’s targetSettings for DEFINES_MODULE - Tuist issue workaround evidence shows setting DEFINES_MODULE false for many Firebase-related SPM products/targets can suppress “DEFINE_MODULE was set…” module-map generation warnings [6]. - Tuist’s own code shows it may set DEFINES_MODULE=NO in the presence of certain module-map configurations [5], and Tuist fixed a Firebase integration failure by skipping module-map generation and skipping DEFINES_MODULE=NO in the specific “publicHeadersDir exists but has no headers” case [7]. 5) Firebase SPM integration requirements that are not “module verifier” but are commonly required Firebase’s installation methods doc for Swift Package Manager states “Google Analytics requires adding the -ObjC linker flag to your target's build settings if included transitively.” [8]. Separately, Tuist’s dependencies guide states Firebase has a “Requires -ObjC linker flag” requirement (in its Firebase special configurations section) [9]. Limitations / what I could not find in the sources I did not find a Firebase 11.14.0–specific, single canonical “Tuist module verifier settings requirements” document that enumerates exact Tuist settings to configure for 11.14.0 specifically. Instead, the sources describe (1) general Xcode module verifier build settings [4], and (2) Tuist/Firebase integration failures and fixes centered on module-map + DEFINES_MODULE behavior [7][6][5], which is the most direct “requirement” relationship to module verifier/module map issues. If you share your Tuist snippet (how you declare Firebase as.remote/.external, and whether you’re using Tuist’s swiftPackageManager dependency integration or XcodeProj-based integration) and the exact module verifier warning/error text, I can map it to the correct Tuist targetSettings adjustments consistent with the above evidence.

Citations:


Firebase 모듈 검증기 비활성화(ENABLE_MODULE_VERIFIER/CLANG_ENABLE_MODULE_VERIFIER)가 정말 필요한지 로그 근거로 재확인 요청

  • Firebase iOS SDK + Tuist/SPM 통합에서 일반적으로 문제가 되는 지점은 모듈 검증기 자체가 아니라 모듈 맵/DEFINES_MODULE 쪽인 경우가 많습니다(전역 모듈 검증기 비활성화가 필수라는 문서 근거는 확인되지 않음).
  • Projects/Core/FCM/Project.swift(8-9)에서 해당 설정이 필요한지 빌드 로그의 “module verifier”/“module map(umbrella header 등)” 관련 정확한 경고·에러 문구로 확인하고, 가능하면 원인에 맞춰 타겟별로 모듈 맵/DEFINES_MODULE를 조정하는 방향을 우선 검토해주세요.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Projects/Core/FCM/Project.swift` around lines 8 - 9, 현재 Project.swift에 전역으로
ENABLE_MODULE_VERIFIER/CLANG_ENABLE_MODULE_VERIFIER를 "NO"로 설정한 근거가 부족하므로 빌드를 재현해
Xcode/Tuist 빌드 로그에서 "module verifier" 또는 "module map"/"umbrella
header"/"DEFINES_MODULE" 관련 정확한 경고·에러 문자열을 캡처하세요; 로그 메시지가 모듈 맵(또는 DEFINES_MODULE
누락) 문제를 가리키면 Project.swift에서 전역 모듈 검증기 비활성화 대신 해당 타겟의 모듈 맵 또는 DEFINES_MODULE
속성(타겟 정의 코드에서 DEFINES_MODULE 설정 또는 custom modulemap 사용)을 수정하여 문제를 해결하고, 만약 로그가
실제로 모듈 검증기 자체 오류를 지목하면 영향을 받는 특정 타겟에만
ENABLE_MODULE_VERIFIER/CLANG_ENABLE_MODULE_VERIFIER을 끄도록 변경해 전역 설정을 제거하세요.

@gnoes-ios gnoes-ios merged commit ea2ad69 into develop Jun 7, 2026
3 checks passed
@gnoes-ios gnoes-ios deleted the feat/SOU-646/fcm-infrastructure branch June 7, 2026 06:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant