From 91f41384975780b5d95bf45a5d9cded343176870 Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Wed, 30 Sep 2026 12:57:47 +0000 Subject: [PATCH] chore(apple): give Swift Package Manager its own Firebase SDK pin New firebase-ios-sdk releases stop publishing to CocoaPods in October 2026, so Package.swift can no longer share the podspec pin. --- .../firebase_core/ios/firebase_sdk_version.rb | 3 ++ scripts/firebase_sdk_version_spm.dart | 12 +++++++ scripts/generate_bom.dart | 9 ++++- scripts/generate_versions_spm.dart | 35 ++++--------------- 4 files changed, 29 insertions(+), 30 deletions(-) create mode 100644 scripts/firebase_sdk_version_spm.dart diff --git a/packages/firebase_core/firebase_core/ios/firebase_sdk_version.rb b/packages/firebase_core/firebase_core/ios/firebase_sdk_version.rb index 9b963d12e71e..d99cae6106a8 100644 --- a/packages/firebase_core/firebase_core/ios/firebase_sdk_version.rb +++ b/packages/firebase_core/firebase_core/ios/firebase_sdk_version.rb @@ -1,4 +1,7 @@ # https://firebase.google.com/support/release-notes/ios +# CocoaPods pin. Do not bump this past the last firebase-ios-sdk version +# published to CocoaPods. New releases stop publishing in October 2026. +# Swift Package Manager uses scripts/firebase_sdk_version_spm.dart. def firebase_sdk_version!() '12.19.0' end diff --git a/scripts/firebase_sdk_version_spm.dart b/scripts/firebase_sdk_version_spm.dart new file mode 100644 index 000000000000..430f39e376a4 --- /dev/null +++ b/scripts/firebase_sdk_version_spm.dart @@ -0,0 +1,12 @@ +// Copyright 2026 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// Swift Package Manager pin for firebase-ios-sdk. +/// +/// This may be newer than the CocoaPods pin in +/// `packages/firebase_core/firebase_core/ios/firebase_sdk_version.rb`. +/// Firebase stops publishing new Apple SDK versions to CocoaPods in +/// October 2026. Podspecs must keep using the last version that was +/// published as a pod. +const String firebaseSpmSdkVersion = '12.19.0'; diff --git a/scripts/generate_bom.dart b/scripts/generate_bom.dart index 716b6677a3dd..f2e23afa0b5a 100644 --- a/scripts/generate_bom.dart +++ b/scripts/generate_bom.dart @@ -10,6 +10,7 @@ import 'package:intl/intl.dart'; import 'package:melos/melos.dart'; import 'bom_analysis.dart'; +import 'firebase_sdk_version_spm.dart'; const packagesDir = 'packages'; const versionsFile = 'VERSIONS.md'; @@ -73,6 +74,7 @@ void main(List arguments) async { 'firebase_sdk': { 'android': androidSdkVersion, 'ios': iosSdkVersion, + 'ios_spm': firebaseSpmSdkVersion, 'web': webSdkVersion, 'windows': windowsSdkVersion, }, @@ -100,6 +102,7 @@ void main(List arguments) async { date, androidSdkVersion, iosSdkVersion, + firebaseSpmSdkVersion, webSdkVersion, windowsSdkVersion, ); @@ -145,6 +148,7 @@ Future appendStaticText( String date, String androidSdkVersion, String iosSdkVersion, + String iosSpmSdkVersion, String webSdkVersion, String windowsSdkVersion, ) async { @@ -185,7 +189,10 @@ Future appendStaticText( '| Android SDK | $androidSdkVersion | [Release Notes](https://firebase.google.com/support/release-notes/android) |', ); sink.writeln( - '| iOS SDK | $iosSdkVersion | [Release Notes](https://firebase.google.com/support/release-notes/ios) |', + '| iOS SDK (CocoaPods) | $iosSdkVersion | [Release Notes](https://firebase.google.com/support/release-notes/ios) |', + ); + sink.writeln( + '| iOS SDK (Swift Package Manager) | $iosSpmSdkVersion | [Release Notes](https://firebase.google.com/support/release-notes/ios) |', ); sink.writeln( '| Web SDK | $webSdkVersion | [Release Notes](https://firebase.google.com/support/release-notes/js) |', diff --git a/scripts/generate_versions_spm.dart b/scripts/generate_versions_spm.dart index 2b7766dedcdb..852bc20482d5 100644 --- a/scripts/generate_versions_spm.dart +++ b/scripts/generate_versions_spm.dart @@ -10,22 +10,16 @@ import 'dart:io'; import 'package:cli_util/cli_logging.dart' as logging; import 'package:yaml/yaml.dart'; -// Used to generate a simple txt file for Package.swift file to parse in order to use correct firebase-ios-sdk version +import 'firebase_sdk_version_spm.dart'; + +// Writes scripts/firebase_sdk_version_spm.dart into each plugin Package.swift. void main(List args) async { final workspace = await getMelosWorkspace(); - // get version from core - final firebaseCorePackage = workspace.filteredPackages.values - .firstWhere((package) => package.name == 'firebase_core'); - - final firebaseCoreIosVersionFile = File( - '${firebaseCorePackage.path}/ios/firebase_sdk_version.rb', - ); - final firebaseiOSVersion = getFirebaseiOSVersion(firebaseCoreIosVersionFile); - - // Update hard-coded versions in all plugin Package.swift files - updatePluginPackageSwiftVersions(workspace, firebaseiOSVersion); + // Update hard-coded versions in all plugin Package.swift files. + // CocoaPods keeps its own pin in firebase_sdk_version.rb. + updatePluginPackageSwiftVersions(workspace, firebaseSpmSdkVersion); // Update plugin version in Constants.swift for pure Swift plugins. Unable to pass macros in pure Swift implementations updateLibraryVersionPureSwiftPlugins(); } @@ -47,23 +41,6 @@ Future getMelosWorkspace() async { return workspace; } -String getFirebaseiOSVersion(File firebaseCoreIosSdkVersion) { - if (firebaseCoreIosSdkVersion.existsSync()) { - final content = firebaseCoreIosSdkVersion.readAsStringSync(); - final versionMatch = RegExp(r"'(\d+\.\d+\.\d+)'").firstMatch(content); - - if (versionMatch != null && versionMatch.group(1) != null) { - return versionMatch.group(1)!; - } else { - throw Exception( - 'Firebase iOS SDK version not found in firebase_sdk_version.rb.', - ); - } - } else { - throw Exception('firebase_sdk_version.rb file does not exist.'); - } -} - void updatePluginPackageSwiftVersions( melos.MelosWorkspace workspace, String firebaseiOSVersion,