Skip to content

Analytics / GoogleAppMeasurement 12.15.0+ auto-links Apple-private "UIUtilities" framework, breaking SPM builds on the iOS 26 SDK #16486

Description

@ivanvelkov2coders

Description

Environment

  • Firebase Apple SDK: 12.17.0 — first broken in 12.15.0 (via Swift Package Manager)
  • Xcode: 26.6 (17F113)
  • iOS Simulator SDK: 26.5
  • macOS: 15 (Darwin 25.5.0)
  • Integration: FirebaseAnalytics consumed through a local SPM package, linked as a dynamic framework; app target sets OTHER_LDFLAGS = -ObjC

Summary

After updating Firebase from 12.8.0 to 12.17.0, the app fails to link on the iOS 26 SDK.

Root cause: starting with 12.15.0, the prebuilt GoogleAppMeasurement.xcframework binary appears to
have been rebuilt with a newer toolchain (12.15.0 is the release that raised Firebase's required Swift tools
version to 6.1), and that build leaked auto-link directives for Apple private frameworks into the
shipped binary — most visibly -framework UIUtilities. These are frameworks the compiler references
internally but that third-party products are not permitted to link.

On the iOS 26 SDK, the only UIUtilities is Apple's private, client-restricted framework at:

.../iPhoneSimulator.sdk/System/Library/SubFrameworks/UIUtilities.framework

Third parties are not allowed to link it, so the linker cannot satisfy the auto-link. GoogleAppMeasurement
then fails to link, which surfaces as undefined symbols for every symbol it defines
(_APMAnalyticsConfiguration, etc.). The accompanying SwiftUICore "not an allowed client" error is the
same class of leaked private-framework reference failing through a second path.

Errors observed

Could not find or use auto-linked framework 'UIUtilities': framework 'UIUtilities' not found
Undefined symbol: _APMAnalyticsConfiguration   (and other GoogleAppMeasurement symbols)
Could not parse or use implicit file '.../SwiftUICore.framework/SwiftUICore.tbd':
  cannot link directly with 'SwiftUICore' because product being built is not an allowed client of it

The SwiftUICore error is the same underlying problem (an Apple private, client-restricted SubFramework
being linked directly) surfacing through a second path.

Evidence — the auto-link is in the shipped binary

$ otool -arch x86_64 -l \
  .../artifacts/googleappmeasurement/GoogleAppMeasurement/GoogleAppMeasurement.xcframework/\
ios-arm64_x86_64-simulator/GoogleAppMeasurement.framework/GoogleAppMeasurement

     cmd LC_LINKER_OPTION
   count 2
  string #1 -framework
  string #2 UIUtilities          <- appears in 17 LC_LINKER_OPTION entries (simulator slice, 12.17.0)

The referenced symbol is present in the binary (nm -gU ... | grep APMAnalyticsConfiguration shows it
defined), confirming this is a link failure, not a genuinely missing symbol.

How this was tested (per Firebase version)

  1. Set the firebase-ios-sdk version in Package.swift.
  2. In Xcode: File ▸ Packages ▸ Reset Package Caches (forces a fresh re-resolve/re-download of the pinned version).
  3. Rebuild the project and check whether the UIUtilities / _APMAnalyticsConfiguration link errors appear.

Build-free alternative used to confirm each version quickly — inspect the resolved binary directly:

otool -arch x86_64 -l <.../GoogleAppMeasurement> | grep -Ec 'string #[0-9]+ UIUtilities'
# 0 = clean, >0 = affected

Version bisection (SPM)

The Interactive Media Ads SDK (swift-package-manager-google-interactive-media-ads-ios) was tested as a
variable and ruled out — it makes no difference to the outcome.

Firebase version Result Notes
12.8.0 ✅ builds tested with and without media-ads-ios
12.9.0 ✅ builds tested with and without media-ads-ios
12.10.0 ✅ builds without media-ads-ios
12.11.0 ✅ builds without media-ads-ios
12.12.0 ✅ builds without media-ads-ios
12.13.0 ✅ builds without media-ads-ios
12.14.0 ✅ builds without media-ads-ios — highest known-good
12.15.0 ❌ fails first broken version
12.16.0 ❌ fails
12.17.0 ❌ fails auto-link present (17 occurrences)

Regression introduced in 12.15.0 — the same release that raised Firebase's required Swift tools version
to 6.1. This strongly suggests the GoogleAppMeasurement binary was rebuilt with a newer toolchain, and
that build leaked the private-framework auto-link directives (UIUtilities, and the related SwiftUICore
reference) into the shipped binary. In other words, this is a binary-packaging regression from a
toolchain change
, not a change in the SDK's declared dependencies. (For reference, the transitive
google-ads-on-device-conversion-ios-sdk also moves from 3.2.0 at 12.8.0 to 3.6.1 at 12.17.0 across this
range, though the offending auto-link lives in the GoogleAppMeasurement binary itself.)

Expected behaviour

The prebuilt GoogleAppMeasurement binary should not carry auto-link directives for Apple private
frameworks (UIUtilities, SwiftUICore, …). These should be stripped from the shipped binary so the SDK
links cleanly, as it did in 12.14.0 and earlier.

Workaround

Pin firebase-ios-sdk to 12.14.0 or earlier — the highest version that builds cleanly on the iOS 26 SDK.

Reproducing the issue

No response

Firebase SDK Version

12.15.0

Xcode Version

26.6

Installation Method

Swift Package Manager

Firebase Product(s)

Analytics

Targeted Platforms

iOS

Package.resolved from SPM

Expand Package.resolved snippet
{
  "originHash" : "82559ae995bc785814cabdbd2eff358a0cca93c1aad69dc3fabf54038862c193",
  "pins" : [
    {
      "identity" : "abseil-cpp-binary",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/abseil-cpp-binary.git",
      "state" : {
        "revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5",
        "version" : "1.2024072200.0"
      }
    },
    {
      "identity" : "app-check",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/app-check.git",
      "state" : {
        "revision" : "3e33dd27dd4c69bd81c7c81fe61d8ccf58846902",
        "version" : "11.3.1"
      }
    },
    {
      "identity" : "appsflyerframework-static",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/AppsFlyerSDK/AppsFlyerFramework-Static.git",
      "state" : {
        "revision" : "80b7f4fcfafe6268ffd62c04076b510cb5bd0958",
        "version" : "6.17.9"
      }
    },
    {
      "identity" : "blaze-specs-ios",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/WSCSports/blaze-specs-ios",
      "state" : {
        "revision" : "fecfcc475ab48570b4046618f61a69b282bc1adc",
        "version" : "1.15.1"
      }
    },
    {
      "identity" : "brightcove-player-sdk-ios",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/brightcove/brightcove-player-sdk-ios.git",
      "state" : {
        "revision" : "5a20bd8f8ab934dbf7b3c4c8e0a28539c2da432d",
        "version" : "7.2.3"
      }
    },
    {
      "identity" : "camera-kit-ios-sdk",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/Snapchat/camera-kit-ios-sdk.git",
      "state" : {
        "revision" : "6dbbc4fa7e9f357aece1e67b6107fae2f43ffd88",
        "version" : "1.46.0"
      }
    },
    {
      "identity" : "dd-sdk-ios",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/Datadog/dd-sdk-ios.git",
      "state" : {
        "revision" : "2dc56bbb219c06102f74ab71d11e66069ba80e5d",
        "version" : "3.8.3"
      }
    },
    {
      "identity" : "events-sdk-swift",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/ht-sdks/events-sdk-swift.git",
      "state" : {
        "revision" : "de1a5e345f09c978f3e010a33f4c11687b536573",
        "version" : "0.1.1"
      }
    },
    {
      "identity" : "exponea-ios-sdk",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/exponea/exponea-ios-sdk.git",
      "state" : {
        "revision" : "135ddac6cc80169a0cc9cdb32a061ca11320e6b8",
        "version" : "3.11.0"
      }
    },
    {
      "identity" : "firebase-ios-sdk",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/firebase/firebase-ios-sdk.git",
      "state" : {
        "revision" : "42e81d245e30e49ea6a5830cf2842d44a1591270",
        "version" : "12.15.0"
      }
    },
    {
      "identity" : "google-ads-on-device-conversion-ios-sdk",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/googleads/google-ads-on-device-conversion-ios-sdk",
      "state" : {
        "revision" : "dc39082d8881109d35b94b1c122164c0e8d08a55",
        "version" : "3.6.1"
      }
    },
    {
      "identity" : "googleappmeasurement",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/GoogleAppMeasurement.git",
      "state" : {
        "revision" : "144855f40d8668927f256a3045f7fdc4c3f4338b",
        "version" : "12.15.0"
      }
    },
    {
      "identity" : "googledatatransport",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/GoogleDataTransport.git",
      "state" : {
        "revision" : "ba3358d3c3dbae8ef230b58a46b97ad65e84e974",
        "version" : "10.1.1"
      }
    },
    {
      "identity" : "googleutilities",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/GoogleUtilities.git",
      "state" : {
        "revision" : "9f183ae842be978784f2963a343682e0c46d8fb3",
        "version" : "8.1.2"
      }
    },
    {
      "identity" : "grpc-binary",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/grpc-binary.git",
      "state" : {
        "revision" : "75b31c842f664a0f46a2e590a570e370249fd8f6",
        "version" : "1.69.1"
      }
    },
    {
      "identity" : "gtm-session-fetcher",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/gtm-session-fetcher.git",
      "state" : {
        "revision" : "724a52eea6329b7e12d3ad8300d76ca9f3895fcc",
        "version" : "5.3.1"
      }
    },
    {
      "identity" : "interop-ios-for-google-sdks",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/interop-ios-for-google-sdks.git",
      "state" : {
        "revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe",
        "version" : "101.0.0"
      }
    },
    {
      "identity" : "kingfisher",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/onevcat/Kingfisher.git",
      "state" : {
        "revision" : "ac632bd26a1c00f139ff62fd01806f21cf67325e",
        "version" : "8.10.0"
      }
    },
    {
      "identity" : "kscrash",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/kstenerud/KSCrash.git",
      "state" : {
        "revision" : "95a8895d75f3c22aa9ad9f2a15d2fbd97b0a55e2",
        "version" : "2.5.1"
      }
    },
    {
      "identity" : "leveldb",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/firebase/leveldb.git",
      "state" : {
        "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1",
        "version" : "1.22.5"
      }
    },
    {
      "identity" : "microsoft-authentication-library-for-objc",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/AzureAD/microsoft-authentication-library-for-objc.git",
      "state" : {
        "revision" : "231af305ec9c4634f32af0d43a3765b5b00e261d",
        "version" : "2.6.0"
      }
    },
    {
      "identity" : "nanopb",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/firebase/nanopb.git",
      "state" : {
        "revision" : "3851d94a41890dea16dc3db34caf60e585cb4163",
        "version" : "2.30910.1"
      }
    },
    {
      "identity" : "opentelemetry-swift-core",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/open-telemetry/opentelemetry-swift-core",
      "state" : {
        "revision" : "240c8d5e36c3c7b774ed961325369f0b1f2c965f",
        "version" : "2.3.0"
      }
    },
    {
      "identity" : "otpublishersheadlesssdk",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/Zentrust/OTPublishersHeadlessSDK.git",
      "state" : {
        "revision" : "b7420965cb5aaea9a475874cf19a425b16b64290",
        "version" : "202510.1.0"
      }
    },
    {
      "identity" : "promises",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/promises.git",
      "state" : {
        "revision" : "f4a19a3c313dc2616c70bb49d29a799fb16be837",
        "version" : "2.4.1"
      }
    },
    {
      "identity" : "snap-kit-spm",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/Snapchat/snap-kit-spm",
      "state" : {
        "revision" : "b4593a1ec3813af844806fef319ef68888611fba",
        "version" : "2.6.0"
      }
    },
    {
      "identity" : "sovran-swift",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/segmentio/Sovran-Swift.git",
      "state" : {
        "revision" : "24867f3e4ac62027db9827112135e6531b6f4051",
        "version" : "1.1.2"
      }
    },
    {
      "identity" : "swift-atomics",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/apple/swift-atomics.git",
      "state" : {
        "revision" : "0442cb5a3f98ab802acb777929fdb446bda11a34",
        "version" : "1.3.1"
      }
    },
    {
      "identity" : "swift-package-manager-google-interactive-media-ads-ios",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/googleads/swift-package-manager-google-interactive-media-ads-ios.git",
      "state" : {
        "revision" : "871bc80349774ba228c41096129995d1e9848b04",
        "version" : "3.28.10"
      }
    },
    {
      "identity" : "swift-package-manager-google-mobile-ads",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/googleads/swift-package-manager-google-mobile-ads.git",
      "state" : {
        "revision" : "1239c23464503053c17d37ee5daa70de3455e9c8",
        "version" : "12.14.0"
      }
    },
    {
      "identity" : "swift-package-manager-google-user-messaging-platform",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/googleads/swift-package-manager-google-user-messaging-platform.git",
      "state" : {
        "revision" : "13b248eaa73b7826f0efb1bcf455e251d65ecb1b",
        "version" : "3.1.0"
      }
    },
    {
      "identity" : "swiftsoup",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/scinfu/SwiftSoup.git",
      "state" : {
        "revision" : "8d6ad267714cac3ae747cefdd21f7a6665006e1f",
        "version" : "2.13.7"
      }
    }
  ],
  "version" : 3
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions