Skip to content

Commit da1095b

Browse files
committed
feat: NotificationCenter을 통해 FCM 토큰이 변경된 것을 전파하고, 전파된 것을 받는 것을 resolve 하여 업데이트 하드록 변경
1 parent fae35af commit da1095b

8 files changed

Lines changed: 83 additions & 3 deletions

File tree

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//
2+
// AppLayerAssembler.swift
3+
// DevLog
4+
//
5+
// Created by opfic on 3/19/26.
6+
//
7+
8+
final class AppLayerAssembler: Assembler {
9+
func assemble(_ container: any DIContainer) {
10+
container.register(FCMTokenSyncHandler.self) {
11+
FCMTokenSyncHandler(
12+
userDataRepository: container.resolve(UserDataRepository.self)
13+
)
14+
}
15+
}
16+
}

DevLog/App/Assembler/Assembler.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ final class AppAssembler: Assembler {
1414
PersistenceAssembler(),
1515
InfraAssembler(),
1616
DataAssembler(),
17-
DomainAssembler()
17+
DomainAssembler(),
18+
AppLayerAssembler()
1819
]
1920

2021
func assemble(_ container: any DIContainer) {

DevLog/App/Delegate/AppDelegate.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate {
2626
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
2727
) -> Bool {
2828
FirebaseApp.configure()
29+
_ = AppDIContainer.shared.resolve(FCMTokenSyncHandler.self)
2930

3031
// 알림 권한 요청
3132
UNUserNotificationCenter.current().delegate = self
@@ -78,6 +79,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate {
7879
) {
7980
if let fcmToken = fcmToken {
8081
logger.info("FCM token: \(fcmToken)")
82+
NotificationCenter.default.post(
83+
name: .didRefreshFCMToken,
84+
object: nil,
85+
userInfo: ["fcmToken": fcmToken]
86+
)
8187
}
8288
}
8389
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// FCMTokenSyncHandler.swift
3+
// DevLog
4+
//
5+
// Created by opfic on 3/19/26.
6+
//
7+
8+
import Combine
9+
import Foundation
10+
11+
final class FCMTokenSyncHandler {
12+
private let userDataRepository: UserDataRepository
13+
private let logger = Logger(category: "FCMTokenSyncHandler")
14+
private var cancellables = Set<AnyCancellable>()
15+
16+
init(
17+
userDataRepository: UserDataRepository,
18+
notificationCenter: NotificationCenter = .default
19+
) {
20+
self.userDataRepository = userDataRepository
21+
22+
notificationCenter.publisher(for: .didRefreshFCMToken)
23+
.compactMap { $0.userInfo?["fcmToken"] as? String }
24+
.sink { [weak self] fcmToken in
25+
Task {
26+
do {
27+
try await self?.userDataRepository.updateFCMToken(fcmToken)
28+
} catch {
29+
self?.logger.error("Failed to sync refreshed FCM token", error: error)
30+
}
31+
}
32+
}
33+
.store(in: &cancellables)
34+
}
35+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//
2+
// NotificationName+.swift
3+
// DevLog
4+
//
5+
// Created by opfic on 3/19/26.
6+
//
7+
8+
import Foundation
9+
10+
extension Notification.Name {
11+
static let didRefreshFCMToken = Notification.Name("didRefreshFCMToken")
12+
}

DevLog/Data/Repository/UserDataRepositoryImpl.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ final class UserDataRepositoryImpl: UserDataRepository {
1919
}
2020

2121
func upsertStatusMessage(_ message: String) async throws {
22-
try await self.userService.upsertStatusMessage(message)
22+
try await userService.upsertStatusMessage(message)
23+
}
24+
25+
func updateFCMToken(_ fcmToken: String) async throws {
26+
try await userService.updateFCMToken(fcmToken)
2327
}
2428
}

DevLog/Domain/Protocol/UserDataRepository.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
protocol UserDataRepository {
99
func fetch() async throws -> UserProfile
1010
func upsertStatusMessage(_ message: String) async throws
11+
func updateFCMToken(_ fcmToken: String) async throws
1112
}

DevLog/Infra/Service/UserService.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,12 @@ final class UserService {
145145
}
146146
}
147147

148-
func updateFCMToken(_ userId: String, fcmToken: String) async throws {
148+
func updateFCMToken(_ fcmToken: String) async throws {
149+
guard let userId = Auth.auth().currentUser?.uid else {
150+
logger.info("Skipping FCM token update because no authenticated user exists")
151+
return
152+
}
153+
149154
logger.info("Updating FCM token for user: \(userId)")
150155

151156
do {

0 commit comments

Comments
 (0)