Skip to content

Create buildable branch for Swift 6 and Xcode 16+ #14601

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 40 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
708e1e1
fix unsafe use of os_unfair_lock
morganchen12 Mar 8, 2025
7c2cd73
Add changelogs
morganchen12 Mar 8, 2025
1fa7481
Update FirebaseStorage/Sources/Storage.swift
morganchen12 Mar 8, 2025
37415c5
Add reference wrapper for os_unfair_lock
morganchen12 Mar 18, 2025
6d3e97e
Merge branch 'main' into mc/unsafe-lock
morganchen12 Mar 18, 2025
4778110
style
morganchen12 Mar 18, 2025
c2a716a
move file to correct location
morganchen12 Mar 18, 2025
b2ef5d9
conform messaging to sendable, where appropriate
morganchen12 Mar 19, 2025
8d70824
Move to Swift 6 and Xcode 16+
morganchen12 Mar 19, 2025
8704425
bump swift tools version
morganchen12 Mar 19, 2025
f51223b
use macos-15
morganchen12 Mar 19, 2025
ea7e8fa
remove Xcode 15 references
morganchen12 Mar 19, 2025
9b46b05
fix sendable violations in sessions
morganchen12 Mar 19, 2025
e826c9d
fix Sessions build
morganchen12 Mar 21, 2025
b66ede5
Merge branch 'main' into mc/messaging
morganchen12 Mar 28, 2025
6487a3e
disable broken tests
morganchen12 Mar 28, 2025
763fd89
Merge branch 'swift-6' into mc/messaging
morganchen12 Mar 28, 2025
b8531ce
Merge branch 'mc/unsafe-lock' into mc/messaging
morganchen12 Apr 3, 2025
319fbee
auth wip
morganchen12 Apr 3, 2025
7a40e87
make auth build (with warnings and todos)
morganchen12 Apr 4, 2025
f696b71
fix sessions build
morganchen12 Apr 4, 2025
03dbacc
fix sessions tests and run style
morganchen12 Apr 4, 2025
a27eb03
reenable auth, since it builds now
morganchen12 Apr 4, 2025
028a04a
use adhoc signing for catalyst tests
morganchen12 Apr 9, 2025
9e3ff3d
fix sessions tests on catalyst
morganchen12 Apr 10, 2025
ab48e75
remove xcbeautify temporarily
morganchen12 Apr 10, 2025
9b63014
fix ui tests
morganchen12 Apr 10, 2025
8810c6c
disable xcbeautify again
morganchen12 Apr 10, 2025
ed28634
how did this ever work
morganchen12 Apr 10, 2025
fd7c271
re-add xcbeautify or gha kills test
morganchen12 Apr 10, 2025
bb9187b
disable zip workflows
morganchen12 Apr 10, 2025
fb94749
add todo to firestore and disable firebasepod
morganchen12 Apr 10, 2025
b269f19
fix style
morganchen12 Apr 10, 2025
ea5c400
fix hanging indent
morganchen12 Apr 10, 2025
34c5328
fix tests
morganchen12 Apr 10, 2025
852c489
Merge branch 'main' into swift-6
morganchen12 Apr 25, 2025
0ac9b6c
Merge branch 'swift-6' into mc/messaging
morganchen12 Apr 25, 2025
b60d55b
Remove changes that are now in main
ncooke3 May 16, 2025
efd0694
Merge branch 'main' into mc/messaging
ncooke3 May 16, 2025
aa0c3ca
Revert core changes
ncooke3 May 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Firebase.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ Simplify your app development, grow your user base, and monetize more effectivel

s.cocoapods_version = '>= 1.12.0'

s.swift_version = '5.9'
s.swift_version = '6.0'

s.default_subspec = 'Core'

Expand Down
2 changes: 1 addition & 1 deletion FirebaseABTesting.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Firebase Cloud Messaging and Firebase Remote Config in your app.
s.cocoapods_version = '>= 1.12.0'
s.prefix_header_file = false

s.swift_version = '5.9'
s.swift_version = '6.0'

base_dir = "FirebaseABTesting/Sources/"
s.source_files = [
Expand Down
2 changes: 1 addition & 1 deletion FirebaseAnalytics.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Pod::Spec.new do |s|
}

s.cocoapods_version = '>= 1.12.0'
s.swift_version = '5.9'
s.swift_version = '6.0'

s.ios.deployment_target = '12.0'
s.osx.deployment_target = '10.15'
Expand Down
2 changes: 1 addition & 1 deletion FirebaseAppCheck.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Pod::Spec.new do |s|
tvos_deployment_target = '13.0'
watchos_deployment_target = '7.0'

s.swift_version = '5.9'
s.swift_version = '6.0'

s.ios.deployment_target = ios_deployment_target
s.osx.deployment_target = osx_deployment_target
Expand Down
2 changes: 1 addition & 1 deletion FirebaseAppDistribution.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ iOS SDK for App Distribution for Firebase.

s.ios.deployment_target = '13.0'

s.swift_version = '5.9'
s.swift_version = '6.0'

s.cocoapods_version = '>= 1.12.0'
s.prefix_header_file = false
Expand Down
2 changes: 1 addition & 1 deletion FirebaseAuth.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ supports email and password accounts, as well as several 3rd party authenticatio
tvos_deployment_target = '13.0'
watchos_deployment_target = '7.0'

s.swift_version = '5.9'
s.swift_version = '6.0'

s.ios.deployment_target = ios_deployment_target
s.osx.deployment_target = osx_deployment_target
Expand Down
3 changes: 3 additions & 0 deletions FirebaseAuth/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# Unreleased
- [fixed] Replaced unsafe uses of `os_unfair_lock` (#14548).

# 11.12.0
- [fixed] Fix a `fatalError` unenrolling from MFA. An invalid user token now throws an
`invalidUserToken` error instead of crashing. (#14663)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,12 @@ typedef void (^FIRTokenCallback)(NSString *_Nullable_result token, NSError *_Nul
NS_SWIFT_UNAVAILABLE("Use Swift's closure syntax instead.");

/// Common methods for Auth interoperability.
NS_SWIFT_NAME(AuthInterop)
@protocol FIRAuthInterop
NS_SWIFT_NAME(AuthInterop) NS_SWIFT_SENDABLE @protocol FIRAuthInterop

/// Retrieves the Firebase authentication token, possibly refreshing it if it has expired.
- (void)getTokenForcingRefresh:(BOOL)forceRefresh
withCallback:
(void (^)(NSString *_Nullable_result token, NSError *_Nullable error))callback
withCallback:(void (^NS_SWIFT_UI_ACTOR)(NSString *_Nullable_result token,
NSError *_Nullable error))callback
NS_SWIFT_NAME(getToken(forcingRefresh:completion:));

/// Get the current Auth user's UID. Returns nil if there is no user signed in.
Expand Down
143 changes: 79 additions & 64 deletions FirebaseAuth/Sources/Swift/Auth/Auth.swift

Large diffs are not rendered by default.

7 changes: 4 additions & 3 deletions FirebaseAuth/Sources/Swift/Auth/AuthComponent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import FirebaseAppCheckInterop
import FirebaseAuthInterop
import FirebaseCore
import FirebaseCoreExtension
import FirebaseCoreInternal

@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
@objc(FIRAuthComponent)
Expand All @@ -33,7 +34,7 @@ class AuthComponent: NSObject, Library, ComponentLifecycleMaintainer {
private var instances: [String: Auth] = [:]

/// Lock to manage access to the instances array to avoid race conditions.
private var instancesLock: os_unfair_lock = .init()
private let instancesLock: FirebaseCoreInternal.FIRAllocatedUnfairLock<Void> = .init()

// MARK: - Initializers

Expand All @@ -58,10 +59,10 @@ class AuthComponent: NSObject, Library, ComponentLifecycleMaintainer {
// MARK: - AuthProvider conformance

@discardableResult func auth() -> Auth {
os_unfair_lock_lock(&instancesLock)
instancesLock.lock()

// Unlock before the function returns.
defer { os_unfair_lock_unlock(&instancesLock) }
defer { instancesLock.unlock() }

if let instance = instances[app.name] {
return instance
Expand Down
3 changes: 2 additions & 1 deletion FirebaseAuth/Sources/Swift/Auth/AuthDataResult.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ extension AuthDataResult: NSSecureCoding {}
///
/// It contains references to a `User` instance and an `AdditionalUserInfo` instance.
@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
@objc(FIRAuthDataResult) open class AuthDataResult: NSObject {
@objc(FIRAuthDataResult) open class AuthDataResult: NSObject,
@unchecked Sendable /* TODO: sendable */ {
/// The signed in user.
@objc public let user: User

Expand Down
3 changes: 2 additions & 1 deletion FirebaseAuth/Sources/Swift/Auth/AuthTokenResult.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ extension AuthTokenResult: NSSecureCoding {}
/// A data class containing the ID token JWT string and other properties associated with the
/// token including the decoded payload claims.
@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
@objc(FIRAuthTokenResult) open class AuthTokenResult: NSObject {
@objc(FIRAuthTokenResult) open class AuthTokenResult: NSObject,
@unchecked Sendable /* TODO: sendable */ {
/// Stores the JWT string of the ID token.
@objc open var token: String

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import Foundation

/// Utility type for constructing federated auth provider credentials.
@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
@objc(FIRFederatedAuthProvider) public protocol FederatedAuthProvider: NSObjectProtocol {
@objc(FIRFederatedAuthProvider) public protocol FederatedAuthProvider: NSObjectProtocol, Sendable {
#if os(iOS)

/// Used to obtain an auth credential via a mobile web flow.
Expand Down
22 changes: 11 additions & 11 deletions FirebaseAuth/Sources/Swift/AuthProvider/OAuthProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ import Foundation

/// Utility class for constructing OAuth Sign In credentials.
@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
@objc(FIROAuthProvider) open class OAuthProvider: NSObject, FederatedAuthProvider {
@objc(FIROAuthProvider) open class OAuthProvider: NSObject, FederatedAuthProvider,
@unchecked Sendable /* TODO: sendable */ {
@objc public static let id = "OAuth"

/// Array used to configure the OAuth scopes.
Expand Down Expand Up @@ -268,7 +269,7 @@ import Foundation
/// - Parameter completion: Optionally; a block which is invoked asynchronously on the main
/// thread when the mobile web flow is completed.
open func getCredentialWith(_ uiDelegate: AuthUIDelegate?,
completion: ((AuthCredential?, Error?) -> Void)? = nil) {
completion: (@MainActor (AuthCredential?, Error?) -> Void)? = nil) {
guard let urlTypes = auth.mainBundleUrlTypes,
AuthWebUtils.isCallbackSchemeRegistered(forCustomURLScheme: callbackScheme,
urlTypes: urlTypes) else {
Expand All @@ -281,13 +282,12 @@ import Foundation
let eventID = AuthWebUtils.randomString(withLength: 10)
let sessionID = AuthWebUtils.randomString(withLength: 10)

let callbackOnMainThread: ((AuthCredential?, Error?) -> Void) = { credential, error in
if let completion {
DispatchQueue.main.async {
let callbackOnMainThread: (@MainActor (AuthCredential?, Error?) -> Void) =
{ credential, error in
if let completion {
completion(credential, error)
}
}
}
Task {
do {
guard let headfulLiteURL = try await self.getHeadfulLiteUrl(eventID: eventID,
Expand All @@ -296,15 +296,15 @@ import Foundation
"FirebaseAuth Internal Error: Both error and headfulLiteURL return are nil"
)
}
let callbackMatcher: (URL?) -> Bool = { callbackURL in
let callbackMatcher: @Sendable (URL?) -> Bool = { callbackURL in
AuthWebUtils.isExpectedCallbackURL(callbackURL,
eventID: eventID,
authType: "signInWithRedirect",
callbackScheme: self.callbackScheme)
}
self.auth.authURLPresenter.present(headfulLiteURL,
uiDelegate: uiDelegate,
callbackMatcher: callbackMatcher) { callbackURL, error in
await self.auth.authURLPresenter.present(headfulLiteURL,
uiDelegate: uiDelegate,
callbackMatcher: callbackMatcher) { callbackURL, error in
if let error {
callbackOnMainThread(nil, error)
return
Expand All @@ -328,7 +328,7 @@ import Foundation
callbackOnMainThread(credential, nil)
}
} catch {
callbackOnMainThread(nil, error)
await callbackOnMainThread(nil, error)
}
}
}
Expand Down
33 changes: 18 additions & 15 deletions FirebaseAuth/Sources/Swift/AuthProvider/PhoneAuthProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ import Foundation
///
/// This class is available on iOS only.
@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
@objc(FIRPhoneAuthProvider) open class PhoneAuthProvider: NSObject {
@objc(FIRPhoneAuthProvider) open class PhoneAuthProvider: NSObject,
@unchecked Sendable /* TODO: sendable */ {
/// A string constant identifying the phone identity provider.
@objc public static let id = "phone"
private static let recaptchaVersion = "RECAPTCHA_ENTERPRISE"
Expand Down Expand Up @@ -56,7 +57,7 @@ import Foundation
@objc(verifyPhoneNumber:UIDelegate:completion:)
open func verifyPhoneNumber(_ phoneNumber: String,
uiDelegate: AuthUIDelegate? = nil,
completion: ((_: String?, _: Error?) -> Void)?) {
completion: (@Sendable (_: String?, _: Error?) -> Void)?) {
verifyPhoneNumber(phoneNumber,
uiDelegate: uiDelegate,
multiFactorSession: nil,
Expand All @@ -75,7 +76,7 @@ import Foundation
open func verifyPhoneNumber(_ phoneNumber: String,
uiDelegate: AuthUIDelegate? = nil,
multiFactorSession: MultiFactorSession? = nil,
completion: ((_: String?, _: Error?) -> Void)?) {
completion: (@Sendable (String?, Error?) -> Void)?) {
Task {
do {
let verificationID = try await verifyPhoneNumber(
Expand Down Expand Up @@ -135,7 +136,7 @@ import Foundation
open func verifyPhoneNumber(with multiFactorInfo: PhoneMultiFactorInfo,
uiDelegate: AuthUIDelegate? = nil,
multiFactorSession: MultiFactorSession?,
completion: ((_: String?, _: Error?) -> Void)?) {
completion: (@Sendable (String?, Error?) -> Void)?) {
Copy link
Member

@ncooke3 ncooke3 May 19, 2025

Choose a reason for hiding this comment

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

@morganchen12 , Given the implementation, I will copy these changes but change the Sendable annotation to MainActor. LMK if you disagree

Copy link
Member

Choose a reason for hiding this comment

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

i'm thinking the benefit of param completion handlers being marked with MainActor is that it enforces that our implementation is consistent in always calling on main actor.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I'm fine with that.

Task {
do {
let verificationID = try await verifyPhoneNumber(
Expand Down Expand Up @@ -531,7 +532,7 @@ import Foundation
"Internal error: reCAPTCHAURL returned neither a value nor an error. Report issue"
)
}
let callbackMatcher: (URL?) -> Bool = { callbackURL in
let callbackMatcher: @Sendable (URL?) -> Bool = { callbackURL in
AuthWebUtils.isExpectedCallbackURL(
callbackURL,
eventID: eventID,
Expand All @@ -540,17 +541,19 @@ import Foundation
)
}

return try await withUnsafeThrowingContinuation { continuation in
self.auth.authURLPresenter.present(url,
uiDelegate: uiDelegate,
callbackMatcher: callbackMatcher) { callbackURL, error in
if let error {
continuation.resume(throwing: error)
} else {
do {
try continuation.resume(returning: self.reCAPTCHAToken(forURL: callbackURL))
} catch {
return try await withCheckedThrowingContinuation { continuation in
DispatchQueue.main.async {
self.auth.authURLPresenter.present(url,
uiDelegate: uiDelegate,
callbackMatcher: callbackMatcher) { callbackURL, error in
if let error {
continuation.resume(throwing: error)
} else {
do {
try continuation.resume(returning: self.reCAPTCHAToken(forURL: callbackURL))
} catch {
continuation.resume(throwing: error)
}
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions FirebaseAuth/Sources/Swift/Backend/AuthBackend.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import Foundation

@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
protocol AuthBackendProtocol: Sendable {
func call<T: AuthRPCRequest>(with request: T) async throws -> T.Response
func call<T: AuthRPCRequest>(with request: sending T) async throws -> T.Response
}

@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
Expand All @@ -48,7 +48,7 @@ final class AuthBackend: AuthBackendProtocol {
/// * See FIRAuthInternalErrorCodeRPCResponseDecodingError
/// - Parameter request: The request.
/// - Returns: The response.
func call<T: AuthRPCRequest>(with request: T) async throws -> T.Response {
func call<T: AuthRPCRequest>(with request: sending T) async throws -> T.Response {
let response = try await callInternal(with: request)
if let auth = request.requestConfiguration().auth,
let mfaError = Self.generateMFAError(response: response, auth: auth) {
Expand Down
2 changes: 1 addition & 1 deletion FirebaseAuth/Sources/Swift/Backend/AuthRPCRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import Foundation

/// The generic interface for an RPC request needed by AuthBackend.
@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
protocol AuthRPCRequest {
protocol AuthRPCRequest: Sendable {
associatedtype Response: AuthRPCResponse

/// Gets the request's full URL.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import FirebaseCoreExtension

/// Defines configurations to be added to a request to Firebase Auth's backend.
@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
final class AuthRequestConfiguration {
final class AuthRequestConfiguration: @unchecked Sendable /* TODO: sendable */ {
/// The Firebase Auth API key used in the request.
let apiKey: String

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ private let kTenantIDKey = "tenantId"
/// Represents the parameters for the createAuthUri endpoint.
/// See https://developers.google.com/identity/toolkit/web/reference/relyingparty/createAuthUri
@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
class CreateAuthURIRequest: IdentityToolkitRequest, AuthRPCRequest {
class CreateAuthURIRequest: IdentityToolkitRequest, AuthRPCRequest,
@unchecked Sendable /* TODO: sendable */ {
typealias Response = CreateAuthURIResponse

/// The email or federated ID of the user.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ private let kIDTokenKey = "idToken"
private let kLocalIDKey = "localId"

@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
class DeleteAccountRequest: IdentityToolkitRequest, AuthRPCRequest {
class DeleteAccountRequest: IdentityToolkitRequest, AuthRPCRequest,
@unchecked Sendable /* TODO: sendable */ {
typealias Response = DeleteAccountResponse

/// The STS Access Token of the authenticated user.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ private let kPostBodyKey = "postBody"
private let kTenantIDKey = "tenantId"

@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
class EmailLinkSignInRequest: IdentityToolkitRequest, AuthRPCRequest {
class EmailLinkSignInRequest: IdentityToolkitRequest, AuthRPCRequest, @unchecked Sendable {
typealias Response = EmailLinkSignInResponse

let email: String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ private let kIDTokenKey = "idToken"
/// Represents the parameters for the getAccountInfo endpoint.
/// See https://developers.google.com/identity/toolkit/web/reference/relyingparty/getAccountInfo
@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
class GetAccountInfoRequest: IdentityToolkitRequest, AuthRPCRequest {
class GetAccountInfoRequest: IdentityToolkitRequest, AuthRPCRequest,
@unchecked Sendable /* TODO: sendable */ {
typealias Response = GetAccountInfoResponse

/// The STS Access Token for the authenticated user.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,8 @@ protocol SuppressWarning {
extension ActionCodeSettings: SuppressWarning {}

@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
class GetOOBConfirmationCodeRequest: IdentityToolkitRequest, AuthRPCRequest {
class GetOOBConfirmationCodeRequest: IdentityToolkitRequest, AuthRPCRequest,
@unchecked Sendable /* TODO: sendable */ {
typealias Response = GetOOBConfirmationCodeResponse

/// The types of OOB Confirmation Code to request.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ import Foundation
private let kGetProjectConfigEndPoint = "getProjectConfig"

@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
class GetProjectConfigRequest: IdentityToolkitRequest, AuthRPCRequest {
class GetProjectConfigRequest: IdentityToolkitRequest, AuthRPCRequest,
@unchecked Sendable /* TODO: sendable */ {
typealias Response = GetProjectConfigResponse

init(requestConfiguration: AuthRequestConfiguration) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ private let kVersionKey = "version"
private let kTenantIDKey = "tenantId"

@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
class GetRecaptchaConfigRequest: IdentityToolkitRequest, AuthRPCRequest {
class GetRecaptchaConfigRequest: IdentityToolkitRequest, AuthRPCRequest,
@unchecked Sendable /* TODO: sendable */ {
typealias Response = GetRecaptchaConfigResponse

required init(requestConfiguration: AuthRequestConfiguration) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ private let kFinalizeMFAEnrollmentEndPoint = "accounts/mfaEnrollment:finalize"
private let kTenantIDKey = "tenantId"

@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
class FinalizeMFAEnrollmentRequest: IdentityToolkitRequest, AuthRPCRequest {
class FinalizeMFAEnrollmentRequest: IdentityToolkitRequest, AuthRPCRequest,
@unchecked Sendable /* TODO: sendable */ {
typealias Response = FinalizeMFAEnrollmentResponse

let idToken: String?
Expand Down
Loading