@@ -64,38 +64,53 @@ final class AuthBackend: AuthBackendProtocol {
6464 httpMethod: String ,
6565 contentType: String ,
6666 requestConfiguration: AuthRequestConfiguration ) async -> URLRequest {
67+ // Previously, this section used `async let`, but that was changed for a
68+ // `Task`-based approach to work around a Swift 6.3 regression in Xcode 26.4.
69+ // - Context: https://github.com/firebase/firebase-ios-sdk/issues/15974
6770 // Kick off tasks for the async header values.
68- async let heartbeatsHeaderValue = requestConfiguration. heartbeatLogger? . asyncHeaderValue ( )
69- async let appCheckTokenHeaderValue = requestConfiguration. appCheck?
70- . getToken ( forcingRefresh: false )
71-
72- var request = URLRequest ( url: url)
73- request. setValue ( contentType, forHTTPHeaderField: " Content-Type " )
74- let additionalFrameworkMarker = requestConfiguration. additionalFrameworkMarker
75- let clientVersion = " iOS/FirebaseSDK/ \( FirebaseVersion ( ) ) / \( additionalFrameworkMarker) "
76- request. setValue ( clientVersion, forHTTPHeaderField: " X-Client-Version " )
77- request. setValue ( Bundle . main. bundleIdentifier, forHTTPHeaderField: " X-Ios-Bundle-Identifier " )
78- request. setValue ( requestConfiguration. appID, forHTTPHeaderField: " X-Firebase-GMPID " )
79- request. httpMethod = httpMethod
80- let preferredLocalizations = Bundle . main. preferredLocalizations
81- if preferredLocalizations. count > 0 {
82- request. setValue ( preferredLocalizations. first, forHTTPHeaderField: " Accept-Language " )
71+ let heartbeatsHeaderValue = Task {
72+ await requestConfiguration. heartbeatLogger? . asyncHeaderValue ( )
8373 }
84- if let languageCode = requestConfiguration. languageCode,
85- languageCode. count > 0 {
86- request. setValue ( languageCode, forHTTPHeaderField: " X-Firebase-Locale " )
74+ let appCheckTokenHeaderValue = Task {
75+ await requestConfiguration. appCheck? . getToken ( forcingRefresh: false )
8776 }
88- // Wait for the async header values.
89- await request. setValue ( heartbeatsHeaderValue, forHTTPHeaderField: " X-Firebase-Client " )
90- if let tokenResult = await appCheckTokenHeaderValue {
91- if let error = tokenResult. error {
92- AuthLog . logWarning ( code: " I-AUT000018 " ,
93- message: " Error getting App Check token; using placeholder " +
94- " token instead. Error: \( error) " )
77+
78+ return await withTaskCancellationHandler {
79+ defer {
80+ heartbeatsHeaderValue. cancel ( )
81+ appCheckTokenHeaderValue. cancel ( )
82+ }
83+ var request = URLRequest ( url: url)
84+ request. setValue ( contentType, forHTTPHeaderField: " Content-Type " )
85+ let additionalFrameworkMarker = requestConfiguration. additionalFrameworkMarker
86+ let clientVersion = " iOS/FirebaseSDK/ \( FirebaseVersion ( ) ) / \( additionalFrameworkMarker) "
87+ request. setValue ( clientVersion, forHTTPHeaderField: " X-Client-Version " )
88+ request. setValue ( Bundle . main. bundleIdentifier, forHTTPHeaderField: " X-Ios-Bundle-Identifier " )
89+ request. setValue ( requestConfiguration. appID, forHTTPHeaderField: " X-Firebase-GMPID " )
90+ request. httpMethod = httpMethod
91+ let preferredLocalizations = Bundle . main. preferredLocalizations
92+ if preferredLocalizations. count > 0 {
93+ request. setValue ( preferredLocalizations. first, forHTTPHeaderField: " Accept-Language " )
94+ }
95+ if let languageCode = requestConfiguration. languageCode,
96+ languageCode. count > 0 {
97+ request. setValue ( languageCode, forHTTPHeaderField: " X-Firebase-Locale " )
98+ }
99+ // Wait for the async header values.
100+ await request. setValue ( heartbeatsHeaderValue. value, forHTTPHeaderField: " X-Firebase-Client " )
101+ if let tokenResult = await appCheckTokenHeaderValue. value {
102+ if let error = tokenResult. error {
103+ AuthLog . logWarning ( code: " I-AUT000018 " ,
104+ message: " Error getting App Check token; using placeholder " +
105+ " token instead. Error: \( error) " )
106+ }
107+ request. setValue ( tokenResult. token, forHTTPHeaderField: " X-Firebase-AppCheck " )
95108 }
96- request. setValue ( tokenResult. token, forHTTPHeaderField: " X-Firebase-AppCheck " )
109+ return request
110+ } onCancel: {
111+ heartbeatsHeaderValue. cancel ( )
112+ appCheckTokenHeaderValue. cancel ( )
97113 }
98- return request
99114 }
100115
101116 private static func generateMFAError( response: AuthRPCResponse, auth: Auth) - > Error? {
0 commit comments