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. 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) 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 9e7a4a0b4fc..32771b729ae 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. @@ -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 = "12.0.0" @@ -501,6 +500,9 @@ let package = Package( path: "FirebaseAppDistribution/Tests/Unit/Swift", cSettings: [ .headerSearchPath("../../../.."), + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), @@ -521,7 +523,9 @@ 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])), @@ -567,12 +571,18 @@ let package = Package( "ObjCAPITests.m", "ObjCGlobalTests.m", "FIROAuthProviderTests.m", + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .target( name: "FirebaseAuthCombineSwift", dependencies: ["FirebaseAuth"], - path: "FirebaseCombineSwift/Sources/Auth" + path: "FirebaseCombineSwift/Sources/Auth", + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), .target( name: "FirebaseFirestoreCombineSwift", @@ -654,7 +664,10 @@ let package = Package( .testTarget( name: "FirebaseCrashlyticsSwiftUnit", dependencies: ["FirebaseCrashlyticsSwift"], - path: "Crashlytics/UnitTestsSwift/" + path: "Crashlytics/UnitTestsSwift/", + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), .testTarget( name: "FirebaseCrashlyticsUnit", @@ -719,6 +732,9 @@ let package = Package( resources: [.process("Resources")], cSettings: [ .headerSearchPath("../.."), + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .testTarget( @@ -727,6 +743,9 @@ let package = Package( path: "FirebaseDatabase/Tests/Unit/Swift", cSettings: [ .headerSearchPath("../.."), + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .target( @@ -740,6 +759,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( @@ -775,6 +798,9 @@ let package = Package( path: "FirebaseFunctions/Tests/Unit", cSettings: [ .headerSearchPath("../../../"), + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .testTarget( @@ -799,7 +825,10 @@ let package = Package( .target( name: "FirebaseFunctionsCombineSwift", dependencies: ["FirebaseFunctions"], - path: "FirebaseCombineSwift/Sources/Functions" + path: "FirebaseCombineSwift/Sources/Functions", + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), .testTarget( name: "FunctionsCombineUnit", @@ -852,7 +881,10 @@ let package = Package( .target( name: "FirebaseInAppMessaging", dependencies: ["FirebaseInAppMessagingInternal"], - path: "FirebaseInAppMessaging/Swift/Source" + path: "FirebaseInAppMessaging/Swift/Source", + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), .target( @@ -890,6 +922,9 @@ let package = Package( ], cSettings: [ .define("FIRMLModelDownloader_VERSION", to: firebaseVersion), + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .testTarget( @@ -1074,7 +1109,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", @@ -1091,6 +1129,9 @@ let package = Package( ], cSettings: [ .headerSearchPath("../../../"), + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .target( @@ -1198,7 +1239,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", @@ -1207,6 +1251,9 @@ let package = Package( path: "FirebaseStorage/Tests/Unit", cSettings: [ .headerSearchPath("../../../"), + ], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), ] ), .testTarget( @@ -1253,7 +1300,10 @@ let package = Package( "FirebaseStorage", .product(name: "nanopb", package: "nanopb"), ], - path: "SwiftPMTests/swift-test" + path: "SwiftPMTests/swift-test", + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), .testTarget( name: "analytics-import-test", @@ -1261,7 +1311,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", @@ -1352,7 +1405,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 @@ -1386,7 +1442,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") } @@ -1398,7 +1454,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" @@ -1418,7 +1474,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") @@ -1428,7 +1484,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", @@ -1447,7 +1503,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", @@ -1543,13 +1599,16 @@ func firestoreTargets() -> [Target] { sources: [ "Swift/Source/", ], - resources: [.process("Source/Resources/PrivacyInfo.xcprivacy")] + resources: [.process("Source/Resources/PrivacyInfo.xcprivacy")], + swiftSettings: [ + .swiftLanguageMode(SwiftLanguageMode.v5), + ] ), ] } 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", @@ -1592,6 +1651,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])),