From 438c98e6f37f4fe495da3b11abebe5049b5cb69a Mon Sep 17 00:00:00 2001 From: Nick Cooke <36927374+ncooke3@users.noreply.github.com> Date: Mon, 23 Jun 2025 19:28:11 -0400 Subject: [PATCH 01/12] [Infra] Bump swift-tools-version in Package.swift --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index ec21d0b86d1..4c01ede9ad1 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.9 +// swift-tools-version:6.0 // The swift-tools-version declares the minimum version of Swift required to // build this package. From 8766783f587f076dbd5d74503f27629201e2d724 Mon Sep 17 00:00:00 2001 From: Nick Cooke Date: Tue, 24 Jun 2025 15:34:22 -0400 Subject: [PATCH 02/12] Use Context.environment --- Package.swift | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Package.swift b/Package.swift index 4c01ede9ad1..12222880222 100644 --- a/Package.swift +++ b/Package.swift @@ -16,7 +16,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -import class Foundation.ProcessInfo import PackageDescription let firebaseVersion = "11.15.0" @@ -1412,7 +1411,7 @@ func googleAppMeasurementDependency() -> Package.Dependency { // Point SPM CI to the tip of main of https://github.com/google/GoogleAppMeasurement so that the // release process can defer publishing the GoogleAppMeasurement tag until after testing. - if ProcessInfo.processInfo.environment["FIREBASECI_USE_LATEST_GOOGLEAPPMEASUREMENT"] != nil { + if Context.environment["FIREBASECI_USE_LATEST_GOOGLEAPPMEASUREMENT"] != nil { return .package(url: appMeasurementURL, branch: "main") } @@ -1424,7 +1423,7 @@ func abseilDependency() -> Package.Dependency { // If building Firestore from source, abseil will need to be built as source // as the headers in the binary version of abseil are unusable. - if ProcessInfo.processInfo.environment["FIREBASE_SOURCE_FIRESTORE"] != nil { + if Context.environment["FIREBASE_SOURCE_FIRESTORE"] != nil { packageInfo = ( "https://github.com/firebase/abseil-cpp-SwiftPM.git", "0.20240722.0" ..< "0.20240723.0" @@ -1444,7 +1443,7 @@ func grpcDependency() -> Package.Dependency { // If building Firestore from source, abseil will need to be built as source // as the headers in the binary version of abseil are unusable. - if ProcessInfo.processInfo.environment["FIREBASE_SOURCE_FIRESTORE"] != nil { + if Context.environment["FIREBASE_SOURCE_FIRESTORE"] != nil { packageInfo = ("https://github.com/grpc/grpc-ios.git", "1.69.0" ..< "1.70.0") } else { packageInfo = ("https://github.com/google/grpc-binary.git", "1.69.0" ..< "1.70.0") @@ -1454,7 +1453,7 @@ func grpcDependency() -> Package.Dependency { } func firestoreWrapperTarget() -> Target { - if ProcessInfo.processInfo.environment["FIREBASE_SOURCE_FIRESTORE"] != nil { + if Context.environment["FIREBASE_SOURCE_FIRESTORE"] != nil { return .target( name: "FirebaseFirestoreTarget", dependencies: [.target(name: "FirebaseFirestore", @@ -1473,7 +1472,7 @@ func firestoreWrapperTarget() -> Target { } func firestoreTargets() -> [Target] { - if ProcessInfo.processInfo.environment["FIREBASE_SOURCE_FIRESTORE"] != nil { + if Context.environment["FIREBASE_SOURCE_FIRESTORE"] != nil { return [ .target( name: "FirebaseFirestoreInternalWrapper", @@ -1575,7 +1574,7 @@ func firestoreTargets() -> [Target] { } let firestoreInternalTarget: Target = { - if ProcessInfo.processInfo.environment["FIREBASECI_USE_LOCAL_FIRESTORE_ZIP"] != nil { + if Context.environment["FIREBASECI_USE_LOCAL_FIRESTORE_ZIP"] != nil { // This is set when running `scripts/check_firestore_symbols.sh`. return .binaryTarget( name: "FirebaseFirestoreInternal", From 27e5e2da69e3c80d1c1d85b734490cbbd5717d79 Mon Sep 17 00:00:00 2001 From: Nick Cooke Date: Tue, 24 Jun 2025 15:52:54 -0400 Subject: [PATCH 03/12] improvement --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 12222880222..3bb6640eb0a 100644 --- a/Package.swift +++ b/Package.swift @@ -546,7 +546,7 @@ let package = Package( "ObjC", "Public", ], resources: [.process("Resources/PrivacyInfo.xcprivacy")], - swiftSettings: Context.environment["FIREBASE_CI"] != nil ? [.define("FIREBASE_CI")] : [], + swiftSettings: [.swiftLanguageMode(SwiftLanguageMode.v5)], linkerSettings: [ .linkedFramework("Security"), .linkedFramework("SafariServices", .when(platforms: [.iOS])), From d09937848d493bba1d478c73afc52c9e3e2633da Mon Sep 17 00:00:00 2001 From: Nick Cooke Date: Tue, 24 Jun 2025 16:00:06 -0400 Subject: [PATCH 04/12] more improvements --- Package.swift | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/Package.swift b/Package.swift index 3bb6640eb0a..f471d8bf181 100644 --- a/Package.swift +++ b/Package.swift @@ -546,7 +546,9 @@ let package = Package( "ObjC", "Public", ], resources: [.process("Resources/PrivacyInfo.xcprivacy")], - swiftSettings: [.swiftLanguageMode(SwiftLanguageMode.v5)], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ], linkerSettings: [ .linkedFramework("Security"), .linkedFramework("SafariServices", .when(platforms: [.iOS])), @@ -877,7 +879,10 @@ let package = Package( .target( name: "FirebaseInAppMessaging", dependencies: ["FirebaseInAppMessagingInternal"], - path: "FirebaseInAppMessaging/Swift/Source" + path: "FirebaseInAppMessaging/Swift/Source", + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), .target( @@ -915,6 +920,9 @@ let package = Package( ], cSettings: [ .define("FIRMLModelDownloader_VERSION", to: firebaseVersion), + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .testTarget( @@ -1223,7 +1231,10 @@ let package = Package( .product(name: "GTMSessionFetcherCore", package: "gtm-session-fetcher"), .product(name: "GULEnvironment", package: "GoogleUtilities"), ], - path: "FirebaseStorage/Sources" + path: "FirebaseStorage/Sources", + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), .testTarget( name: "FirebaseStorageUnit", @@ -1568,7 +1579,10 @@ func firestoreTargets() -> [Target] { sources: [ "Swift/Source/", ], - resources: [.process("Source/Resources/PrivacyInfo.xcprivacy")] + resources: [.process("Source/Resources/PrivacyInfo.xcprivacy")], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), ] } @@ -1617,6 +1631,9 @@ func firestoreTargets() -> [Target] { ], path: "Firestore/Swift/Source", resources: [.process("Resources/PrivacyInfo.xcprivacy")], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ], linkerSettings: [ .linkedFramework("SystemConfiguration", .when(platforms: [.iOS, .macOS, .tvOS])), .linkedFramework("UIKit", .when(platforms: [.iOS, .tvOS])), From 3611240478a255f863da0af3def298ca73411a96 Mon Sep 17 00:00:00 2001 From: Nick Cooke Date: Tue, 24 Jun 2025 16:03:51 -0400 Subject: [PATCH 05/12] more more improvement --- Package.swift | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Package.swift b/Package.swift index f471d8bf181..0bf49be7d7c 100644 --- a/Package.swift +++ b/Package.swift @@ -599,7 +599,10 @@ let package = Package( .target( name: "FirebaseAuthCombineSwift", dependencies: ["FirebaseAuth"], - path: "FirebaseCombineSwift/Sources/Auth" + path: "FirebaseCombineSwift/Sources/Auth", + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), .target( name: "FirebaseFirestoreCombineSwift", @@ -826,7 +829,10 @@ let package = Package( .target( name: "FirebaseFunctionsCombineSwift", dependencies: ["FirebaseFunctions"], - path: "FirebaseCombineSwift/Sources/Functions" + path: "FirebaseCombineSwift/Sources/Functions", + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), .testTarget( name: "FunctionsCombineUnit", @@ -1107,7 +1113,10 @@ let package = Package( "FirebaseSharedSwift", ], path: "FirebaseRemoteConfig/Swift", - resources: [.process("Resources/PrivacyInfo.xcprivacy")] + resources: [.process("Resources/PrivacyInfo.xcprivacy")], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), .testTarget( name: "RemoteConfigFakeConsole", From b4f29588fd941faefed023726943ee58e72fcc89 Mon Sep 17 00:00:00 2001 From: Nick Cooke Date: Tue, 24 Jun 2025 16:07:14 -0400 Subject: [PATCH 06/12] changelog entry --- FirebaseCore/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/FirebaseCore/CHANGELOG.md b/FirebaseCore/CHANGELOG.md index b2e7592f7f1..16c8c30b0ce 100644 --- a/FirebaseCore/CHANGELOG.md +++ b/FirebaseCore/CHANGELOG.md @@ -29,6 +29,8 @@ To start using the new SDK, import the `FirebaseAI` module and use the top-level `FirebaseAI` class. See details in the [migration guide ](https://firebase.google.com/docs/ai-logic/migrate-to-latest-sdk). +- [changed] **Breaking change** The Firebase Swift package now requires the + Swift 6.0 toolchain (Xcode 16.2+). # Firebase 11.15.0 - [fixed] Remove c99 as the required C language standard. (#14950) From a27c4b55959c5b0e54d944f4bc25aabe282c94e9 Mon Sep 17 00:00:00 2001 From: Nick Cooke Date: Tue, 1 Jul 2025 11:21:18 -0400 Subject: [PATCH 07/12] fixes? --- FirebaseFunctions/Sources/Callable+Codable.swift | 2 +- Package.swift | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/FirebaseFunctions/Sources/Callable+Codable.swift b/FirebaseFunctions/Sources/Callable+Codable.swift index 4938dad1ab3..bcf5ce91a31 100644 --- a/FirebaseFunctions/Sources/Callable+Codable.swift +++ b/FirebaseFunctions/Sources/Callable+Codable.swift @@ -64,7 +64,7 @@ public struct Callable: Sendable { completion: @escaping @MainActor (Result) -> Void) { do { - let encoded = try encoder.encode(data) + let encoded = try SendableWrapper(value: encoder.encode(data)) callable.call(encoded) { result, error in do { if let result { diff --git a/Package.swift b/Package.swift index b88d4dfe88e..78480e800d4 100644 --- a/Package.swift +++ b/Package.swift @@ -744,6 +744,10 @@ let package = Package( exclude: [ "third_party/FirebaseDataEncoder/LICENSE", "third_party/FirebaseDataEncoder/METADATA", + ], + // TODO(ncooke3): Can this be upgraded to Swift 6? + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .testTarget( From 8c5f75719c3bc6e680cf9161d564c215afcd0998 Mon Sep 17 00:00:00 2001 From: Nick Cooke Date: Tue, 1 Jul 2025 18:54:31 -0400 Subject: [PATCH 08/12] more fixes --- Package.swift | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/Package.swift b/Package.swift index 78480e800d4..c132e5433d2 100644 --- a/Package.swift +++ b/Package.swift @@ -500,7 +500,10 @@ let package = Package( path: "FirebaseAppDistribution/Tests/Unit/Swift", cSettings: [ .headerSearchPath("../../../.."), - ] + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ], ), .target( @@ -568,6 +571,9 @@ let package = Package( "ObjCAPITests.m", "ObjCGlobalTests.m", "FIROAuthProviderTests.m", + ], + swiftSettings: [ + .swiftLanguageMode(.v5) ] ), .target( @@ -658,7 +664,10 @@ let package = Package( .testTarget( name: "FirebaseCrashlyticsSwiftUnit", dependencies: ["FirebaseCrashlyticsSwift"], - path: "Crashlytics/UnitTestsSwift/" + path: "Crashlytics/UnitTestsSwift/", + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), .testTarget( name: "FirebaseCrashlyticsUnit", @@ -731,6 +740,9 @@ let package = Package( path: "FirebaseDatabase/Tests/Unit/Swift", cSettings: [ .headerSearchPath("../.."), + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .target( @@ -783,6 +795,9 @@ let package = Package( path: "FirebaseFunctions/Tests/Unit", cSettings: [ .headerSearchPath("../../../"), + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .testTarget( @@ -1111,6 +1126,9 @@ let package = Package( ], cSettings: [ .headerSearchPath("../../../"), + ], + swiftSettings: [ + .swiftLanguageMode(.v5) ] ), .target( @@ -1230,6 +1248,9 @@ let package = Package( path: "FirebaseStorage/Tests/Unit", cSettings: [ .headerSearchPath("../../../"), + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .testTarget( @@ -1276,7 +1297,10 @@ let package = Package( "FirebaseStorage", .product(name: "nanopb", package: "nanopb"), ], - path: "SwiftPMTests/swift-test" + path: "SwiftPMTests/swift-test", + swiftSettings: [ + .swiftLanguageMode(.v5) + ] ), .testTarget( name: "analytics-import-test", @@ -1284,7 +1308,10 @@ let package = Package( "FirebaseAnalyticsWrapper", "Firebase", ], - path: "SwiftPMTests/analytics-import-test" + path: "SwiftPMTests/analytics-import-test", + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), .testTarget( name: "objc-import-test", @@ -1375,7 +1402,10 @@ let package = Package( .testTarget( name: "FirebaseAppCheckUnitSwift", dependencies: ["FirebaseAppCheck"], - path: "FirebaseAppCheck/Tests/Unit/Swift" + path: "FirebaseAppCheck/Tests/Unit/Swift", + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), // MARK: Testing support From 41f83294036bf24e827f21f957060aa51d639d43 Mon Sep 17 00:00:00 2001 From: Nick Cooke Date: Tue, 1 Jul 2025 18:56:07 -0400 Subject: [PATCH 09/12] fixes --- Package.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Package.swift b/Package.swift index c132e5433d2..b44573572dc 100644 --- a/Package.swift +++ b/Package.swift @@ -503,7 +503,7 @@ let package = Package( ], swiftSettings: [ .swiftLanguageMode(SwiftLanguageMode.v5), - ], + ] ), .target( @@ -573,7 +573,7 @@ let package = Package( "FIROAuthProviderTests.m", ], swiftSettings: [ - .swiftLanguageMode(.v5) + .swiftLanguageMode(SwiftLanguageMode.v5) ] ), .target( @@ -1128,7 +1128,7 @@ let package = Package( .headerSearchPath("../../../"), ], swiftSettings: [ - .swiftLanguageMode(.v5) + .swiftLanguageMode(SwiftLanguageMode.v5) ] ), .target( @@ -1299,7 +1299,7 @@ let package = Package( ], path: "SwiftPMTests/swift-test", swiftSettings: [ - .swiftLanguageMode(.v5) + .swiftLanguageMode(SwiftLanguageMode.v5) ] ), .testTarget( From 31eb9b92df67c7d96554d6e04ee30c388a638969 Mon Sep 17 00:00:00 2001 From: Nick Cooke Date: Tue, 1 Jul 2025 19:18:27 -0400 Subject: [PATCH 10/12] Style --- Package.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Package.swift b/Package.swift index b44573572dc..4ae0478e851 100644 --- a/Package.swift +++ b/Package.swift @@ -573,7 +573,7 @@ let package = Package( "FIROAuthProviderTests.m", ], swiftSettings: [ - .swiftLanguageMode(SwiftLanguageMode.v5) + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .target( @@ -1128,7 +1128,7 @@ let package = Package( .headerSearchPath("../../../"), ], swiftSettings: [ - .swiftLanguageMode(SwiftLanguageMode.v5) + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .target( @@ -1299,7 +1299,7 @@ let package = Package( ], path: "SwiftPMTests/swift-test", swiftSettings: [ - .swiftLanguageMode(SwiftLanguageMode.v5) + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .testTarget( From 651719d7fc85d685d51234038b8c3b81e0171b80 Mon Sep 17 00:00:00 2001 From: Nick Cooke Date: Tue, 1 Jul 2025 19:19:11 -0400 Subject: [PATCH 11/12] fixes --- Package.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Package.swift b/Package.swift index 4ae0478e851..32771b729ae 100644 --- a/Package.swift +++ b/Package.swift @@ -732,6 +732,9 @@ let package = Package( resources: [.process("Resources")], cSettings: [ .headerSearchPath("../.."), + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .testTarget( From 2b3665e7e2d95c05e1321f1042800288c604f56c Mon Sep 17 00:00:00 2001 From: Nick Cooke Date: Wed, 2 Jul 2025 11:35:20 -0400 Subject: [PATCH 12/12] Make protocol conform to Sendable --- .../Types/Internal/Imagen/ImagenImageRepresentable.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FirebaseAI/Sources/Types/Internal/Imagen/ImagenImageRepresentable.swift b/FirebaseAI/Sources/Types/Internal/Imagen/ImagenImageRepresentable.swift index 006493ac5ed..1c53eb0f9b6 100644 --- a/FirebaseAI/Sources/Types/Internal/Imagen/ImagenImageRepresentable.swift +++ b/FirebaseAI/Sources/Types/Internal/Imagen/ImagenImageRepresentable.swift @@ -17,7 +17,7 @@ import Foundation // TODO(andrewheard): Make this public when the SDK supports Imagen operations that take images as // input (upscaling / editing). @available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, watchOS 8.0, *) -protocol ImagenImageRepresentable { +protocol ImagenImageRepresentable: Sendable { /// Internal representation of the image for use with the Imagen model. /// /// - Important: Not needed by SDK users.