Skip to content

Commit 1283855

Browse files
authored
fix: TopViewControllerProvider를 재활용하여 MainActor 해결 (#75)
1 parent f6b42a1 commit 1283855

3 files changed

Lines changed: 49 additions & 38 deletions

File tree

DevLog/Infra/Service/SocialLogin/GithubAuthenticationService.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
1818
private let messaging = Messaging.messaging()
1919
private var user: User? { Auth.auth().currentUser }
2020
private let providerID = AuthProviderID.gitHub
21+
private let provider = TopViewControllerProvider()
2122
private let logger = Logger(category: "GithubAuthService")
2223

2324
func signIn() async throws -> AuthenticationDataResponse {
@@ -143,6 +144,7 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
143144
}
144145
}
145146

147+
@MainActor
146148
func requestAuthorizationCode() async throws -> String {
147149
guard let clientID = Bundle.main.object(forInfoDictionaryKey: "GITHUB_CLIENT_ID") as? String,
148150
let redirectURL = Bundle.main.object(forInfoDictionaryKey: "APP_REDIRECT_URL") as? String,
@@ -248,12 +250,7 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
248250

249251
extension GithubAuthenticationService: ASWebAuthenticationPresentationContextProviding {
250252
func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
251-
guard let window = UIApplication.shared.connectedScenes
252-
.flatMap({ ($0 as? UIWindowScene)?.windows ?? [] })
253-
.first(where: { $0.isKeyWindow }) else {
254-
return ASPresentationAnchor()
255-
}
256-
return window
253+
return provider.keyWindow() ?? ASPresentationAnchor()
257254
}
258255

259256
struct GitHubUser: Codable {

DevLog/Infra/Service/SocialLogin/GoogleAuthenticationService.swift

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -126,35 +126,3 @@ final class GoogleAuthenticationService: AuthenticationService {
126126
}
127127

128128
}
129-
130-
final class TopViewControllerProvider {
131-
@MainActor
132-
func topViewController() -> UIViewController? {
133-
let keyWindow = UIApplication.shared.connectedScenes
134-
.compactMap { $0 as? UIWindowScene }
135-
.flatMap { $0.windows }
136-
.first { $0.isKeyWindow }
137-
138-
let rootController = keyWindow?.rootViewController
139-
140-
return topViewController(controller: rootController)
141-
}
142-
143-
@MainActor
144-
private func topViewController(controller: UIViewController?) -> UIViewController? {
145-
if let navigationController = controller as? UINavigationController {
146-
return topViewController(controller: navigationController.visibleViewController)
147-
}
148-
149-
if let tabController = controller as? UITabBarController,
150-
let selectedController = tabController.selectedViewController {
151-
return topViewController(controller: selectedController)
152-
}
153-
154-
if let presentedController = controller?.presentedViewController {
155-
return topViewController(controller: presentedController)
156-
}
157-
158-
return controller
159-
}
160-
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//
2+
// TopViewControllerProvider.swift
3+
// DevLog
4+
//
5+
// Created by 최윤진 on 2/12/26.
6+
//
7+
8+
import UIKit
9+
10+
final class TopViewControllerProvider {
11+
@MainActor
12+
func topViewController() -> UIViewController? {
13+
guard let keyWindow = keyWindow() else {
14+
return nil
15+
}
16+
17+
let rootController = keyWindow.rootViewController
18+
return topViewController(controller: rootController)
19+
}
20+
21+
@MainActor
22+
func keyWindow() -> UIWindow? {
23+
return UIApplication.shared.connectedScenes
24+
.compactMap { $0 as? UIWindowScene }
25+
.flatMap { $0.windows }
26+
.first { $0.isKeyWindow }
27+
}
28+
29+
@MainActor
30+
private func topViewController(controller: UIViewController?) -> UIViewController? {
31+
if let navigationController = controller as? UINavigationController {
32+
return topViewController(controller: navigationController.visibleViewController)
33+
}
34+
35+
if let tabController = controller as? UITabBarController,
36+
let selectedController = tabController.selectedViewController {
37+
return topViewController(controller: selectedController)
38+
}
39+
40+
if let presentedController = controller?.presentedViewController {
41+
return topViewController(controller: presentedController)
42+
}
43+
44+
return controller
45+
}
46+
}

0 commit comments

Comments
 (0)