From c9488e7dd2453fb7a850ed78b2a75e36f65178dc Mon Sep 17 00:00:00 2001 From: Leon Herbert Date: Sun, 4 Jan 2026 21:55:36 -0700 Subject: [PATCH 1/3] fix(firebase_auth): ensure FLTFirebaseAuthPlugin symbol retained in iOS builds (prevent linker regression) --- .../FLTFirebaseAuthPlugin+EnsureLoad.m | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin+EnsureLoad.m diff --git a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin+EnsureLoad.m b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin+EnsureLoad.m new file mode 100644 index 000000000000..7c2c2e1050ce --- /dev/null +++ b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin+EnsureLoad.m @@ -0,0 +1,13 @@ +#import "include/Public/FLTFirebaseAuthPlugin.h" + +// This file ensures the FLTFirebaseAuthPlugin Objective-C class symbol is +// referenced/retained in iOS builds so that GeneratedPluginRegistrant can +// link against it. Some packaging or build configurations can omit the +// class symbol from the final binary; referencing the class from a +// constructor function prevents that trimming. + +__attribute__((constructor)) +static void FLTFirebaseAuthPlugin_ensure_symbol_exists(void) { + // Reference the class to force the linker to keep it. + (void)[FLTFirebaseAuthPlugin class]; +} From 0a7c2039830bfb8717160fdfbca660df682fd968 Mon Sep 17 00:00:00 2001 From: Leon Herbert Date: Sun, 4 Jan 2026 21:59:21 -0700 Subject: [PATCH 2/3] ci: add Podspec lint workflow for firebase_auth iOS --- .../.github/workflows/podspec-lint.yml | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 packages/firebase_auth/firebase_auth/.github/workflows/podspec-lint.yml diff --git a/packages/firebase_auth/firebase_auth/.github/workflows/podspec-lint.yml b/packages/firebase_auth/firebase_auth/.github/workflows/podspec-lint.yml new file mode 100644 index 000000000000..dee4e809e277 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/.github/workflows/podspec-lint.yml @@ -0,0 +1,30 @@ +name: Podspec Lint + +on: + pull_request: + push: + branches: [ main ] + +jobs: + podspec-lint: + name: Lint iOS Podspec + runs-on: macos-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Ruby (bundler) + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2' + + - name: Install CocoaPods + run: | + gem install cocoapods + pod repo update + + - name: Validate Podspec + working-directory: ./packages/firebase_auth/firebase_auth/ios + run: | + pod spec lint firebase_auth.podspec --allow-warnings --use-libraries --verbose From 1de9a1973e4f3abd63d0eb5b8b51c0b05f85d689 Mon Sep 17 00:00:00 2001 From: Leon Herbert Date: Sun, 4 Jan 2026 22:02:53 -0700 Subject: [PATCH 3/3] # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch fix/firebase_auth-ios-register-17934 # Changes to be committed: # .metadata # ISSUE_DRAFTS/firebase_auth-6.1.3-ios-linker.md # ISSUE_DRAFTS/firebase_auth_nm.txt # ISSUE_DRAFTS/firebase_auth_strings.txt # ISSUE_DRAFTS/issue_17934_comment.md # flutterfire # ios.bak/.gitignore # ios.bak/Flutter/AppFrameworkInfo.plist # ios.bak/Flutter/Debug.xcconfig # ios.bak/Flutter/Profile.xcconfig # ios.bak/Flutter/Release.xcconfig # ios.bak/Podfile # ios.bak/Profile.xcconfig # ios.bak/Runner.xcodeproj/project.pbxproj # ios.bak/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata # ios.bak/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist # ios.bak/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings # ios.bak/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme # ios.bak/Runner.xcworkspace/contents.xcworkspacedata # ios.bak/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist # ios.bak/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings # ios.bak/Runner/AppDelegate.swift # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png # ios.bak/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png # ios.bak/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json # ios.bak/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png # ios.bak/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png # ios.bak/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png # ios.bak/Runner/Assets.xcassets/LaunchImage.imageset/README.md # ios.bak/Runner/Base.lproj/LaunchScreen.storyboard # ios.bak/Runner/Base.lproj/Main.storyboard # ios.bak/Runner/GoogleService-Info .plist # ios.bak/Runner/GoogleService-Info.plist # ios.bak/Runner/Info.plist # ios.bak/Runner/Runner-Bridging-Header.h # ios.bak/Runner/google-services.json # ios.bak/RunnerTests/RunnerTests.swift # ios/Flutter/Debug.xcconfig # ios/Flutter/Release.xcconfig # ios/Podfile # ios/Podfile.lock # ios/Runner.xcodeproj/project.pbxproj # ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme # ios/Runner/AppDelegate.swift # ios/Runner/Info.plist # ios/build/ios/XCBuildData/PIFCache/project/PROJECT@v11_mod=7350fb56b33dbf3d272e31d64fccf3fa_hash=bfdfe7dc352907fc980b868725387e98plugins=1OJSG6M1FOV3XYQCBH7Z29RZ0FPR9XDE1-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=01e0f0123250086db86d837df2b383ae-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=050d91888d8a8c1396f80182783e5a8a-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=08f49c9fefa05da222f5f31f87d72653-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0d30c4afe79e18e0f377c305c43bab3b-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0e59a753876b74c896a2e2af6a273004-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=0f118ff7ae2453e0ddc5b9764570b03f-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=127081d8560649cdc55b2f176acf39f9-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=17c85ae97850b54d094306ef5f8b4524-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1b51ac4de7024161366334178c85ea16-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=1d4d9e9b078f4c571e6fa84b4068a99c-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=2b0820b35ebe716345359ef7b5dd4b31-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=38d7c1697e43d910f5d7c4dd7f9160e7-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=3cee825a4246b1418894357d33509808-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=3dbd92f90b45f232bce09db16663829b-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=3fbf574c77b5089f483ca012df34a205-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=496d452fdd30c800bf9c0976674facaf-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4abf6549dad843e644dc2653eee39c17-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4bb30405586e4f172ddfe00243144645-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=4e9a28ed9d7b23db2ee34ad557953b4d-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=59dbe5ee126156a01fb242f620c07df3-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=61fc6f693941ca364d08b6d39a95dd10-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=6236b616107f928c3043a06fb0637aef-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=6ad642d583272e5870f76599d24eaf62-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=6f53c2d1c613c55ea450e48675a3c92e-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7154fc33551944940ac75aa42aaa6711-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=717b3a04e1417b76d9a381431b72377b-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=719e27242a7f25d2f46129f8f770d23e-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=723bbe48c35a178faa36bb937962338a-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=723fd1754c5bdf1f18a0e171ae9baf72-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=72cfbb3f3339ce7addad90fa9ed74914-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=78bc35dfc2cba1d240f78dfea618e5fa-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7950327e9b869618e75045c1e6cd8fd2-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7f25f5f7f45420752d02752ce4f5fa9d-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=7fa0ea9b8ae0c31e783bb4c912465f9a-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=8249e0770e3ac7d71e5e7ca4e02d4db3-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=83063301eecd370ada8d88a973536630-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=90933c373c724f9cc8da400abe5afcde-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=929fcd5b862af15ba0fd435ed784d449-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=9310e57fe44b4431be4e0488fe3fb669-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=93838c4f2b62e657ec54b7c04fffb793-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=95f8215dfe0d3b44a0198212fb88bbcd-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=96cda381a5f844df99c2c2acec8736fd-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=9cf02e54cc05ec7a51258d01d8c4645d-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a0f75550df71be5078e3949da930f0bd-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=a7381f392d46b0f1fd05a25358b445c8-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ad1ddad9602da4260c3672315b40d285-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=adea403da47e22352975bfaa57a1a30f-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=af8694aa56e532ea8e2ae21d31c488da-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=b0ef9e858ba6ba8fd04c1e9b8df24048-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=b3143fa6da341a157437cfe06bfed8f4-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=b45294a0733bc726f90d15dd4777e188-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=b5e8aa5a6aec5b5a18c284ea2ddcf93a-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=bd45665449f6c57c25c7d78262730f05-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=be958d1efa65ba5e5b084df501e8eee0-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=bf86e04d364cce65553132490c01ba50-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c0568c74db1c4b80218f7a40ab7c4844-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c537477e1102d473c072ec6eb1814937-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c986aa0ee729916e2f24c09de4413ebd-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=c99d71671b5f7bd87ccabf40a75e52c2-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=cbc428079a4bf4e4794dbb8c76b58163-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ceb3c04d8f842bdfe264dab7efd1b923-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d2a9b7a83debf5b8053eeb10c3e94b1c-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d448fec265936e82c327f06d88d80bbe-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d52a8f3aef490a9970813b035f2a4305-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=d8b4664776ea5960c0dad7444405555d-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=e15d07e2490d3607fafb247ca850df9f-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=ec66353946232875da927076f3edbc7f-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=f0ecf7b5f2ad457549dc2706976fd5b5-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=f29f7ff58d2b02b6fda4fec36b7d665a-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=f4d2f298713e936f915354bef4899b28-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=f5aacf203c84ab9e583f3dff78952e44-json # ios/build/ios/XCBuildData/PIFCache/target/TARGET@v11_hash=f97b327f141ce639c933e90e15490134-json # ios/build/ios/XCBuildData/PIFCache/workspace/WORKSPACE@v11_hash=(null)_subobjects=02fc02ca3d95c2c79a1040955147d4e9-json # lib/main.dart # lib/models/district_groups.dart # lib/screens/home_screen.dart # lib/screens/map_screen.dart # lib/services/device_service.dart # lib/services/presence_service.dart # lib/services/user_profile_service.dart # lib/services/viewer_prefs_service.dart # macos/Flutter/GeneratedPluginRegistrant.swift # windows/flutter/generated_plugin_registrant.cc # windows/flutter/generated_plugins.cmake; # # Changes not staged for commit: # flutterfire; # # Untracked files: # ; --- .../.github/workflows/binary-check.yml | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 packages/firebase_auth/firebase_auth/.github/workflows/binary-check.yml diff --git a/packages/firebase_auth/firebase_auth/.github/workflows/binary-check.yml b/packages/firebase_auth/firebase_auth/.github/workflows/binary-check.yml new file mode 100644 index 000000000000..7b373304fdb7 --- /dev/null +++ b/packages/firebase_auth/firebase_auth/.github/workflows/binary-check.yml @@ -0,0 +1,63 @@ +name: iOS binary symbol check + +on: + pull_request: + push: + branches: [ main ] + +jobs: + binary-check: + name: Build example iOS app and verify plugin symbol + runs-on: macos-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Flutter + uses: subosito/flutter-action@v2 + with: + channel: stable + + - name: Install CocoaPods + run: | + sudo gem install cocoapods + pod repo update + + - name: Install Dart deps (example) + working-directory: ./packages/firebase_auth/firebase_auth/example + run: flutter pub get + + - name: Install Pods (example) + working-directory: ./packages/firebase_auth/firebase_auth/example/ios + run: pod install --repo-update + + - name: Build example iOS app (Release) + working-directory: ./packages/firebase_auth/firebase_auth/example/ios + run: | + set -o pipefail + # Build into workspace-local derived data so we can locate products reliably + xcodebuild -workspace Runner.xcworkspace -scheme Runner -configuration Release -sdk iphoneos \ + -derivedDataPath $GITHUB_WORKSPACE/build/derivedData clean build CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO + + - name: Locate built firebase_auth.framework + run: | + FRAMEWORK=$(find $GITHUB_WORKSPACE/build/derivedData -name "firebase_auth.framework" | head -n 1) + echo "FOUND_FRAMEWORK=$FRAMEWORK" >> $GITHUB_ENV + if [ -z "$FRAMEWORK" ]; then + echo "firebase_auth.framework not found in derived data" + find $GITHUB_WORKSPACE/build/derivedData -maxdepth 4 -type d -print || true + exit 1 + fi + + - name: Verify FLTFirebaseAuthPlugin symbol is exported + run: | + set -o pipefail + echo "Checking framework: $FOUND_FRAMEWORK" + if nm -gU "$FOUND_FRAMEWORK/firebase_auth" | grep -q "_OBJC_CLASS_\$_FLTFirebaseAuthPlugin"; then + echo "Symbol _OBJC_CLASS_$_FLTFirebaseAuthPlugin found" + else + echo "Symbol _OBJC_CLASS_$_FLTFirebaseAuthPlugin NOT found. Dumping symbols for debugging:" + nm -gU "$FOUND_FRAMEWORK/firebase_auth" || true + exit 1 + fi