Преглед изворни кода

Merge branch 'main' into nc/bundle-resources-in-framework

Nick Cooke пре 2 година
родитељ
комит
674c0aa319
100 измењених фајлова са 1424 додато и 1435 уклоњено
  1. 12 12
      .github/workflows/abtesting.yml
  2. 2 2
      .github/workflows/analytics.yml
  3. 1 1
      .github/workflows/api_diff_report.yml
  4. 8 8
      .github/workflows/appdistribution.yml
  5. 4 4
      .github/workflows/archiving.yml
  6. 14 15
      .github/workflows/auth.yml
  7. 2 2
      .github/workflows/check.yml
  8. 4 4
      .github/workflows/client_app.yml
  9. 5 5
      .github/workflows/cocoapods-integration.yml
  10. 2 2
      .github/workflows/combine.yml
  11. 7 7
      .github/workflows/core.yml
  12. 3 3
      .github/workflows/core_extension.yml
  13. 7 7
      .github/workflows/core_internal.yml
  14. 14 15
      .github/workflows/crashlytics.yml
  15. 1 1
      .github/workflows/danger.yml
  16. 13 13
      .github/workflows/database.yml
  17. 10 10
      .github/workflows/dynamiclinks.yml
  18. 9 9
      .github/workflows/firebase_app_check.yml
  19. 2 2
      .github/workflows/firebasepod.yml
  20. 89 0
      .github/workflows/firestore-nightly.yml
  21. 64 20
      .github/workflows/firestore.yml
  22. 12 12
      .github/workflows/functions.yml
  23. 2 2
      .github/workflows/generate_issues.yml
  24. 3 3
      .github/workflows/google-utilities-components.yml
  25. 16 16
      .github/workflows/health-metrics-presubmit.yml
  26. 1 1
      .github/workflows/health-metrics-release.yml
  27. 10 10
      .github/workflows/inappmessaging.yml
  28. 12 13
      .github/workflows/installations.yml
  29. 29 30
      .github/workflows/messaging.yml
  30. 10 10
      .github/workflows/mlmodeldownloader.yml
  31. 1 1
      .github/workflows/notice_generation.yml
  32. 3 3
      .github/workflows/performance-integration-tests.yml
  33. 15 15
      .github/workflows/performance.yml
  34. 20 20
      .github/workflows/prerelease.yml
  35. 16 16
      .github/workflows/release.yml
  36. 14 14
      .github/workflows/remoteconfig.yml
  37. 3 3
      .github/workflows/sessions-integration-tests.yml
  38. 7 7
      .github/workflows/sessions.yml
  39. 5 5
      .github/workflows/shared-swift.yml
  40. 2 2
      .github/workflows/spectesting.yml
  41. 9 9
      .github/workflows/spm.yml
  42. 20 23
      .github/workflows/storage.yml
  43. 2 2
      .github/workflows/symbolcollision.yml
  44. 1 1
      .github/workflows/update-cpp-sdk-on-release.yml
  45. 2 2
      .github/workflows/watchos-sample.yml
  46. 34 34
      .github/workflows/zip.yml
  47. 2 2
      CONTRIBUTING.md
  48. 2 2
      Carthage.md
  49. 0 45
      ClientApp/Podfile
  50. 0 36
      CocoapodsIntegrationTest/TestEnvironments/Cocoapods_multiprojects_frameworks/Podfile
  51. 1 1
      Crashlytics/CHANGELOG.md
  52. 2 0
      Crashlytics/Crashlytics/Handlers/FIRCLSSignal.c
  53. 24 24
      Firebase.podspec
  54. 1 1
      FirebaseABTesting.podspec
  55. 3 3
      FirebaseAnalytics.podspec
  56. 2 2
      FirebaseAnalyticsOnDeviceConversion.podspec
  57. 1 1
      FirebaseAppCheck.podspec
  58. 5 0
      FirebaseAppCheck/CHANGELOG.md
  59. 26 32
      FirebaseAppCheck/Tests/Unit/Swift/AppCheckAPITests.swift
  60. 1 1
      FirebaseAppCheckInterop.podspec
  61. 1 1
      FirebaseAppDistribution.podspec
  62. 4 4
      FirebaseAppDistributionInternal/README.md
  63. 1 1
      FirebaseAuth.podspec
  64. 1 1
      FirebaseAuth/Sources/Backend/FIRAuthBackend.h
  65. 21 23
      FirebaseAuth/Tests/Sample/SwiftApiTests/AccountInfoTests.swift
  66. 9 11
      FirebaseAuth/Tests/Sample/SwiftApiTests/AnonymousTests.swift
  67. 15 19
      FirebaseAuth/Tests/Sample/SwiftApiTests/EmailPasswordTests.swift
  68. 0 8
      FirebaseAuth/Tests/Sample/SwiftApiTests/FacebookTests.swift
  69. 35 39
      FirebaseAuth/Tests/Sample/SwiftApiTests/GoogleTests.swift
  70. 10 12
      FirebaseAuth/Tests/Sample/SwiftApiTests/TestsBase.swift
  71. 51 0
      FirebaseAuth/Tests/Unit/ObjCGlobalTests.m
  72. 50 0
      FirebaseAuth/Tests/Unit/SwiftGlobalTests.swift
  73. 1 1
      FirebaseAuthInterop.podspec
  74. 1 1
      FirebaseCore.podspec
  75. 9 3
      FirebaseCore/CHANGELOG.md
  76. 33 1
      FirebaseCore/Sources/FIRComponentContainer.m
  77. 5 7
      FirebaseCore/Tests/SwiftUnit/CoreAPITests.swift
  78. 1 1
      FirebaseCoreExtension.podspec
  79. 1 1
      FirebaseCoreInternal.podspec
  80. 1 1
      FirebaseCrashlytics.podspec
  81. 1 1
      FirebaseDatabase.podspec
  82. 1 1
      FirebaseDatabase/Tests/Unit/FIRDatabaseConnectionContextProviderTests.m
  83. 139 169
      FirebaseDatabase/Tests/Unit/Swift/DatabaseAPITests.swift
  84. 1 1
      FirebaseDynamicLinks.podspec
  85. 1 1
      FirebaseDynamicLinks/CHANGELOG.md
  86. 5 0
      FirebaseDynamicLinks/README.md
  87. 0 104
      FirebaseDynamicLinks/Tests/Integration/FDLBuilderTestAppObjCEarlGreyTests.m
  88. 1 1
      FirebaseFirestore.podspec
  89. 1 1
      FirebaseFirestoreInternal.podspec
  90. 1 1
      FirebaseFunctions.podspec
  91. 49 51
      FirebaseFunctions/Sources/Callable+Codable.swift
  92. 25 27
      FirebaseFunctions/Sources/HTTPSCallable.swift
  93. 310 339
      FirebaseFunctions/Tests/Integration/IntegrationTests.swift
  94. 18 22
      FirebaseFunctions/Tests/Unit/FunctionsAPITests.swift
  95. 1 1
      FirebaseInAppMessaging.podspec
  96. 1 1
      FirebaseInAppMessaging/Sources/DefaultUI/FIRCore+InAppMessagingDisplay.h
  97. 1 1
      FirebaseInAppMessaging/Sources/FIRCore+InAppMessaging.h
  98. 1 1
      FirebaseInstallations.podspec
  99. 24 30
      FirebaseInstallations/Source/Tests/Unit/Swift/InstallationsAPITests.swift
  100. 1 1
      FirebaseMLModelDownloader.podspec

+ 12 - 12
.github/workflows/abtesting.yml

@@ -29,10 +29,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -54,13 +54,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -74,10 +74,10 @@ jobs:
 
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: catalyst${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -93,7 +93,7 @@ jobs:
       signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup quickstart
       env:
@@ -116,11 +116,11 @@ jobs:
       signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - uses: actions/setup-python@v4
       with:
-        python-version: '3.7'
+        python-version: '3.11'
     - name: Setup quickstart
       env:
         LEGACY: true
@@ -133,7 +133,7 @@ jobs:
         LEGACY: true
       run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_ftl.sh ABTesting)
     - id: ftl_test
-      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.2
+      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.4
       with:
         credentials_json: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_CREDENTIALS }}
         testapp_dir: quickstart-ios/build-for-testing
@@ -152,7 +152,7 @@ jobs:
         ]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 2 - 2
.github/workflows/analytics.yml

@@ -28,11 +28,11 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 1 - 1
.github/workflows/api_diff_report.yml

@@ -21,7 +21,7 @@ jobs:
 
     steps:
       - name: Checkout PR branch
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
           fetch-depth: 2
 

+ 8 - 8
.github/workflows/appdistribution.yml

@@ -27,10 +27,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -52,13 +52,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -72,10 +72,10 @@ jobs:
 
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: catalyst${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -94,7 +94,7 @@ jobs:
         ]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 4 - 4
.github/workflows/archiving.yml

@@ -25,10 +25,10 @@ jobs:
         # These need to be on a single line or else the formatting won't validate.
         pod: ["FirebaseAppDistribution", "FirebaseDynamicLinks", "FirebaseInAppMessaging", "FirebasePerformance"]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: cron-${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -48,10 +48,10 @@ jobs:
         # These need to be on a single line or else the formatting won't validate.
         pod: ["FirebaseABTesting", "FirebaseAuth", "FirebaseCore", "FirebaseCrashlytics", "FirebaseDatabase", "FirebaseFirestore", "FirebaseFunctions", "FirebaseMessaging", "FirebaseRemoteConfig", "FirebaseStorage"]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: pods-${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 14 - 15
.github/workflows/auth.yml

@@ -30,14 +30,13 @@ jobs:
         include:
           - os: macos-12
             xcode: Xcode_14.2
-            tests:
-          # Flaky tests on CI
-          - os: macos-13
-            xcode: Xcode_15.0.1
             tests: --skip-tests
+          - os: macos-13
+            xcode: Xcode_15.1
+            tests:
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -58,10 +57,10 @@ jobs:
       plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: integration-tests${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -99,14 +98,14 @@ jobs:
             xcode: Xcode_14.2
             test: spm
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
             test: spmbuildonly
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -119,10 +118,10 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: catalyst${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -139,7 +138,7 @@ jobs:
       signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh authentication
@@ -159,7 +158,7 @@ jobs:
   #     signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
   #   runs-on: macos-12
   #   steps:
-  #   - uses: actions/checkout@v3
+  #   - uses: actions/checkout@v4
   #   - uses: ruby/setup-ruby@v1
   #   - name: Setup quickstart
   #     run: scripts/setup_quickstart.sh authentication
@@ -189,7 +188,7 @@ jobs:
         ]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 2 - 2
.github/workflows/check.yml

@@ -5,7 +5,7 @@ on:
     paths-ignore:
     - 'Firestore/**'
   push:
-    branches: master
+    branches: main
 
 concurrency:
     group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
@@ -19,7 +19,7 @@ jobs:
     env:
       MINT_PATH: ${{ github.workspace }}/mint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - uses: actions/setup-python@v4
       with:

+ 4 - 4
.github/workflows/client_app.yml

@@ -9,7 +9,7 @@ on:
       - "*.podspec"
       - "scripts/install_prereqs.sh"
       - "scripts/build.sh"
-      - "ClientApp/**"
+      - "IntegrationTesting/ClientApp/**"
       - "Gemfile*"
   schedule:
     # Run every day at 12am (PST) - cron uses UTC times
@@ -32,7 +32,7 @@ jobs:
         platform: [iOS]
         scheme: [ClientApp, ClientApp-iOS13]
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
         with:
           cache_key: ${{ matrix.os }}
@@ -51,7 +51,7 @@ jobs:
           platform: [iOS]
           scheme: [ClientApp, ClientApp-iOS13]
       steps:
-        - uses: actions/checkout@v3
+        - uses: actions/checkout@v4
         - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
           with:
             cache_key: ${{ matrix.os }}
@@ -66,7 +66,7 @@ jobs:
       matrix:
         scheme: [ClientApp-CocoaPods, ClientApp-CocoaPods-iOS13]
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
         with:
           cache_key: ${{ matrix.os }}

+ 5 - 5
.github/workflows/cocoapods-integration.yml

@@ -3,7 +3,7 @@ name: cocoapods-integration
 on:
   pull_request:
     paths:
-    - 'CocoapodsIntegrationTest/**'
+    - 'IntegrationTesting/CocoapodsIntegrationTest/**'
     - '.github/workflows/cocoapods-integration.yml'
     - 'Gemfile*'
   schedule:
@@ -21,7 +21,7 @@ jobs:
 
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -29,6 +29,6 @@ jobs:
       run: brew install coreutils
     - name: Build and test
       run: |
-        scripts/third_party/travis/retry.sh ./CocoapodsIntegrationTest/scripts/build_with_environment.sh \
-          --gemfile=./CocoapodsIntegrationTest/TestEnvironments/Cocoapods_multiprojects_frameworks/Gemfile \
-          --podfile=./CocoapodsIntegrationTest/TestEnvironments/Cocoapods_multiprojects_frameworks/Podfile
+        scripts/third_party/travis/retry.sh ./IntegrationTesting/CocoapodsIntegrationTest/scripts/build_with_environment.sh \
+          --gemfile=./IntegrationTesting/CocoapodsIntegrationTest/TestEnvironments/Cocoapods_multiprojects_frameworks/Gemfile \
+          --podfile=./IntegrationTesting/CocoapodsIntegrationTest/TestEnvironments/Cocoapods_multiprojects_frameworks/Podfile

+ 2 - 2
.github/workflows/combine.yml

@@ -55,7 +55,7 @@ jobs:
         target: [iOS]
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -78,7 +78,7 @@ jobs:
       plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}

+ 7 - 7
.github/workflows/core.yml

@@ -27,10 +27,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -50,13 +50,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -70,7 +70,7 @@ jobs:
 
     runs-on: macos-13
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -93,7 +93,7 @@ jobs:
         ]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 3 - 3
.github/workflows/core_extension.yml

@@ -25,10 +25,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -49,7 +49,7 @@ jobs:
         ]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 7 - 7
.github/workflows/core_internal.yml

@@ -23,10 +23,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -46,10 +46,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Initialize xcodebuild
       run: scripts/setup_spm_tests.sh
     - name: Xcode
@@ -62,10 +62,10 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: catalyst${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -86,7 +86,7 @@ jobs:
         ]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 14 - 15
.github/workflows/crashlytics.yml

@@ -29,14 +29,13 @@ jobs:
         include:
           - os: macos-12
             xcode: Xcode_14.2
-            tests:
-          # Flaky tests on CI
-          - os: macos-13
-            xcode: Xcode_15.0.1
             tests: --skip-tests
+          - os: macos-13
+            xcode: Xcode_15.1
+            tests:
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -58,13 +57,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -79,10 +78,10 @@ jobs:
 
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: catalyst${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -98,7 +97,7 @@ jobs:
       signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh crashlytics
@@ -130,11 +129,11 @@ jobs:
       signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - uses: actions/setup-python@v4
       with:
-        python-version: '3.7'
+        python-version: '3.11'
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh crashlytics
       env:
@@ -156,7 +155,7 @@ jobs:
       env:
         LEGACY: true
     - id: ftl_test
-      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.2
+      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.4
       with:
         credentials_json: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_CREDENTIALS }}
         testapp_dir: quickstart-ios/build-for-testing
@@ -176,7 +175,7 @@ jobs:
         ]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 1 - 1
.github/workflows/danger.yml

@@ -11,7 +11,7 @@ jobs:
   danger:
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 13 - 13
.github/workflows/database.yml

@@ -31,13 +31,13 @@ jobs:
         include:
           - os: macos-12
             xcode: Xcode_14.2
-            tests: --test-specs=unit
-          - os: macos-13
-            xcode: Xcode_15.0.1
             tests: --skip-tests
+          - os: macos-13
+            xcode: Xcode_15.1
+            tests: --test-specs=unit
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -51,10 +51,10 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: integration${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -75,13 +75,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -96,10 +96,10 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: catalyst${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -114,7 +114,7 @@ jobs:
       signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh database
@@ -139,7 +139,7 @@ jobs:
         ]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 10 - 10
.github/workflows/dynamiclinks.yml

@@ -27,10 +27,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -49,13 +49,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -75,7 +75,7 @@ jobs:
         ]
     needs: pod_lib_lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -91,7 +91,7 @@ jobs:
       signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh DynamicLinks
@@ -118,11 +118,11 @@ jobs:
       signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - uses: actions/setup-python@v4
       with:
-        python-version: '3.7'
+        python-version: '3.11'
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh DynamicLinks
     - name: Install Secret GoogleService-Info.plist
@@ -139,7 +139,7 @@ jobs:
       if: ${{ always() }}
       run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_ftl.sh DynamicLinks swift)
     - id: ftl_test
-      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.2
+      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.4
       with:
         credentials_json: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_CREDENTIALS }}
         testapp_dir: quickstart-ios/build-for-testing

+ 9 - 9
.github/workflows/firebase_app_check.yml

@@ -28,10 +28,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -47,7 +47,7 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -62,10 +62,10 @@ jobs:
       matrix:
         diagnostic: [tsan, asan, ubsan]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: ${{ matrix.diagnostics }}
     - name: Initialize xcodebuild
       run: scripts/setup_spm_tests.sh
     - name: iOS Unit Tests
@@ -88,7 +88,7 @@ jobs:
         ]
     needs: pod_lib_lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -107,13 +107,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild

+ 2 - 2
.github/workflows/firebasepod.yml

@@ -25,10 +25,10 @@ jobs:
     runs-on: macos-latest
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: firebasepod
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 89 - 0
.github/workflows/firestore-nightly.yml

@@ -0,0 +1,89 @@
+# Copyright 2023 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name: firestore_nightly
+
+on:
+  workflow_dispatch:
+
+concurrency:
+    group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
+    cancel-in-progress: true
+
+jobs:
+  check:
+    runs-on: macos-12
+    steps:
+    - uses: actions/checkout@v3
+
+    - uses: actions/setup-python@v4
+      with:
+        python-version: 3.11
+
+    - name: Setup check
+      run:  scripts/setup_check.sh
+
+    - name: Run check
+      run:  scripts/check.sh --test-only
+
+  cmake-prod-db:
+    needs: check
+
+    strategy:
+      matrix:
+        os: [macos-12]
+        databaseId: [(default)]
+
+    env:
+      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
+      MINT_PATH: ${{ github.workspace }}/mint
+      TARGET_DATABASE_ID: ${{ matrix.databaseId }}
+
+    runs-on: ${{ matrix.os }}
+    steps:
+    - uses: actions/checkout@v3
+
+    - name: Prepare ccache
+      uses: actions/cache@v3
+      with:
+        path: ${{ runner.temp }}/ccache
+        key: firestore-ccache-${{ matrix.databaseId }}-${{ runner.os }}-${{ github.sha }}
+        restore-keys: |
+          firestore-ccache-${{ matrix.databaseId }}-${{ runner.os }}-
+
+    - name: Cache Mint packages
+      uses: actions/cache@v3
+      with:
+        path: ${{ env.MINT_PATH }}
+        key: ${{ runner.os }}-mint-${{ hashFiles('**/Mintfile') }}
+        restore-keys: ${{ runner.os }}-mint-
+
+    - uses: actions/setup-python@v4
+      with:
+        python-version: '3.7'
+
+    - name: Install Secret GoogleService-Info.plist
+      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/firestore-nightly.plist.gpg \
+        Firestore/Example/App/GoogleService-Info.plist "$plist_secret"
+
+    # Skipping terraform index creation because we are not allowed to download SA key json.
+
+    - name: Setup build
+      run:  scripts/install_prereqs.sh Firestore ${{ runner.os }} cmake
+
+    - name: Build and test
+      run: |
+        export CCACHE_DIR=${{ runner.temp }}/ccache
+        export TARGET_BACKEND=nightly
+        scripts/third_party/travis/retry.sh scripts/build.sh Firestore ${{ runner.os }} cmake

+ 64 - 20
.github/workflows/firestore.yml

@@ -85,7 +85,7 @@ jobs:
       (github.event_name == 'pull_request' && needs.changes.outputs.changed == 'true')
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - uses: actions/setup-python@v4
       with:
@@ -97,7 +97,6 @@ jobs:
     - name: Run check
       run:  scripts/check.sh --test-only
 
-
   cmake:
     needs: check
     # Either a scheduled run from public repo, or a pull request with firestore changes.
@@ -113,7 +112,7 @@ jobs:
 
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Prepare ccache
       uses: actions/cache@v3
@@ -163,7 +162,7 @@ jobs:
 
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Prepare ccache
       uses: actions/cache@v3
@@ -231,7 +230,7 @@ jobs:
         scripts/third_party/travis/retry.sh scripts/build.sh Firestore ${{ runner.os }} cmake
 
 
-  sanitizers:
+  sanitizers-mac:
     # Either a scheduled run from public repo, or a pull request with firestore changes.
     if: |
       (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') ||
@@ -240,7 +239,6 @@ jobs:
 
     strategy:
       matrix:
-        # TODO(b/260248007): Re-enable this once tsan passes on Linux
         os: [macos-12]
         sanitizer: [asan, tsan]
 
@@ -249,6 +247,52 @@ jobs:
     env:
       SANITIZERS: ${{ matrix.sanitizer }}
 
+    steps:
+    - uses: actions/checkout@v4
+
+    - name: Prepare ccache
+      uses: actions/cache@v3
+      with:
+        path: ${{ runner.temp }}/ccache
+        key: ${{ matrix.sanitizer }}-firestore-ccache-${{ runner.os }}-${{ github.sha }}
+        restore-keys: |
+          ${{ matrix.sanitizer }}-firestore-ccache-${{ runner.os }}-
+
+    - uses: actions/setup-python@v4
+      with:
+        python-version: '3.7'
+
+    - name: Setup build
+      run:  scripts/install_prereqs.sh Firestore ${{ runner.os }} cmake
+
+    - name: Build and test
+      run: |
+        export EXPERIMENTAL_MODE=true
+        export CCACHE_DIR=${{ runner.temp }}/ccache
+        scripts/third_party/travis/retry.sh scripts/build.sh Firestore ${{ runner.os }} cmake
+
+
+  sanitizers-ubuntu:
+    # Either a scheduled run from public repo, or a pull request with firestore changes.
+    if: |
+      (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') ||
+      (github.event_name == 'pull_request' && needs.changes.outputs.changed == 'true')
+    needs: check
+
+    strategy:
+      matrix:
+        os: [ubuntu-latest]
+        # Excluding TSAN on ubuntu because of the warnings it generates around schedule.cc.
+        # This could be due to Apple Clang provide additional support for synchronization
+        # on Apple platforms, which is what we primarily care about.
+        sanitizer: [asan]
+
+    runs-on: ${{ matrix.os }}
+
+    env:
+      SANITIZERS: ${{ matrix.sanitizer }}
+      ASAN_OPTIONS: detect_leaks=0
+
     steps:
     - uses: actions/checkout@v3
 
@@ -287,7 +331,7 @@ jobs:
         target: [iOS, tvOS, macOS]
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.target }}
@@ -319,13 +363,13 @@ jobs:
         ]
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: ./scripts/setup_bundler.sh
     - name: Xcode
-      run: sudo xcode-select -s /Applications/Xcode_15.0.1.app/Contents/Developer
+      run: sudo xcode-select -s /Applications/Xcode_15.1.app/Contents/Developer
 
     - name: Pod lib lint
       # TODO(#9565, b/227461966): Remove --no-analyze when absl is fixed.
@@ -367,11 +411,11 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
@@ -401,16 +445,16 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     needs: check
     env:
       FIREBASE_SOURCE_FIRESTORE: 1
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -428,10 +472,10 @@ jobs:
     runs-on: macos-12
     needs: check
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm-binary
     - name: Initialize xcodebuild
       run: scripts/setup_spm_tests.sh
     - name: iOS Build Test
@@ -450,7 +494,7 @@ jobs:
   #   env:
   #     FIREBASE_SOURCE_FIRESTORE: 1
   #   steps:
-  #   - uses: actions/checkout@v3
+  #   - uses: actions/checkout@v4
   #   - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
   #     with:
   #       cache_key: ${{ matrix.os }}
@@ -469,10 +513,10 @@ jobs:
       matrix:
         target: [tvOS, macOS, catalyst]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: ${{ matrix.target }}
     - name: Initialize xcodebuild
       run: scripts/setup_spm_tests.sh
     - name: Build Test - Binary
@@ -505,7 +549,7 @@ jobs:
   #   needs: check
 
   #   steps:
-  #   - uses: actions/checkout@v3
+  #   - uses: actions/checkout@v4
   #   - name: Setup quickstart
   #     run: scripts/setup_quickstart.sh firestore
   #   - name: Install Secret GoogleService-Info.plist

+ 12 - 12
.github/workflows/functions.yml

@@ -35,10 +35,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
@@ -65,10 +65,10 @@ jobs:
     env:
       FIREBASECI_USE_LATEST_GOOGLEAPPMEASUREMENT: 1
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}
     - name: Initialize xcodebuild
       run: scripts/setup_spm_tests.sh
     - name: Integration Test Server
@@ -93,13 +93,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -117,7 +117,7 @@ jobs:
     runs-on: macos-12
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh functions
@@ -143,11 +143,11 @@ jobs:
     runs-on: macos-12
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - uses: actions/setup-python@v4
       with:
-        python-version: '3.7'
+        python-version: '3.11'
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh functions
     - name: install secret googleservice-info.plist
@@ -162,7 +162,7 @@ jobs:
       run: ([ -z $plist_secret ] ||
             scripts/third_party/travis/retry.sh scripts/test_quickstart_ftl.sh Functions swift)
     - id: ftl_test
-      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.2
+      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.4
       with:
         credentials_json: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_CREDENTIALS }}
         testapp_dir: quickstart-ios/build-for-testing
@@ -181,7 +181,7 @@ jobs:
         ]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 2 - 2
.github/workflows/generate_issues.yml

@@ -15,7 +15,7 @@ jobs:
     runs-on: ubuntu-latest
     name: Generate a nightly testing report issue
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Create a nightly report
       uses: ./.github/actions/testing_report_generation/
       with:
@@ -29,7 +29,7 @@ jobs:
     runs-on: ubuntu-latest
     name: Test nightly report generations
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Create a nightly report
       uses: ./.github/actions/testing_report_generation/
       with:

+ 3 - 3
.github/workflows/google-utilities-components.yml

@@ -25,7 +25,7 @@ jobs:
       matrix:
         target: [ios, tvos, macos]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -40,7 +40,7 @@ jobs:
 
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -63,7 +63,7 @@ jobs:
         ]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 16 - 16
.github/workflows/health-metrics-presubmit.yml

@@ -42,7 +42,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
           fetch-depth: 0
       - name: check files
@@ -58,13 +58,13 @@ jobs:
     needs: check
     # Prevent the job from being triggered in fork.
     # always() will trigger this job when `needs` are skipped in a `merge` pull_request event.
-    if: always() && github.event.pull_request.head.repo.full_name == github.repository && ((github.event.action != 'closed' &&  github.event.pull_request.base.ref == 'master') || github.event.pull_request.merged)
+    if: always() && github.event.pull_request.head.repo.full_name == github.repository && ((github.event.action != 'closed' &&  github.event.pull_request.base.ref == 'main') || github.event.pull_request.merged)
     runs-on: macos-12
     strategy:
       matrix:
         target: [iOS]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Access to Metrics Service
       run: |
         # Install gcloud sdk
@@ -111,7 +111,7 @@ jobs:
       matrix:
         target: [iOS]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -134,7 +134,7 @@ jobs:
       matrix:
         target: [iOS]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -154,7 +154,7 @@ jobs:
       matrix:
         target: [iOS]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -177,7 +177,7 @@ jobs:
       matrix:
         target: [iOS]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -201,7 +201,7 @@ jobs:
       matrix:
         target: [iOS]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -226,7 +226,7 @@ jobs:
       matrix:
         target: [iOS]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -249,7 +249,7 @@ jobs:
       matrix:
         target: [iOS]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -272,7 +272,7 @@ jobs:
       matrix:
         target: [iOS]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -295,7 +295,7 @@ jobs:
       matrix:
         target: [iOS]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -320,7 +320,7 @@ jobs:
       matrix:
         target: [iOS]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -343,7 +343,7 @@ jobs:
       matrix:
         target: [iOS]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -363,7 +363,7 @@ jobs:
     runs-on: macos-12
     steps:
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
           fetch-depth: 0
       - name: Access to Metrics Service
@@ -384,7 +384,7 @@ jobs:
         with:
           path: /Users/runner/test
       - name: Compare Diff and Post a Report
-        if: github.event.pull_request.merged != true && github.event.action != 'closed' && github.event.pull_request.head.repo.full_name == github.repository && github.event.pull_request.base.ref == 'master'
+        if: github.event.pull_request.merged != true && github.event.action != 'closed' && github.event.pull_request.head.repo.full_name == github.repository && github.event.pull_request.base.ref == 'main'
         env:
           base_commit: ${{ needs.check.outputs.target_branch_head }}
         run: |

+ 1 - 1
.github/workflows/health-metrics-release.yml

@@ -17,7 +17,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
       - name: Set up Google Cloud SDK
         uses: google-github-actions/setup-gcloud@main
       - name: Authenticate Google Cloud SDK

+ 10 - 10
.github/workflows/inappmessaging.yml

@@ -29,10 +29,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
@@ -53,10 +53,10 @@ jobs:
         platform: [iOS]
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: ${{ matrix.platform }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -75,13 +75,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -102,7 +102,7 @@ jobs:
         platform: [ios, tvos]
     needs: pod_lib_lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -119,8 +119,8 @@ jobs:
     runs-on: macos-12
 
     steps:
-    - uses: actions/checkout@v3
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh inappmessaging

+ 12 - 13
.github/workflows/installations.yml

@@ -30,13 +30,12 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
             test-specs: unit,integration
-          # Integration tests are flaky on Xcode 15
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
             test-specs: unit
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -70,13 +69,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -88,10 +87,10 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: catalyst${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -104,7 +103,7 @@ jobs:
 
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh installations
@@ -121,11 +120,11 @@ jobs:
 
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - uses: actions/setup-python@v4
       with:
-        python-version: '3.7'
+        python-version: '3.11'
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh installations
     - name: Copy mock plist
@@ -135,7 +134,7 @@ jobs:
     - name: Build swift quickstart
       run: scripts/third_party/travis/retry.sh scripts/test_quickstart_ftl.sh Installations swift
     - id: ftl_test
-      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.2
+      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.4
       with:
         credentials_json: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_CREDENTIALS }}
         testapp_dir: quickstart-ios/build-for-testing
@@ -156,7 +155,7 @@ jobs:
         ]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 29 - 30
.github/workflows/messaging.yml

@@ -23,19 +23,18 @@ concurrency:
 
 jobs:
 
+  # TODO(#12205) Update the build.sh script for this job from "test" instead of "build"
   messaging-integration-tests:
     # Don't run on private repo unless it is a PR.
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
     env:
       plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      # TODO: Investigate why PubSub integration tests fail with Xcode 15.0.1 on macos-13
-#    runs-on: macos-13
-    runs-on: macos-12
+    runs-on: macos-13
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: integration
     - name: Configure test keychain
       run: scripts/configure_test_keychain.sh
     - uses: ruby/setup-ruby@v1
@@ -48,8 +47,8 @@ jobs:
         mkdir FirebaseMessaging/Tests/IntegrationTests/Resources
         scripts/decrypt_gha_secret.sh scripts/gha-encrypted/messaging-sample-plist.gpg \
           FirebaseMessaging/Tests/IntegrationTests/Resources/GoogleService-Info.plist "$plist_secret"
-#    - name: Xcode
-#      run: sudo xcode-select -s /Applications/xcode_15.0.1.app/Contents/Developer
+    - name: Xcode
+      run: sudo xcode-select -s /Applications/Xcode_15.1.app/Contents/Developer
     - name: BuildAndTest
       run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/build.sh Messaging all)
 
@@ -66,11 +65,11 @@ jobs:
             xcode: Xcode_14.2
             tests: --test-specs=unit
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
             tests: --skip-tests
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -90,13 +89,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Initialize xcodebuild
       run: scripts/setup_spm_tests.sh
     - name: Xcode
@@ -109,10 +108,10 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: catalyst${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -131,10 +130,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh messaging
@@ -158,11 +157,11 @@ jobs:
       signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - uses: actions/setup-python@v4
       with:
-        python-version: '3.7'
+        python-version: '3.11'
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh messaging
     - name: Install Secret GoogleService-Info.plist
@@ -175,7 +174,7 @@ jobs:
       run: ([ -z $plist_secret ] ||
             scripts/third_party/travis/retry.sh scripts/test_quickstart_ftl.sh Messaging swift)
     - id: ftl_test
-      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.2
+      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.4
       with:
         credentials_json: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_CREDENTIALS }}
         testapp_dir: quickstart-ios/build-for-testing
@@ -193,11 +192,11 @@ jobs:
             xcode: Xcode_14.2
             tests: --test-specs=unit
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
             tests: --skip-tests
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -213,10 +212,10 @@ jobs:
       plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-13
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: sample${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -227,7 +226,7 @@ jobs:
     - name: Prereqs
       run: scripts/install_prereqs.sh MessagingSample iOS
     - name: Xcode
-      run: sudo xcode-select -s /Applications/Xcode_15.0.1.app/Contents/Developer
+      run: sudo xcode-select -s /Applications/Xcode_15.1.app/Contents/Developer
     - name: Build
       run: ([ -z $plist_secret ] || scripts/build.sh MessagingSample iOS)
 
@@ -238,10 +237,10 @@ jobs:
       plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-13
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: sample${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -252,7 +251,7 @@ jobs:
     - name: Prereqs
       run: scripts/install_prereqs.sh SwiftUISample iOS
     - name: Xcode
-      run: sudo xcode-select -s /Applications/Xcode_15.0.1.app/Contents/Developer
+      run: sudo xcode-select -s /Applications/Xcode_15.1.app/Contents/Developer
     - name: Build
       run: ([ -z $plist_secret ] || scripts/build.sh SwiftUISample iOS)
 
@@ -263,10 +262,10 @@ jobs:
       plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-13
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: watch-sample${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -277,7 +276,7 @@ jobs:
     - name: Prereqs
       run: scripts/install_prereqs.sh MessagingSampleStandaloneWatchApp watchOS
     - name: Xcode
-      run: sudo xcode-select -s /Applications/Xcode_15.0.1.app/Contents/Developer
+      run: sudo xcode-select -s /Applications/Xcode_15.1.app/Contents/Developer
     - name: Build
       run: ([ -z $plist_secret ] || scripts/build.sh MessagingSampleStandaloneWatchApp watchOS)
 

+ 10 - 10
.github/workflows/mlmodeldownloader.yml

@@ -27,10 +27,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -56,7 +56,7 @@ jobs:
         target: [ios, tvos, macos]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -80,13 +80,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -98,10 +98,10 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: catalyst${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -115,10 +115,10 @@ jobs:
       plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: build-test${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 1 - 1
.github/workflows/notice_generation.yml

@@ -18,7 +18,7 @@ jobs:
       # The path of NOTICES based on the root dir of repo."
       NOTICES_PATH: "CoreOnly/NOTICES"
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Get all pod names
       run: |
         cd "${GITHUB_WORKSPACE}/ReleaseTooling/"

+ 3 - 3
.github/workflows/performance-integration-tests.yml

@@ -1,4 +1,4 @@
-# Merge the yml file to master branch for the cron job schedule to be effective.
+# Merge the yml file to main branch for the cron job schedule to be effective.
 # Reference: https://github.community/t/on-schedule-per-branch/17525
 name: performance-integration-tests
 
@@ -28,10 +28,10 @@ jobs:
       plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: integration
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 15 - 15
.github/workflows/performance.yml

@@ -1,4 +1,4 @@
-# Merge the yml file to master branch for the cron job schedule to be effective.
+# Merge the yml file to main branch for the cron job schedule to be effective.
 # Reference: https://github.community/t/on-schedule-per-branch/17525
 name: performance
 
@@ -34,10 +34,10 @@ jobs:
         target: [iOS, tvOS]
         test: [unit, proddev]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: ${{ matrix.target }}${{ matrix.test }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -60,10 +60,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -81,7 +81,7 @@ jobs:
       signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh performance
@@ -101,11 +101,11 @@ jobs:
       signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - uses: actions/setup-python@v4
       with:
-        python-version: '3.7'
+        python-version: '3.11'
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh performance
     - name: Install Secret GoogleService-Info.plist
@@ -116,7 +116,7 @@ jobs:
     # - name: Build objc quickstart
     #   run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_ftl.sh Performance)
     - id: ftl_test
-      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.2
+      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.4
       with:
         credentials_json: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_CREDENTIALS }}
         testapp_dir: quickstart-ios/build-for-testing
@@ -132,13 +132,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -150,10 +150,10 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: catalyst
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -172,7 +172,7 @@ jobs:
         ]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 20 - 20
.github/workflows/prerelease.yml

@@ -25,12 +25,12 @@ jobs:
       # testing repo.
       local_sdk_repo_dir: /tmp/test/firebase-ios-sdk
       local_repo: specstesting
-      podspec_repo_branch: master
+      podspec_repo_branch: main
     outputs:
       matrix: ${{ steps.generate_matrix.outputs.matrix }}
     steps:
     - name: Checkout code
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
     - name: Generate matrix
       id: generate_matrix
       run: |
@@ -79,7 +79,7 @@ jobs:
       local_sdk_repo_dir: /tmp/test/firebase-ios-sdk
       targeted_pod: FirebaseCore
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: actions/download-artifact@v3
       with:
         name: firebase-ios-sdk
@@ -121,7 +121,7 @@ jobs:
       local_sdk_repo_dir: /tmp/test/firebase-ios-sdk
       targeted_pod: ${{ matrix.podspec }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: actions/download-artifact@v3
       with:
         name: firebase-ios-sdk
@@ -161,9 +161,9 @@ jobs:
       bot_token_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
       local_repo: specstesting
       local_sdk_repo_dir: /tmp/test/firebase-ios-sdk
-      podspec_repo_branch: master
+      podspec_repo_branch: main
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Get token
       run: |
          scripts/decrypt_gha_secret.sh scripts/gha-encrypted/oss-bot-access.txt.gpg \
@@ -173,14 +173,14 @@ jobs:
     - name: Update SpecsTesting repo setup
       run: |
          ossbotaccess=`cat oss-bot-access.txt`
-         # Update/create a nightly tag to the head of the master branch.
+         # Update/create a nightly tag to the head of the main branch.
          BOT_TOKEN="${ossbotaccess}" test_version="${nightly_version}" sdk_version_config="${GITHUB_WORKSPACE}/scripts/create_spec_repo/RC_firebase_sdk.textproto" local_sdk_repo_dir="${local_sdk_repo_dir}" podspec_repo_branch="${podspec_repo_branch}" scripts/release_testing_setup.sh prerelease_testing
     - name: Push updated podspecs
       run: |
         botaccess=`cat bot-access.txt`
         cd "${local_sdk_repo_dir}"
         # Changes in post submit tests will be fetched by getting diff between
-        # the HEAD and HEAD^ of the master branch.
+        # the HEAD and HEAD^ of the main branch.
         common_commit=$(git rev-parse HEAD^)
         git diff --name-only $common_commit remotes/origin/${podspec_repo_branch} > updated_files.txt
         updated_podspecs=()
@@ -212,7 +212,7 @@ jobs:
       bot_token_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -250,7 +250,7 @@ jobs:
       bot_token_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -284,7 +284,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -333,7 +333,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -369,7 +369,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -411,7 +411,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -447,7 +447,7 @@ jobs:
       LEGACY: true
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -487,7 +487,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -525,7 +525,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -561,7 +561,7 @@ jobs:
       bot_token_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -596,7 +596,7 @@ jobs:
       LEGACY: true
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -632,7 +632,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \

+ 16 - 16
.github/workflows/release.yml

@@ -27,12 +27,12 @@ jobs:
       # testing repo.
       local_sdk_repo_dir: /tmp/test/firebase-ios-sdk
       local_repo: specstesting
-      podspec_repo_branch: master
+      podspec_repo_branch: main
     outputs:
       matrix: ${{ steps.generate_matrix.outputs.matrix }}
     steps:
     - name: Checkout code
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
     - name: Generate matrix
       id: generate_matrix
       run: |
@@ -83,7 +83,7 @@ jobs:
       local_sdk_repo_dir: /tmp/test/firebase-ios-sdk
       targeted_pod: FirebaseCore
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: actions/download-artifact@v3
       with:
         name: firebase-ios-sdk
@@ -123,7 +123,7 @@ jobs:
       local_sdk_repo_dir: /tmp/test/firebase-ios-sdk
       targeted_pod: ${{ matrix.podspec }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: actions/download-artifact@v3
       with:
         name: firebase-ios-sdk
@@ -163,7 +163,7 @@ jobs:
       bot_token_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -201,7 +201,7 @@ jobs:
       bot_token_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -235,7 +235,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -284,7 +284,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -320,7 +320,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -362,7 +362,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -398,7 +398,7 @@ jobs:
       LEGACY: true
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -438,7 +438,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -476,7 +476,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -512,7 +512,7 @@ jobs:
       bot_token_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -547,7 +547,7 @@ jobs:
       LEGACY: true
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \
@@ -583,7 +583,7 @@ jobs:
       testing_repo: "firebase-ios-sdk"
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Get token
       run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/bot-access.txt.gpg \

+ 14 - 14
.github/workflows/remoteconfig.yml

@@ -29,10 +29,10 @@ jobs:
       matrix:
         target: [iOS, tvOS, macOS]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: rc${{ matrix.target }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -68,11 +68,11 @@ jobs:
             tests:
           # Flaky tests on CI
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
             tests: --skip-tests
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -95,14 +95,14 @@ jobs:
             xcode: Xcode_14.2
             test: spm
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
             test: spmbuildonly
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -117,10 +117,10 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: catalyst${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -135,7 +135,7 @@ jobs:
       signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh config
@@ -154,7 +154,7 @@ jobs:
   #     signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
   #   runs-on: macos-12
   #   steps:
-  #   - uses: actions/checkout@v3
+  #   - uses: actions/checkout@v4
   #   - uses: ruby/setup-ruby@v1
   #   - name: Setup quickstart
   #     run: scripts/setup_quickstart.sh config
@@ -175,10 +175,10 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: build-test
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -199,7 +199,7 @@ jobs:
         ]
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 3 - 3
.github/workflows/sessions-integration-tests.yml

@@ -1,4 +1,4 @@
-# Merge the yml file to master branch for the cron job schedule to be effective.
+# Merge the yml file to main branch for the cron job schedule to be effective.
 # Reference: https://github.community/t/on-schedule-per-branch/17525
 name: sessions-integration-tests
 
@@ -27,10 +27,10 @@ jobs:
       plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: sessions-integration-tests
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 7 - 7
.github/workflows/sessions.yml

@@ -31,11 +31,11 @@ jobs:
             tests:
           # Flaky tests on CI
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
             tests: --skip-tests
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -57,13 +57,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -77,10 +77,10 @@ jobs:
 
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: catalyst${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 5 - 5
.github/workflows/shared-swift.yml

@@ -29,10 +29,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -52,13 +52,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild

+ 2 - 2
.github/workflows/spectesting.yml

@@ -17,7 +17,7 @@ jobs:
       podspecs: ${{ steps.check_files.outputs.podspecs }}
     steps:
     - name: Checkout code
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
       with:
         fetch-depth: 0
     - name: check files
@@ -52,7 +52,7 @@ jobs:
       PODSPEC: ${{ matrix.podspec }}
     steps:
     - name: Checkout code
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
       with:
         fetch-depth: 0
     - name: Init podspecs and source

+ 9 - 9
.github/workflows/spm.yml

@@ -34,14 +34,14 @@ jobs:
             test: spm
           # The integration tests are slow and flaky on Xcode 15, so just build.
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
             test: spmbuildonly
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -62,13 +62,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: device${{ matrix.os }}${{ matrix.xcode }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild
@@ -89,13 +89,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: platforms${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Initialize xcodebuild

+ 20 - 23
.github/workflows/storage.yml

@@ -23,19 +23,16 @@ jobs:
     strategy:
       matrix:
         include:
-          # TODO: investigate integration test extreme flakiness on Xcode 15
-          - os: macos-12
-            xcode: Xcode_14.2
-          # - os: macos-13
-          #   xcode: Xcode_15.0.1
+          - os: macos-13
+            xcode: Xcode_15.1
     env:
       plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: integration${{ matrix.os }}
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -65,10 +62,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
         cache_key: ${{ matrix.os }}
@@ -90,13 +87,13 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: spm-cron${{ matrix.os }}-${{ matrix.xcode }}-${{ matrix.target }}
     - name: Xcodes
       run: ls -l /Applications/Xcode*
     - name: Xcode
@@ -115,14 +112,14 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     env:
       plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
       signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
       LEGACY: true
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh storage
@@ -145,11 +142,11 @@ jobs:
       LEGACY: true
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - uses: actions/setup-python@v4
       with:
-        python-version: '3.7'
+        python-version: '3.11'
     - name: Setup quickstart
       run: scripts/setup_quickstart.sh storage
     - name: Install Secret GoogleService-Info.plist
@@ -160,7 +157,7 @@ jobs:
     - name: Build swift quickstart
       run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_ftl.sh Storage swift)
     - id: ftl_test
-      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.2
+      uses: FirebaseExtended/github-actions/firebase-test-lab@v1.4
       with:
         credentials_json: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_CREDENTIALS }}
         testapp_dir: quickstart-ios/build-for-testing
@@ -176,13 +173,13 @@ jobs:
         include:
           - os: macos-12
             xcode: Xcode_14.2
-            tests: --test-specs=unit
-          - os: macos-13
-            xcode: Xcode_15.0.1
             tests: --skip-tests
+          - os: macos-13
+            xcode: Xcode_15.1
+            tests: --test-specs=unit
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh
@@ -206,11 +203,11 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     needs: pod-lib-lint
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 2 - 2
.github/workflows/symbolcollision.yml

@@ -23,10 +23,10 @@ jobs:
     runs-on: macos-12
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: symbolcollision
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 1 - 1
.github/workflows/update-cpp-sdk-on-release.yml

@@ -26,7 +26,7 @@ jobs:
           python-version: 3.11
 
       - name: Check out firebase-cpp-sdk
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
           repository: firebase/firebase-cpp-sdk
           ref: main

+ 2 - 2
.github/workflows/watchos-sample.yml

@@ -30,10 +30,10 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: watchos-sample
     - uses: ruby/setup-ruby@v1
     - name: Setup Bundler
       run: scripts/setup_bundler.sh

+ 34 - 34
.github/workflows/zip.yml

@@ -30,10 +30,10 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: package-release
     - name: Xcode 14.1
       run: sudo xcode-select -s /Applications/Xcode_14.1.app/Contents/Developer
     - uses: ruby/setup-ruby@v1
@@ -56,7 +56,7 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Xcode 14.1
       run: sudo xcode-select -s /Applications/Xcode_14.1.app/Contents/Developer
     - name: Build
@@ -70,10 +70,10 @@ jobs:
     needs: build
     runs-on: macos-12
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
       with:
-        cache_key: ${{ matrix.os }}
+        cache_key: package-head
     - name: Xcode 14.1
       run: sudo xcode-select -s /Applications/Xcode_14.1.app/Contents/Developer
     - uses: ruby/setup-ruby@v1
@@ -108,10 +108,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Get framework dir
       uses: actions/download-artifact@v1
       with:
@@ -123,7 +123,7 @@ jobs:
       run: |
         mkdir -p "${HOME}"/ios_frameworks/
         find "${GITHUB_WORKSPACE}/${FRAMEWORK_DIR}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Setup quickstart
@@ -170,10 +170,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Get framework dir
       uses: actions/download-artifact@v1
       with:
@@ -224,10 +224,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Get framework dir
       uses: actions/download-artifact@v1
       with:
@@ -276,10 +276,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Get framework dir
       uses: actions/download-artifact@v1
       with:
@@ -291,7 +291,7 @@ jobs:
       run: |
         mkdir -p "${HOME}"/ios_frameworks/
         find "${GITHUB_WORKSPACE}/${FRAMEWORK_DIR}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Setup quickstart
@@ -352,10 +352,10 @@ jobs:
             xcode: Xcode_14.2
           # TODO: Building FirebaseUI fails on Xcode 15 because it needs to sign the resources.
           # - os: macos-13
-          #   xcode: Xcode_15.0.1
+          #   xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Get framework dir
       uses: actions/download-artifact@v1
       with:
@@ -367,7 +367,7 @@ jobs:
       run: |
         mkdir -p "${HOME}"/ios_frameworks/
         find "${GITHUB_WORKSPACE}/${FRAMEWORK_DIR}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Xcode
       run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
     - name: Setup quickstart
@@ -408,10 +408,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Get framework dir
       uses: actions/download-artifact@v1
       with:
@@ -469,10 +469,10 @@ jobs:
             xcode: Xcode_14.2
           # TODO: Building FirebaseUI fails on Xcode 15 because it needs to sign the resources.
           # - os: macos-13
-          #   xcode: Xcode_15.0.1
+          #   xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Get framework dir
       uses: actions/download-artifact@v1
       with:
@@ -484,7 +484,7 @@ jobs:
       run: |
         mkdir -p "${HOME}"/ios_frameworks/
         find "${GITHUB_WORKSPACE}/${FRAMEWORK_DIR}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Setup quickstart
       run: SAMPLE="$SDK" TARGET="${SDK}Example" NON_FIREBASE_SDKS="SDWebImage FirebaseAuthUI FirebaseEmailAuthUI" scripts/setup_quickstart_framework.sh \
                                                "${HOME}"/ios_frameworks/Firebase/NonFirebaseSDKs/* \
@@ -518,7 +518,7 @@ jobs:
     steps:
       - name: Xcode 14.1
         run: sudo xcode-select -s /Applications/Xcode_14.1.app/Contents/Developer
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - name: Get framework dir
         uses: actions/download-artifact@v1
         with:
@@ -532,7 +532,7 @@ jobs:
         run: |
           mkdir -p "${HOME}"/ios_frameworks/
           find "${GITHUB_WORKSPACE}/${FRAMEWORK_DIR}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - name: Check linked Firestore.xcframework for unlinked symbols.
         run: |
           scripts/check_firestore_symbols.sh \
@@ -555,10 +555,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Get framework dir
       uses: actions/download-artifact@v1
       with:
@@ -570,7 +570,7 @@ jobs:
       run: |
         mkdir -p "${HOME}"/ios_frameworks/
         find "${GITHUB_WORKSPACE}/${FRAMEWORK_DIR}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Setup quickstart
       run: SAMPLE="$SDK" TARGET="${SDK}Example" scripts/setup_quickstart_framework.sh \
                                                "${HOME}"/ios_frameworks/Firebase/FirebaseDynamicLinks/* \
@@ -612,10 +612,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Get framework dir
       uses: actions/download-artifact@v1
       with:
@@ -627,7 +627,7 @@ jobs:
       run: |
         mkdir -p "${HOME}"/ios_frameworks/
         find "${GITHUB_WORKSPACE}/${FRAMEWORK_DIR}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Setup quickstart
       run: SAMPLE="$SDK" TARGET="${SDK}Example" scripts/setup_quickstart_framework.sh \
                                                "${HOME}"/ios_frameworks/Firebase/FirebaseMessaging/* \
@@ -668,10 +668,10 @@ jobs:
           - os: macos-12
             xcode: Xcode_14.2
           - os: macos-13
-            xcode: Xcode_15.0.1
+            xcode: Xcode_15.1
     runs-on: ${{ matrix.os }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Get framework dir
       uses: actions/download-artifact@v1
       with:
@@ -683,7 +683,7 @@ jobs:
       run: |
         mkdir -p "${HOME}"/ios_frameworks/
         find "${GITHUB_WORKSPACE}/${FRAMEWORK_DIR}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     - name: Setup quickstart
       env:
         LEGACY: true

+ 2 - 2
CONTRIBUTING.md

@@ -326,8 +326,8 @@ For developers without write access, you'll need to create a fork of Firebase
 instead of a branch. Learn more about forking a repo [here][github-forks].
 
 ```console
-# Update your local master
-git checkout master
+# Update your local main
+git checkout main
 git pull
 
 # Create a development branch

+ 2 - 2
Carthage.md

@@ -77,8 +77,8 @@ binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseStorageBinary.jso
 
 - For Crashlytics, do the following steps to automatically upload your app's symbols so your app's crashes are symbolicated:
     - Download
-     [upload-symbols](https://github.com/firebase/firebase-ios-sdk/raw/master/Crashlytics/upload-symbols)
-     and [run](https://github.com/firebase/firebase-ios-sdk/raw/master/Crashlytics/run).
+     [upload-symbols](https://github.com/firebase/firebase-ios-sdk/raw/main/Crashlytics/upload-symbols)
+     and [run](https://github.com/firebase/firebase-ios-sdk/raw/main/Crashlytics/run).
      Note: please see the [discussion](https://github.com/firebase/firebase-ios-sdk/issues/4720#issuecomment-577213858)
      for details why it has to be done manually.
     - Put these in the directory where your `.xcodeproj` file lives, eg. `scripts/run` and `scripts/upload-symbols`

+ 0 - 45
ClientApp/Podfile

@@ -1,45 +0,0 @@
-source 'https://github.com/firebase/SpecsDev.git'
-source 'https://github.com/firebase/SpecsStaging.git'
-source 'https://cdn.cocoapods.org/'
-
-target 'ClientApp-CocoaPods' do
-  platform :ios, '11.0'
-
-  use_frameworks!
-
-  pod 'FirebaseCore', :path => '../'
-  pod 'FirebaseInstallations', :path => '../'
-  pod 'FirebaseAnalytics' # Binary pods don't work with `:path`.
-  pod 'FirebaseAnalyticsOnDeviceConversion', :path => '../'
-  pod 'FirebaseABTesting', :path => '../'
-  pod 'FirebaseAppCheck', :path => '../'
-  pod 'FirebaseRemoteConfig', :path => '../'
-  pod 'FirebaseRemoteConfigSwift', :path => '../'
-  pod 'FirebaseAppDistribution', :path => '../'
-  pod 'FirebaseAuth', :path => '../'
-  pod 'FirebaseCrashlytics', :path => '../'
-  pod 'FirebaseDatabase', :path => '../'
-  pod 'FirebaseDatabaseSwift', :path => '../'
-  pod 'FirebaseDynamicLinks', :path => '../'
-  pod 'FirebaseFirestore', :path => '../'
-  pod 'FirebaseFirestoreSwift', :path => '../'
-  pod 'FirebaseFunctions', :path => '../'
-  pod 'FirebaseInAppMessaging', :path => '../'
-  pod 'FirebaseMessaging', :path => '../'
-  pod 'FirebasePerformance', :path => '../'
-  pod 'FirebaseStorage', :path => '../'
-  pod 'FirebaseMLModelDownloader', :path => '../'
-  pod 'Firebase', :path => '../'
-end
-
-target 'ClientApp-CocoaPods-iOS13' do
-  platform :ios, '13.0'
-
-  use_frameworks!
-
-  pod 'FirebaseAnalytics' # Binary pods don't work with `:path`.
-  pod 'FirebaseAnalyticsSwift', :path => '../' # Requires iOS 13.0+
-  pod 'FirebaseInAppMessaging', :path => '../'
-  pod 'FirebaseInAppMessagingSwift', :path => '../' # Requires iOS 13.0+
-
-end

+ 0 - 36
CocoapodsIntegrationTest/TestEnvironments/Cocoapods_multiprojects_frameworks/Podfile

@@ -1,36 +0,0 @@
-source 'https://github.com/firebase/SpecsDev.git'
-source 'https://github.com/firebase/SpecsStaging.git'
-source 'https://cdn.cocoapods.org/'
-
-# Uncomment the next line to define a global platform for your project
-platform :ios, '11.0'
-
-target 'CocoapodsIntegrationTest' do
-  # Comment the next line if you don't want to use dynamic frameworks
-  use_frameworks!
-  pod 'FirebaseABTesting', :path => '../'
-  pod 'FirebaseAppDistribution', :path => '../'
-  pod 'FirebaseAppCheckInterop', :path => '../'
-  pod 'FirebaseCore', :path => '../'
-  pod 'FirebaseCoreExtension', :path => '../'
-  pod 'FirebaseCoreInternal', :path => '../'
-  pod 'FirebaseCrashlytics', :path => '../'
-  pod 'FirebaseAuth', :path => '../'
-  pod 'FirebaseAuthInterop', :path => '../'
-  pod 'FirebaseDatabase', :path => '../'
-  pod 'FirebaseDynamicLinks', :path => '../'
-  pod 'FirebaseFirestore', :path => '../'
-  pod 'FirebaseFunctions', :path => '../'
-  pod 'FirebaseInAppMessaging', :path => '../'
-  pod 'FirebaseInstallations', :path => '../'
-  pod 'FirebaseMessaging', :path => '../'
-  pod 'FirebaseMessagingInterop', :path => '../'
-  pod 'FirebasePerformance', :path => '../'
-  pod 'FirebaseStorage', :path => '../'
-end
-
-# Using the new speed-enhancing features available with CocoaPods 1.7+
-# [sudo] gem install cocoapods --pre
-install! 'cocoapods',
-          :generate_multiple_pod_projects => true,
-          :incremental_installation => true

+ 1 - 1
Crashlytics/CHANGELOG.md

@@ -164,7 +164,7 @@
 
 This Firebase Crashlytics version includes the initial beta release of the Firebase Crashlytics SDK:
 
- - [feature] The SDK is now open-sourced. Take a look in our [GitHub repository](https://github.com/firebase/firebase-ios-sdk/tree/master/Crashlytics).
+ - [feature] The SDK is now open-sourced. Take a look in our [GitHub repository](https://github.com/firebase/firebase-ios-sdk/tree/main/Crashlytics).
  - [feature] Added support for Catalyst (note that Crashlytics still supports tvOS and macOS).
  - [feature] Added new APIs that are more consistent with other Firebase SDKs and more intuitive to use. The new APIs also give your users more control over how you collect their data.
  - [removed] Removed the Fabric API Key. Now, Crashlytics uses the GoogleService-Info.plist file to associate your app with your project. If you linked your app from Fabric and want to upgrade to the new SDK, remove the Fabric API key from your `run` and `upload-symbols` scripts. We also recommend removing the Fabric section from your app's Info.plist (when you upgrade, Crashlytics uses the new configuration you set up in Firebase).

+ 2 - 0
Crashlytics/Crashlytics/Handlers/FIRCLSSignal.c

@@ -109,6 +109,8 @@ static void FIRCLSSignalInstallHandlers(FIRCLSSignalReadContext *roContext) {
 
 void FIRCLSSignalCheckHandlers(void) {
   if (_firclsContext.readonly->debuggerAttached) {
+    // Adding this log to remind user deattachs from the debugger. Besides FIRCLSSignal, this logic is on FIRCLSMachException and FIRCLSException as well. Only log once since the check is same.
+    FIRCLSSDKLog("[Crashlytics] App is attached to a debugger, to see the crash reports please deattach from the debugger, https://firebase.google.com/docs/crashlytics/get-started?platform=ios#force-test-crash");
     return;
   }
 

+ 24 - 24
Firebase.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'Firebase'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Firebase'
 
   s.description      = <<-DESC
@@ -36,14 +36,14 @@ Simplify your app development, grow your user base, and monetize more effectivel
     ss.ios.deployment_target = '10.0'
     ss.osx.deployment_target = '10.13'
     ss.tvos.deployment_target = '12.0'
-    ss.ios.dependency 'FirebaseAnalytics', '~> 10.19.0'
-    ss.osx.dependency 'FirebaseAnalytics', '~> 10.19.0'
-    ss.tvos.dependency 'FirebaseAnalytics', '~> 10.19.0'
+    ss.ios.dependency 'FirebaseAnalytics', '~> 10.20.0'
+    ss.osx.dependency 'FirebaseAnalytics', '~> 10.20.0'
+    ss.tvos.dependency 'FirebaseAnalytics', '~> 10.20.0'
     ss.dependency 'Firebase/CoreOnly'
   end
 
   s.subspec 'CoreOnly' do |ss|
-    ss.dependency 'FirebaseCore', '10.19.0'
+    ss.dependency 'FirebaseCore', '10.20.0'
     ss.source_files = 'CoreOnly/Sources/Firebase.h'
     ss.preserve_paths = 'CoreOnly/Sources/module.modulemap'
     if ENV['FIREBASE_POD_REPO_FOR_DEV_POD'] then
@@ -79,13 +79,13 @@ Simplify your app development, grow your user base, and monetize more effectivel
     ss.ios.deployment_target = '10.0'
     ss.osx.deployment_target = '10.13'
     ss.tvos.deployment_target = '12.0'
-    ss.dependency 'FirebaseAnalytics/WithoutAdIdSupport', '~> 10.19.0'
+    ss.dependency 'FirebaseAnalytics/WithoutAdIdSupport', '~> 10.20.0'
     ss.dependency 'Firebase/CoreOnly'
   end
 
   s.subspec 'ABTesting' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.dependency 'FirebaseABTesting', '~> 10.19.0'
+    ss.dependency 'FirebaseABTesting', '~> 10.20.0'
     # Standard platforms PLUS watchOS.
     ss.ios.deployment_target = '11.0'
     ss.osx.deployment_target = '10.13'
@@ -95,13 +95,13 @@ Simplify your app development, grow your user base, and monetize more effectivel
 
   s.subspec 'AppDistribution' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.ios.dependency 'FirebaseAppDistribution', '~> 10.19.0-beta'
+    ss.ios.dependency 'FirebaseAppDistribution', '~> 10.20.0-beta'
     ss.ios.deployment_target = '11.0'
   end
 
   s.subspec 'AppCheck' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.dependency 'FirebaseAppCheck', '~> 10.19.0'
+    ss.dependency 'FirebaseAppCheck', '~> 10.20.0'
     ss.ios.deployment_target = '11.0'
     ss.osx.deployment_target = '10.13'
     ss.tvos.deployment_target = '12.0'
@@ -110,7 +110,7 @@ Simplify your app development, grow your user base, and monetize more effectivel
 
   s.subspec 'Auth' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.dependency 'FirebaseAuth', '~> 10.19.0'
+    ss.dependency 'FirebaseAuth', '~> 10.20.0'
     # Standard platforms PLUS watchOS.
     ss.ios.deployment_target = '11.0'
     ss.osx.deployment_target = '10.13'
@@ -120,7 +120,7 @@ Simplify your app development, grow your user base, and monetize more effectivel
 
   s.subspec 'Crashlytics' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.dependency 'FirebaseCrashlytics', '~> 10.19.0'
+    ss.dependency 'FirebaseCrashlytics', '~> 10.20.0'
     # Standard platforms PLUS watchOS.
     ss.ios.deployment_target = '11.0'
     ss.osx.deployment_target = '10.13'
@@ -130,7 +130,7 @@ Simplify your app development, grow your user base, and monetize more effectivel
 
   s.subspec 'Database' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.dependency 'FirebaseDatabase', '~> 10.19.0'
+    ss.dependency 'FirebaseDatabase', '~> 10.20.0'
     # Standard platforms PLUS watchOS 7.
     ss.ios.deployment_target = '11.0'
     ss.osx.deployment_target = '10.13'
@@ -140,13 +140,13 @@ Simplify your app development, grow your user base, and monetize more effectivel
 
   s.subspec 'DynamicLinks' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.ios.dependency 'FirebaseDynamicLinks', '~> 10.19.0'
+    ss.ios.dependency 'FirebaseDynamicLinks', '~> 10.20.0'
     ss.ios.deployment_target = '11.0'
   end
 
   s.subspec 'Firestore' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.dependency 'FirebaseFirestore', '~> 10.19.0'
+    ss.dependency 'FirebaseFirestore', '~> 10.20.0'
     ss.ios.deployment_target = '11.0'
     ss.osx.deployment_target = '10.13'
     ss.tvos.deployment_target = '12.0'
@@ -154,7 +154,7 @@ Simplify your app development, grow your user base, and monetize more effectivel
 
   s.subspec 'Functions' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.dependency 'FirebaseFunctions', '~> 10.19.0'
+    ss.dependency 'FirebaseFunctions', '~> 10.20.0'
     # Standard platforms PLUS watchOS.
     ss.ios.deployment_target = '11.0'
     ss.osx.deployment_target = '10.13'
@@ -164,20 +164,20 @@ Simplify your app development, grow your user base, and monetize more effectivel
 
   s.subspec 'InAppMessaging' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.ios.dependency 'FirebaseInAppMessaging', '~> 10.19.0-beta'
-    ss.tvos.dependency 'FirebaseInAppMessaging', '~> 10.19.0-beta'
+    ss.ios.dependency 'FirebaseInAppMessaging', '~> 10.20.0-beta'
+    ss.tvos.dependency 'FirebaseInAppMessaging', '~> 10.20.0-beta'
     ss.ios.deployment_target = '11.0'
     ss.tvos.deployment_target = '12.0'
   end
 
   s.subspec 'Installations' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.dependency 'FirebaseInstallations', '~> 10.19.0'
+    ss.dependency 'FirebaseInstallations', '~> 10.20.0'
   end
 
   s.subspec 'Messaging' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.dependency 'FirebaseMessaging', '~> 10.19.0'
+    ss.dependency 'FirebaseMessaging', '~> 10.20.0'
     # Standard platforms PLUS watchOS.
     ss.ios.deployment_target = '11.0'
     ss.osx.deployment_target = '10.13'
@@ -187,7 +187,7 @@ Simplify your app development, grow your user base, and monetize more effectivel
 
   s.subspec 'MLModelDownloader' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.dependency 'FirebaseMLModelDownloader', '~> 10.19.0-beta'
+    ss.dependency 'FirebaseMLModelDownloader', '~> 10.20.0-beta'
     # Standard platforms PLUS watchOS.
     ss.ios.deployment_target = '11.0'
     ss.osx.deployment_target = '10.13'
@@ -197,15 +197,15 @@ Simplify your app development, grow your user base, and monetize more effectivel
 
   s.subspec 'Performance' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.ios.dependency 'FirebasePerformance', '~> 10.19.0'
-    ss.tvos.dependency 'FirebasePerformance', '~> 10.19.0'
+    ss.ios.dependency 'FirebasePerformance', '~> 10.20.0'
+    ss.tvos.dependency 'FirebasePerformance', '~> 10.20.0'
     ss.ios.deployment_target = '11.0'
     ss.tvos.deployment_target = '12.0'
   end
 
   s.subspec 'RemoteConfig' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.dependency 'FirebaseRemoteConfig', '~> 10.19.0'
+    ss.dependency 'FirebaseRemoteConfig', '~> 10.20.0'
     # Standard platforms PLUS watchOS.
     ss.ios.deployment_target = '11.0'
     ss.osx.deployment_target = '10.13'
@@ -215,7 +215,7 @@ Simplify your app development, grow your user base, and monetize more effectivel
 
   s.subspec 'Storage' do |ss|
     ss.dependency 'Firebase/CoreOnly'
-    ss.dependency 'FirebaseStorage', '~> 10.19.0'
+    ss.dependency 'FirebaseStorage', '~> 10.20.0'
     # Standard platforms PLUS watchOS.
     ss.ios.deployment_target = '11.0'
     ss.osx.deployment_target = '10.13'

+ 1 - 1
FirebaseABTesting.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseABTesting'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Firebase ABTesting'
 
   s.description      = <<-DESC

+ 3 - 3
FirebaseAnalytics.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
     s.name             = 'FirebaseAnalytics'
-    s.version          = '10.19.0'
+    s.version          = '10.20.0'
     s.summary          = 'Firebase Analytics for iOS'
 
     s.description      = <<-DESC
@@ -37,12 +37,12 @@ Pod::Spec.new do |s|
     s.default_subspecs = 'AdIdSupport'
 
     s.subspec 'AdIdSupport' do |ss|
-        ss.dependency 'GoogleAppMeasurement', '10.19.0'
+        ss.dependency 'GoogleAppMeasurement', '10.20.0'
         ss.vendored_frameworks = 'Frameworks/FirebaseAnalytics.xcframework'
     end
 
     s.subspec 'WithoutAdIdSupport' do |ss|
-        ss.dependency 'GoogleAppMeasurement/WithoutAdIdSupport', '10.19.0'
+        ss.dependency 'GoogleAppMeasurement/WithoutAdIdSupport', '10.20.0'
         ss.vendored_frameworks = 'Frameworks/FirebaseAnalytics.xcframework'
     end
 

+ 2 - 2
FirebaseAnalyticsOnDeviceConversion.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
     s.name             = 'FirebaseAnalyticsOnDeviceConversion'
-    s.version          = '10.19.0'
+    s.version          = '10.20.0'
     s.summary          = 'On device conversion measurement plugin for FirebaseAnalytics. Not intended for direct use.'
 
     s.description      = <<-DESC
@@ -18,7 +18,7 @@ Pod::Spec.new do |s|
 
     s.cocoapods_version = '>= 1.10.2'
 
-    s.dependency 'GoogleAppMeasurementOnDeviceConversion', '10.19.0'
+    s.dependency 'GoogleAppMeasurementOnDeviceConversion', '10.20.0'
 
     s.static_framework = true
 

+ 1 - 1
FirebaseAppCheck.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseAppCheck'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Firebase App Check SDK.'
 
   s.description      = <<-DESC

+ 5 - 0
FirebaseAppCheck/CHANGELOG.md

@@ -1,3 +1,8 @@
+# 10.19.1
+- [fixed] Fix bug in apps using both AppCheck and ARCore where AppCheck
+  unnecessarily tries to create tokens for the ARCore SDK. This results in
+  noisy logs containing harmless attestation errors.
+
 # 10.18.0
 - [changed] Extracted core `FirebaseAppCheck` functionality into a new
   [`AppCheckCore`](https://github.com/google/app-check) dependency. (#12067)

+ 26 - 32
FirebaseAppCheck/Tests/Unit/Swift/AppCheckAPITests.swift

@@ -63,18 +63,16 @@ final class AppCheckAPITests {
     }
 
     // Get token (async/await)
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            try await AppCheck.appCheck().token(forcingRefresh: false)
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          try await AppCheck.appCheck().token(forcingRefresh: false)
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // Set `AppCheckProviderFactory`
     AppCheck.setAppCheckProviderFactory(DummyAppCheckProviderFactory())
@@ -97,18 +95,16 @@ final class AppCheckAPITests {
       }
 
       // Get token (async/await)
-      #if compiler(>=5.5.2) && canImport(_Concurrency)
-        if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-          // async/await is a Swift 5.5+ feature available on iOS 15+
-          Task {
-            do {
-              _ = try await debugProvider.getToken()
-            } catch {
-              // ...
-            }
+      if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+        // async/await is a Swift 5.5+ feature available on iOS 15+
+        Task {
+          do {
+            _ = try await debugProvider.getToken()
+          } catch {
+            // ...
           }
         }
-      #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+      }
 
       _ = debugProvider.localDebugToken()
       _ = debugProvider.currentDebugToken()
@@ -170,20 +166,18 @@ final class AppCheckAPITests {
             }
           }
           // Get token (async/await)
-          #if compiler(>=5.5.2) && canImport(_Concurrency)
-            if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-              // async/await is a Swift 5.5+ feature available on iOS 15+
-              Task {
-                do {
-                  _ = try await deviceCheckProvider.getToken()
-                } catch AppCheckErrorCode.unsupported {
-                  // ...
-                } catch {
-                  // ...
-                }
+          if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+            // async/await is a Swift 5.5+ feature available on iOS 15+
+            Task {
+              do {
+                _ = try await deviceCheckProvider.getToken()
+              } catch AppCheckErrorCode.unsupported {
+                // ...
+              } catch {
+                // ...
               }
             }
-          #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+          }
         }
       }
     #endif // !os(watchOS)

+ 1 - 1
FirebaseAppCheckInterop.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseAppCheckInterop'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Interfaces that allow other Firebase SDKs to use AppCheck functionality.'
 
   s.description      = <<-DESC

+ 1 - 1
FirebaseAppDistribution.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseAppDistribution'
-  s.version          = '10.19.0-beta'
+  s.version          = '10.20.0-beta'
   s.summary          = 'App Distribution for Firebase iOS SDK.'
 
   s.description      = <<-DESC

+ 4 - 4
FirebaseAppDistributionInternal/README.md

@@ -1,12 +1,12 @@
 This library currently contains upcoming changes, and isn't meant to be used in production.
 
-It exists in `master` for CI purposes.
+It exists in `main` for CI purposes.
 
-## Steps to copy over changes in FirebaseAppDistributionInternal to master
+## Steps to copy over changes in FirebaseAppDistributionInternal to main
 
-For CI builds, this pod needs to be in master. To copy over changes, do the following:
+For CI builds, this pod needs to be in main. To copy over changes, do the following:
 
 1. `git checkout -b fad/appdistributioninternal`
 1. `git checkout fad/in-app-feedback FirebaseAppDistributionInternal/`
 
-Then open a PR to merge these changes to master. This won't affect the public version of `FirebaseAppDistribution`.
+Then open a PR to merge these changes to main. This won't affect the public version of `FirebaseAppDistribution`.

+ 1 - 1
FirebaseAuth.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseAuth'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Apple platform client for Firebase Authentication'
 
   s.description      = <<-DESC

+ 1 - 1
FirebaseAuth/Sources/Backend/FIRAuthBackend.h

@@ -256,7 +256,7 @@ typedef void (^FIRGetRecaptchaConfigResponseCallback)(
     @brief Simple static class with methods representing the backend RPCs.
     @remarks All callback blocks passed as method parameters are invoked asynchronously on the
         global work queue in the future. See
-        https://github.com/firebase/firebase-ios-sdk/tree/master/FirebaseAuth/Docs/threading.md
+        https://github.com/firebase/firebase-ios-sdk/tree/main/FirebaseAuth/Docs/threading.md
  */
 @interface FIRAuthBackend : NSObject
 

+ 21 - 23
FirebaseAuth/Tests/Sample/SwiftApiTests/AccountInfoTests.swift

@@ -75,29 +75,27 @@ class AccountInfoTests: TestsBase {
     waitForExpectations(timeout: TestsBase.kExpectationsTimeout)
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, watchOS 7, *)
-    func testUpdatingUsersEmailAsync() async throws {
-      let auth = Auth.auth()
-      do {
-        _ = try await auth.createUser(withEmail: kOldUserEmail, password: "password")
-        XCTFail("Did not get error for recreating a user")
-      } catch {
-        XCTAssertEqual((error as NSError).code,
-                       AuthErrorCode.emailAlreadyInUse.rawValue,
-                       "Created a user despite it already exiting.")
-      }
+  @available(iOS 13, tvOS 13, macOS 10.15, watchOS 7, *)
+  func testUpdatingUsersEmailAsync() async throws {
+    let auth = Auth.auth()
+    do {
+      _ = try await auth.createUser(withEmail: kOldUserEmail, password: "password")
+      XCTFail("Did not get error for recreating a user")
+    } catch {
+      XCTAssertEqual((error as NSError).code,
+                     AuthErrorCode.emailAlreadyInUse.rawValue,
+                     "Created a user despite it already exiting.")
+    }
 
-      let user = try await auth.signIn(withEmail: kOldUserEmail, password: "password")
-      XCTAssertEqual(user.user.email, kOldUserEmail)
-      XCTAssertEqual(auth.currentUser?.email,
-                     kOldUserEmail,
-                     "Signed user does not match request.")
+    let user = try await auth.signIn(withEmail: kOldUserEmail, password: "password")
+    XCTAssertEqual(user.user.email, kOldUserEmail)
+    XCTAssertEqual(auth.currentUser?.email,
+                   kOldUserEmail,
+                   "Signed user does not match request.")
 
-      try await auth.currentUser?.updateEmail(to: kNewUserEmail)
-      XCTAssertEqual(auth.currentUser?.email,
-                     kNewUserEmail,
-                     "Signed user does not match change.")
-    }
-  #endif
+    try await auth.currentUser?.updateEmail(to: kNewUserEmail)
+    XCTAssertEqual(auth.currentUser?.email,
+                   kNewUserEmail,
+                   "Signed user does not match change.")
+  }
 }

+ 9 - 11
FirebaseAuth/Tests/Sample/SwiftApiTests/AnonymousTests.swift

@@ -29,16 +29,14 @@ class AnonymousTests: TestsBase {
     deleteCurrentUser()
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testUpdatingUsersEmailAsync() async throws {
-      try await signInAnonymouslyAsync()
-      if let isAnonymous = Auth.auth().currentUser?.isAnonymous {
-        XCTAssertTrue(isAnonymous)
-      } else {
-        XCTFail("Missing currentUser after anonymous sign in")
-      }
-      try await deleteCurrentUserAsync()
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testUpdatingUsersEmailAsync() async throws {
+    try await signInAnonymouslyAsync()
+    if let isAnonymous = Auth.auth().currentUser?.isAnonymous {
+      XCTAssertTrue(isAnonymous)
+    } else {
+      XCTFail("Missing currentUser after anonymous sign in")
     }
-  #endif
+    try await deleteCurrentUserAsync()
+  }
 }

+ 15 - 19
FirebaseAuth/Tests/Sample/SwiftApiTests/EmailPasswordTests.swift

@@ -39,15 +39,13 @@ class EmailPasswordTests: TestsBase {
     deleteCurrentUser()
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testCreateAccountWithEmailAndPasswordAsync() async throws {
-      let auth = Auth.auth()
-      try await auth.createUser(withEmail: kNewEmailToCreateUser, password: "password")
-      XCTAssertEqual(auth.currentUser?.email, kNewEmailToCreateUser, "Expected email doesn't match")
-      try await deleteCurrentUserAsync()
-    }
-  #endif
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testCreateAccountWithEmailAndPasswordAsync() async throws {
+    let auth = Auth.auth()
+    try await auth.createUser(withEmail: kNewEmailToCreateUser, password: "password")
+    XCTAssertEqual(auth.currentUser?.email, kNewEmailToCreateUser, "Expected email doesn't match")
+    try await deleteCurrentUserAsync()
+  }
 
   func testSignInExistingUserWithEmailAndPassword() {
     let auth = Auth.auth()
@@ -63,14 +61,12 @@ class EmailPasswordTests: TestsBase {
     waitForExpectations(timeout: TestsBase.kExpectationsTimeout)
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testSignInExistingUserWithEmailAndPasswordAsync() async throws {
-      let auth = Auth.auth()
-      try await auth.signIn(withEmail: kExistingEmailToSignIn, password: "password")
-      XCTAssertEqual(auth.currentUser?.email,
-                     kExistingEmailToSignIn,
-                     "Signed user does not match request.")
-    }
-  #endif
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testSignInExistingUserWithEmailAndPasswordAsync() async throws {
+    let auth = Auth.auth()
+    try await auth.signIn(withEmail: kExistingEmailToSignIn, password: "password")
+    XCTAssertEqual(auth.currentUser?.email,
+                   kExistingEmailToSignIn,
+                   "Signed user does not match request.")
+  }
 }

+ 0 - 8
FirebaseAuth/Tests/Sample/SwiftApiTests/FacebookTests.swift

@@ -44,7 +44,6 @@ import XCTest
 //    deleteFacebookTestingAccountbyID(facebookAccountID)
 //  }
 //
-//  #if compiler(>=5.5.2) && canImport(_Concurrency)
 //    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
 //    func testSignInWithFacebookAsync() async throws {
 //      let auth = Auth.auth()
@@ -60,7 +59,6 @@ import XCTest
 //      try await deleteCurrentUserAsync()
 //      try await deleteFacebookTestingAccountbyIDAsync(facebookAccountID)
 //    }
-//  #endif
 //
 //  func testLinkAnonymousAccountToFacebookAccount() throws {
 //    let auth = Auth.auth()
@@ -90,7 +88,6 @@ import XCTest
 //    deleteFacebookTestingAccountbyID(facebookAccountID)
 //  }
 //
-//  #if compiler(>=5.5.2) && canImport(_Concurrency)
 //    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
 //    func testLinkAnonymousAccountToFacebookAccountAsync() async throws {
 //      let auth = Auth.auth()
@@ -111,7 +108,6 @@ import XCTest
 //      try await deleteCurrentUserAsync()
 //      try await deleteFacebookTestingAccountbyIDAsync(facebookAccountID)
 //    }
-//  #endif
 //
 //  /// Creates a Facebook testing account using Facebook Graph API and return a dictionary that
 //  /// constrains "id", "access_token", "login_url", "email" and "password" of the created account.
@@ -151,7 +147,6 @@ import XCTest
 //    return returnValue
 //  }
 //
-//  #if compiler(>=5.5.2) && canImport(_Concurrency)
 //    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
 //    /// Creates a Facebook testing account using Facebook Graph API and return a dictionary that
 //    /// constains "id", "access_token", "login_url", "email" and "password" of the created
@@ -174,7 +169,6 @@ import XCTest
 //      }
 //      return returnValue
 //    }
-//  #endif
 //
 //  // ** Delete a Facebook testing account by account Id using Facebook Graph API. */
 //  func deleteFacebookTestingAccountbyID(_ accountID: String) {
@@ -195,7 +189,6 @@ import XCTest
 //    waitForExpectations(timeout: TestsBase.kExpectationsTimeout)
 //  }
 //
-//  #if compiler(>=5.5.2) && canImport(_Concurrency)
 //    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
 //    // ** Delete a Facebook testing account by account Id using Facebook Graph API. */
 //    func deleteFacebookTestingAccountbyIDAsync(_ accountID: String) async throws {
@@ -208,5 +201,4 @@ import XCTest
 //      fetcher.setRequestValue("text/plain", forHTTPHeaderField: "Content-Type")
 //      try await fetcher.beginFetch()
 //    }
-//  #endif
 // }

+ 35 - 39
FirebaseAuth/Tests/Sample/SwiftApiTests/GoogleTests.swift

@@ -37,18 +37,16 @@ class GoogleTests: TestsBase {
     waitForExpectations(timeout: TestsBase.kExpectationsTimeout)
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testSignInWithGoogleAsync() async throws {
-      let auth = Auth.auth()
-      let userInfoDict = try await getGoogleAccessTokenAsync()
-      let googleAccessToken: String = try XCTUnwrap(userInfoDict["access_token"] as? String)
-      let googleIDToken: String = try XCTUnwrap(userInfoDict["id_token"] as? String)
-      let credential = GoogleAuthProvider.credential(withIDToken: googleIDToken,
-                                                     accessToken: googleAccessToken)
-      _ = try await auth.signIn(with: credential)
-    }
-  #endif
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testSignInWithGoogleAsync() async throws {
+    let auth = Auth.auth()
+    let userInfoDict = try await getGoogleAccessTokenAsync()
+    let googleAccessToken: String = try XCTUnwrap(userInfoDict["access_token"] as? String)
+    let googleIDToken: String = try XCTUnwrap(userInfoDict["id_token"] as? String)
+    let credential = GoogleAuthProvider.credential(withIDToken: googleIDToken,
+                                                   accessToken: googleAccessToken)
+    _ = try await auth.signIn(with: credential)
+  }
 
   /// Sends http request to Google OAuth2 token server to use refresh token to exchange for Google
   /// access token.
@@ -84,32 +82,30 @@ class GoogleTests: TestsBase {
     return returnValue
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    /// Sends http request to Google OAuth2 token server to use refresh token to exchange for Google
-    /// access token.
-    /// Returns a dictionary that constains "access_token", "token_type", "expires_in" and sometimes
-    /// the "id_token". (The id_token is not guaranteed to be returned during a refresh exchange;
-    /// see https://openid.net/specs/openid-connect-core-1_0.html#RefreshTokenResponse)
-    func getGoogleAccessTokenAsync() async throws -> [String: Any] {
-      let googleOauth2TokenServerUrl = "https://www.googleapis.com/oauth2/v4/token"
-      let bodyString = "client_id=\(Credentials.kGoogleClientID)&grant_type=refresh_token" +
-        "&refresh_token=\(Credentials.kGoogleTestAccountRefreshToken)"
-      let postData = bodyString.data(using: .utf8)
-      let service = GTMSessionFetcherService()
-      let fetcher = service.fetcher(withURLString: googleOauth2TokenServerUrl)
-      fetcher.bodyData = postData
-      fetcher.setRequestValue(
-        "application/x-www-form-urlencoded",
-        forHTTPHeaderField: "Content-Type"
-      )
-      let data = try await fetcher.beginFetch()
-      guard let returnValue = try JSONSerialization.jsonObject(with: data, options: [])
-        as? [String: Any] else {
-        XCTFail("Failed to serialize userInfo as a Dictionary")
-        fatalError()
-      }
-      return returnValue
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  /// Sends http request to Google OAuth2 token server to use refresh token to exchange for Google
+  /// access token.
+  /// Returns a dictionary that constains "access_token", "token_type", "expires_in" and sometimes
+  /// the "id_token". (The id_token is not guaranteed to be returned during a refresh exchange;
+  /// see https://openid.net/specs/openid-connect-core-1_0.html#RefreshTokenResponse)
+  func getGoogleAccessTokenAsync() async throws -> [String: Any] {
+    let googleOauth2TokenServerUrl = "https://www.googleapis.com/oauth2/v4/token"
+    let bodyString = "client_id=\(Credentials.kGoogleClientID)&grant_type=refresh_token" +
+      "&refresh_token=\(Credentials.kGoogleTestAccountRefreshToken)"
+    let postData = bodyString.data(using: .utf8)
+    let service = GTMSessionFetcherService()
+    let fetcher = service.fetcher(withURLString: googleOauth2TokenServerUrl)
+    fetcher.bodyData = postData
+    fetcher.setRequestValue(
+      "application/x-www-form-urlencoded",
+      forHTTPHeaderField: "Content-Type"
+    )
+    let data = try await fetcher.beginFetch()
+    guard let returnValue = try JSONSerialization.jsonObject(with: data, options: [])
+      as? [String: Any] else {
+      XCTFail("Failed to serialize userInfo as a Dictionary")
+      fatalError()
     }
-  #endif
+    return returnValue
+  }
 }

+ 10 - 12
FirebaseAuth/Tests/Sample/SwiftApiTests/TestsBase.swift

@@ -21,19 +21,17 @@ import XCTest
 class TestsBase: XCTestCase {
   static let kExpectationsTimeout = 10.0
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func signInAnonymouslyAsync() async throws {
-      let auth = Auth.auth()
-      try await auth.signInAnonymously()
-    }
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func signInAnonymouslyAsync() async throws {
+    let auth = Auth.auth()
+    try await auth.signInAnonymously()
+  }
 
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func deleteCurrentUserAsync() async throws {
-      let auth = Auth.auth()
-      try await auth.currentUser?.delete()
-    }
-  #endif
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func deleteCurrentUserAsync() async throws {
+    let auth = Auth.auth()
+    try await auth.currentUser?.delete()
+  }
 
   func signInAnonymously() {
     let auth = Auth.auth()

+ 51 - 0
FirebaseAuth/Tests/Unit/ObjCGlobalTests.m

@@ -0,0 +1,51 @@
+// Copyright 2023 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import <XCTest/XCTest.h>
+
+@import FirebaseAuth;
+
+@interface ObjCAPIGlobalTests : XCTestCase
+@end
+
+@implementation ObjCAPIGlobalTests
+
+- (void)GlobalSymbolBuildTest {
+  __unused NSNotificationName n = FIRAuthStateDidChangeNotification;
+  NSString *s = FIRAuthErrorDomain;
+  s = FIRAuthErrorUserInfoNameKey;
+  s = FIRAuthErrorUserInfoEmailKey;
+  s = FIRAuthErrorUserInfoUpdatedCredentialKey;
+  s = FIRAuthErrorUserInfoMultiFactorResolverKey;
+  s = FIREmailAuthProviderID;
+  s = FIREmailLinkAuthSignInMethod;
+  s = FIREmailPasswordAuthSignInMethod;
+  s = FIRFacebookAuthProviderID;
+  s = FIRFacebookAuthSignInMethod;
+  s = FIRGameCenterAuthProviderID;
+  s = FIRGameCenterAuthSignInMethod;
+  s = FIRGitHubAuthProviderID;
+  s = FIRGitHubAuthSignInMethod;
+  s = FIRGoogleAuthProviderID;
+  s = FIRGoogleAuthSignInMethod;
+#if TARGET_OS_IOS
+  s = FIRPhoneMultiFactorID;
+  s = FIRTOTPMultiFactorID;
+  s = FIRPhoneAuthProviderID;
+  s = FIRPhoneAuthSignInMethod;
+#endif
+  s = FIRTwitterAuthProviderID;
+  s = FIRTwitterAuthSignInMethod;
+}
+@end

+ 50 - 0
FirebaseAuth/Tests/Unit/SwiftGlobalTests.swift

@@ -0,0 +1,50 @@
+// Copyright 2023 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import Foundation
+import XCTest
+
+import FirebaseAuth
+
+/// Tests globals defined in Objective C sources.  These globals are for backward compatibility and
+/// should not be used in new code.
+class SwiftGlobalTests: XCTestCase {
+  func GlobalSymbolBuildTest() {
+    let _ = NSNotification.Name.AuthStateDidChange
+    let _: String = AuthErrorDomain
+    let _: String = AuthErrorUserInfoNameKey
+    let _: String = AuthErrorUserInfoEmailKey
+    let _: String = AuthErrorUserInfoUpdatedCredentialKey
+    let _: String = AuthErrorUserInfoMultiFactorResolverKey
+    let _: String = EmailAuthProviderID
+    let _: String = EmailLinkAuthSignInMethod
+    let _: String = EmailPasswordAuthSignInMethod
+    let _: String = FacebookAuthProviderID
+    let _: String = FacebookAuthSignInMethod
+    let _: String = GameCenterAuthProviderID
+    let _: String = GameCenterAuthSignInMethod
+    let _: String = GitHubAuthProviderID
+    let _: String = GitHubAuthSignInMethod
+    let _: String = GoogleAuthProviderID
+    let _: String = GoogleAuthSignInMethod
+    #if os(iOS)
+      let _: String = PhoneMultiFactorID
+      let _: String = TOTPMultiFactorID
+      let _: String = PhoneAuthProviderID
+      let _: String = PhoneAuthSignInMethod
+    #endif
+    let _: String = TwitterAuthProviderID
+    let _: String = TwitterAuthSignInMethod
+  }
+}

+ 1 - 1
FirebaseAuthInterop.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseAuthInterop'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Interfaces that allow other Firebase SDKs to use Auth functionality.'
 
   s.description      = <<-DESC

+ 1 - 1
FirebaseCore.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseCore'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Firebase Core'
 
   s.description      = <<-DESC

+ 9 - 3
FirebaseCore/CHANGELOG.md

@@ -1,3 +1,9 @@
+# Unreleased
+- The following change only applies to those using a binary distribution of
+  a Firebase SDK(s). In preparation for supporting Privacy Manifests, each
+  platform framework directory within a static xcframewok no longer contains
+  an `Info.plist` file (#12243).
+
 # Firebase 10.14.0
 - For developers building for visionOS, Xcode 15 beta 6 or later is required.
 
@@ -139,7 +145,7 @@
 - [fixed] Fixed platform availability checks in Swift Package Manager that may prevent code
   completion for Analytics APIs on macOS and tvOS. (#9032)
 - [added] Firebase now includes community supported Combine publishers. More details can be found
-  [here](https://github.com/firebase/firebase-ios-sdk/blob/master/FirebaseCombineSwift/README.md). (#7295)
+  [here](https://github.com/firebase/firebase-ios-sdk/blob/main/FirebaseCombineSwift/README.md). (#7295)
 
 # Firebase 8.9.0
 - [added] Firebase introduces beta support for tvOS, macOS, and Catalyst.
@@ -266,7 +272,7 @@
 
 # Firebase 6.31.0 FirebaseCore 6.10.1 -- M78
 - [added] Beta release of Swift Package Manager. Details
-  [here](https://github.com/firebase/firebase-ios-sdk/blob/master/SwiftPackageManager.md). (#3136)
+  [here](https://github.com/firebase/firebase-ios-sdk/blob/main/SwiftPackageManager.md). (#3136)
 - [changed] Firebase's dependencies on nanopb are updated from version 0.3.9.5 to
   version 0.3.9.6 (1.30906.0 in CocoaPods).
 
@@ -300,7 +306,7 @@
 - [fixed] Fixed Carthage installation failures involving `Protobuf.framework`.
   `Protobuf.framework` is now separately installable via adding
   `FirebaseProtobufBinary.json` to the Cartfile. Full details in the [Carthage usage
-  instructions](https://github.com/firebase/firebase-ios-sdk/blob/master/Carthage.md#carthage-usage).
+  instructions](https://github.com/firebase/firebase-ios-sdk/blob/main/Carthage.md#carthage-usage).
   (#5276)
 
 # v6.6.6 -- M68

+ 33 - 1
FirebaseCore/Sources/FIRComponentContainer.m

@@ -20,6 +20,7 @@
 #import "FirebaseCore/Extension/FIRComponent.h"
 #import "FirebaseCore/Extension/FIRLibrary.h"
 #import "FirebaseCore/Extension/FIRLogger.h"
+#import "FirebaseCore/Extension/FIROptionsInternal.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
@@ -61,7 +62,18 @@ static NSMutableSet<Class> *sFIRComponentRegistrants;
 #pragma mark - Internal Initialization
 
 - (instancetype)initWithApp:(FIRApp *)app {
-  return [self initWithApp:app registrants:sFIRComponentRegistrants];
+  NSMutableSet<Class> *componentRegistrants = sFIRComponentRegistrants;
+  // If the app being created is for the ARCore SDK, remove the App Check
+  // component (if it exists) since it does not support App Check.
+  if ([self isAppForARCore:app]) {
+    Class klass = NSClassFromString(@"FIRAppCheckComponent");
+    if (klass && [sFIRComponentRegistrants containsObject:klass]) {
+      componentRegistrants = [componentRegistrants mutableCopy];
+      [componentRegistrants removeObject:klass];
+    }
+  }
+
+  return [self initWithApp:app registrants:componentRegistrants];
 }
 
 - (instancetype)initWithApp:(FIRApp *)app registrants:(NSMutableSet<Class> *)allRegistrants {
@@ -214,6 +226,26 @@ static NSMutableSet<Class> *sFIRComponentRegistrants;
   }
 }
 
+#pragma mark - Helpers
+
+- (BOOL)isAppForARCore:(FIRApp *)app {
+  // First, check if the app name matches that of the one used by ARCore.
+  if ([app.name isEqualToString:@"ARCoreFIRApp"]) {
+    // Second, check if the app's gcmSenderID matches that of ARCore. This
+    // prevents false positives in the unlikely event a 3P Firebase app is
+    // named `ARCoreFIRApp`.
+    const char *p1 = "406756";
+    const char *p2 = "893798";
+    const char gcmSenderIDKey[27] = {p1[0],  p2[0],  p1[1],  p2[1],  p1[2],  p2[2], p1[3],
+                                     p2[3],  p1[4],  p2[4],  p1[5],  p2[5],  p1[6], p2[6],
+                                     p1[7],  p2[7],  p1[8],  p2[8],  p1[9],  p2[9], p1[10],
+                                     p2[10], p1[11], p2[11], p1[12], p2[12], '\0'};
+    NSString *gcmSenderID = [NSString stringWithUTF8String:gcmSenderIDKey];
+    return [app.options.GCMSenderID isEqualToString:gcmSenderID];
+  }
+  return NO;
+}
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 5 - 7
FirebaseCore/Tests/SwiftUnit/CoreAPITests.swift

@@ -51,14 +51,12 @@ final class CoreAPITests {
         // ...
       }
 
-      #if compiler(>=5.5.2) && canImport(_Concurrency)
-        if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-          // async/await is a Swift 5.5+ feature available on iOS 15+
-          Task {
-            await app.delete()
-          }
+      if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+        // async/await is a Swift 5.5+ feature available on iOS 15+
+        Task {
+          await app.delete()
         }
-      #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+      }
     }
 
     // Properties

+ 1 - 1
FirebaseCoreExtension.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
     s.name             = 'FirebaseCoreExtension'
-    s.version          = '10.19.0'
+    s.version          = '10.20.0'
     s.summary          = 'Extended FirebaseCore APIs for Firebase product SDKs'
 
     s.description      = <<-DESC

+ 1 - 1
FirebaseCoreInternal.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseCoreInternal'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'APIs for internal FirebaseCore usage.'
 
   s.description      = <<-DESC

+ 1 - 1
FirebaseCrashlytics.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseCrashlytics'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Best and lightest-weight crash reporting for mobile, desktop and tvOS.'
   s.description      = 'Firebase Crashlytics helps you track, prioritize, and fix stability issues that erode app quality.'
   s.homepage         = 'https://firebase.google.com/'

+ 1 - 1
FirebaseDatabase.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseDatabase'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Firebase Realtime Database'
 
   s.description      = <<-DESC

+ 1 - 1
FirebaseDatabase/Tests/Unit/FIRDatabaseConnectionContextProviderTests.m

@@ -97,7 +97,7 @@
                       [completionExpectation fulfill];
                     }];
 
-  [self waitForExpectations:@[ completionExpectation ] timeout:0.5];
+  [self waitForExpectations:@[ completionExpectation ] timeout:2.0];
 }
 
 - (void)testFetchContextWithAuthNoAppCheckSuccess {

+ 139 - 169
FirebaseDatabase/Tests/Unit/Swift/DatabaseAPITests.swift

@@ -112,18 +112,16 @@ final class DatabaseAPITests {
       let /* dataSnapshot */ _: DataSnapshot? = dataSnapshot
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            let /* dataSnapshot */ _: DataSnapshot = try await DatabaseQuery().getData()
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          let /* dataSnapshot */ _: DataSnapshot = try await DatabaseQuery().getData()
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // Observe Single Event
 
@@ -138,16 +136,14 @@ final class DatabaseAPITests {
       let /* optionalString */ _: String? = optionalString
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          // observeSingleEvent(of eventType:)
-          let _: (DataSnapshot, String?) = await DatabaseQuery()
-            .observeSingleEventAndPreviousSiblingKey(of: dataEventType)
-        }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        // observeSingleEvent(of eventType:)
+        let _: (DataSnapshot, String?) = await DatabaseQuery()
+          .observeSingleEventAndPreviousSiblingKey(of: dataEventType)
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // observeSingleEvent(of eventType:with block:withCancel cancelBlock:)
     databaseQuery.observeSingleEvent(of: dataEventType) { dataSnapshot in
@@ -210,19 +206,17 @@ final class DatabaseAPITests {
       let /* databaseReference */ _: DatabaseReference = databaseReference
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            // setValue(_ value:)
-            let /* ref */ _: DatabaseReference = try await DatabaseReference().setValue(value)
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          // setValue(_ value:)
+          let /* ref */ _: DatabaseReference = try await DatabaseReference().setValue(value)
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     databaseReference.setValue(value, andPriority: priority)
 
@@ -232,20 +226,18 @@ final class DatabaseAPITests {
       let /* databaseReference */ _: DatabaseReference = databaseReference
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            // setValue(_ value:andPriority priority:)
-            let /* ref */ _: DatabaseReference = try await DatabaseReference()
-              .setValue(value, andPriority: priority)
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          // setValue(_ value:andPriority priority:)
+          let /* ref */ _: DatabaseReference = try await DatabaseReference()
+            .setValue(value, andPriority: priority)
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // Remove value
     databaseReference.removeValue()
@@ -256,18 +248,16 @@ final class DatabaseAPITests {
       let /* databaseReference */ _: DatabaseReference = databaseReference
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            let /* ref */ _: DatabaseReference = try await DatabaseReference().removeValue()
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          let /* ref */ _: DatabaseReference = try await DatabaseReference().removeValue()
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // Set priority
     databaseReference.setPriority(priority)
@@ -278,19 +268,17 @@ final class DatabaseAPITests {
       let /* databaseReference */ _: DatabaseReference = databaseReference
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            // setPriority(_ priority:)
-            let /* ref */ _: DatabaseReference = try await DatabaseReference().setPriority(priority)
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          // setPriority(_ priority:)
+          let /* ref */ _: DatabaseReference = try await DatabaseReference().setPriority(priority)
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // Update child values
     databaseReference.updateChildValues(values)
@@ -301,20 +289,18 @@ final class DatabaseAPITests {
       let /* databaseReference */ _: DatabaseReference = databaseReference
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            // updateChildValues(_ values:)
-            let /* ref */ _: DatabaseReference = try await DatabaseReference()
-              .updateChildValues(values)
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          // updateChildValues(_ values:)
+          let /* ref */ _: DatabaseReference = try await DatabaseReference()
+            .updateChildValues(values)
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // Observe for data
 
@@ -357,16 +343,14 @@ final class DatabaseAPITests {
       let /* optionalString */ _: String? = optionalString
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          // observeSingleEvent(of eventType:)
-          let _: (DataSnapshot, String?) = await DatabaseReference()
-            .observeSingleEventAndPreviousSiblingKey(of: dataEventType)
-        }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        // observeSingleEvent(of eventType:)
+        let _: (DataSnapshot, String?) = await DatabaseReference()
+          .observeSingleEventAndPreviousSiblingKey(of: dataEventType)
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // observeSingleEvent(of eventType:with block:withCancel cancelBlock:)
     databaseReference.observeSingleEvent(of: dataEventType) { dataSnapshot in
@@ -391,18 +375,16 @@ final class DatabaseAPITests {
       let /* dataSnapshot */ _: DataSnapshot? = dataSnapshot
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            let /* dataSnapshot */ _: DataSnapshot = try await DatabaseReference().getData()
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          let /* dataSnapshot */ _: DataSnapshot = try await DatabaseReference().getData()
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // Remove Observers
     databaseReference.removeObserver(withHandle: databaseHandle)
@@ -435,20 +417,18 @@ final class DatabaseAPITests {
       let /* databaseReference */ _: DatabaseReference = databaseReference
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            // onDisconnectSetValue(_ value:)
-            let /* ref */ _: DatabaseReference = try await DatabaseReference()
-              .onDisconnectSetValue(value)
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          // onDisconnectSetValue(_ value:)
+          let /* ref */ _: DatabaseReference = try await DatabaseReference()
+            .onDisconnectSetValue(value)
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     databaseReference.onDisconnectSetValue(value, andPriority: priorityAny)
 
@@ -459,22 +439,20 @@ final class DatabaseAPITests {
         let /* databaseReference */ _: DatabaseReference = databaseReference
       }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            // onDisconnectSetValue(_ value:andPriority priority:)
-            let /* ref */ _: DatabaseReference = try await DatabaseReference().onDisconnectSetValue(
-              value,
-              andPriority: priority
-            )
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          // onDisconnectSetValue(_ value:andPriority priority:)
+          let /* ref */ _: DatabaseReference = try await DatabaseReference().onDisconnectSetValue(
+            value,
+            andPriority: priority
+          )
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // onDisconnectRemoveValue
     databaseReference.onDisconnectRemoveValue()
@@ -485,19 +463,17 @@ final class DatabaseAPITests {
       let /* databaseReference */ _: DatabaseReference = databaseReference
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            let /* ref */ _: DatabaseReference = try await DatabaseReference()
-              .onDisconnectRemoveValue()
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          let /* ref */ _: DatabaseReference = try await DatabaseReference()
+            .onDisconnectRemoveValue()
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // onDisconnectUpdateChildValues
     databaseReference.onDisconnectUpdateChildValues(values)
@@ -508,20 +484,18 @@ final class DatabaseAPITests {
       let /* databaseReference */ _: DatabaseReference = databaseReference
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            // onDisconnectUpdateChildValues(_ values:)
-            let /* ref */ _: DatabaseReference = try await DatabaseReference()
-              .onDisconnectUpdateChildValues(values)
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          // onDisconnectUpdateChildValues(_ values:)
+          let /* ref */ _: DatabaseReference = try await DatabaseReference()
+            .onDisconnectUpdateChildValues(values)
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // cancelDisconnectOperations
     databaseReference.cancelDisconnectOperations()
@@ -532,19 +506,17 @@ final class DatabaseAPITests {
       let /* databaseReference */ _: DatabaseReference = databaseReference
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            let /* ref */ _: DatabaseReference = try await DatabaseReference()
-              .cancelDisconnectOperations()
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          let /* ref */ _: DatabaseReference = try await DatabaseReference()
+            .cancelDisconnectOperations()
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // runTransactionBlock
 
@@ -564,23 +536,21 @@ final class DatabaseAPITests {
       let /* optionalDataSnapshot */ _: DataSnapshot? = optionalDataSnapshot
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            // runTransactionBlock(_ block:)
-            let _: (Bool, DataSnapshot) = try await DatabaseReference()
-              .runTransactionBlock { mutableData in
-                let /* mutableData */ _: MutableData = mutableData
-                return TransactionResult()
-              }
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 10.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          // runTransactionBlock(_ block:)
+          let _: (Bool, DataSnapshot) = try await DatabaseReference()
+            .runTransactionBlock { mutableData in
+              let /* mutableData */ _: MutableData = mutableData
+              return TransactionResult()
+            }
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // runTransactionBlock(_ block:andCompletionBlock completionBlock:withLocalEvents localEvents:)
     databaseReference.runTransactionBlock({ mutableData in

+ 1 - 1
FirebaseDynamicLinks.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseDynamicLinks'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Firebase Dynamic Links'
 
   s.description      = <<-DESC

+ 1 - 1
FirebaseDynamicLinks/CHANGELOG.md

@@ -69,7 +69,7 @@
 - [fixed] Reduce frequency of iOS14 pasteboard notifications by only reading from it when it contains URL(s). (#5905)
 - [changed] Functionally neutral updated import references for dependencies. (#5824)
 
-Refer to the [README.md](https://github.com/firebase/firebase-ios-sdk/blob/master/FirebaseDynamicLinks/README.md) for more details about this release.
+Refer to the [README.md](https://github.com/firebase/firebase-ios-sdk/blob/main/FirebaseDynamicLinks/README.md) for more details about this release.
 
 # 4.1.0
 - [fixed] Fixing unwanted pending dynamic links checks on subsequent app restarts. (#5665)

+ 5 - 0
FirebaseDynamicLinks/README.md

@@ -1,5 +1,10 @@
 # Firebase Dynamic Links SDK for iOS
 
+> [!IMPORTANT]
+> Firebase Dynamic Links is **deprecated** and should not be used in new projects. The service will shut down on August 25, 2025.
+>
+> Please see our [Dynamic Links Deprecation FAQ documentation](https://firebase.google.com/support/dynamic-links-faq) for more guidance.
+
 Firebase Dynamic Links are universal deep links that persist across app installs.
 For more info, see the [Firebase website](https://firebase.google.com/products/dynamic-links).
 

+ 0 - 104
FirebaseDynamicLinks/Tests/Integration/FDLBuilderTestAppObjCEarlGreyTests.m

@@ -1,104 +0,0 @@
-/*
- * Copyright 2018 Google
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#import <XCTest/XCTest.h>
-
-#ifdef COCOAPODS
-#import <EarlGrey/EarlGrey.h>
-#else
-#import "third_party/objective_c/EarlGrey/EarlGrey/EarlGrey.h"
-#endif
-
-@interface FDLBuilderTestAppObjCEarlGreyTests : XCTestCase
-
-@end
-
-@implementation FDLBuilderTestAppObjCEarlGreyTests
-
-#pragma mark - Tests
-
-- (void)testOpenFDLFromAppGeneratedLink {
-  // On first launch, a null FDL Received alert is displayed (by design); in
-  // this case, we need to dismiss it in order to proceed
-  BOOL hasFirstInstallAlertDisplayed = [self confirmPresenceOfFDLAlertWithURL:@"(null)"
-                                                                    matchType:@"0"
-                                                            minimumAppVersion:@"(null)"];
-  if (hasFirstInstallAlertDisplayed) {
-    [[EarlGrey selectElementWithMatcher:[GREYMatchers matcherForText:@"Dismiss"]]
-        performAction:grey_tap()];
-  }
-
-  // Scroll down in the app until the Generate Link button can be pressed, then tap it
-  [[[EarlGrey selectElementWithMatcher:[GREYMatchers matcherForText:@"Generate Link"]]
-         usingSearchAction:grey_swipeFastInDirection(kGREYDirectionUp)
-      onElementWithMatcher:grey_kindOfClass([UITableView class])] performAction:grey_tap()];
-
-  // Find long link table view cell
-  NSString *fdlLongLinkId = @"LinkTableViewCell-LinkTextView-Long link";
-
-  // Find long link table view cell
-  [[[EarlGrey selectElementWithMatcher:grey_accessibilityID(fdlLongLinkId)] atIndex:0]
-      assert:[GREYAssertionBlock
-                       assertionWithName:@"Long link non empty and valid"
-                 assertionBlockWithError:^BOOL(id element, NSError *__strong *errorOrNil) {
-                   XCTAssertTrue([element isKindOfClass:[UITextView class]]);
-                   UITextView *longLinkTextView = element;
-                   // ensure long link cell has non empty value
-                   XCTAssertTrue(longLinkTextView.text.length > 0);
-                   // ensure long link cell value is a valid URL
-                   XCTAssertNotNil([NSURL URLWithString:longLinkTextView.text]);
-
-                   return YES;
-                 }]];
-}
-
-#pragma mark - Private
-
-- (BOOL)waitForElementWithMatcher:(id<GREYMatcher>)matcher
-            toBeVisibleWithinTime:(CFTimeInterval)timeInterval {
-  return [[GREYCondition conditionWithName:@"Waiting for element to appear"
-                                     block:^BOOL() {
-                                       return [self isElementPresentWithMatcher:matcher];
-                                     }] waitWithTimeout:timeInterval];
-}
-
-- (BOOL)isElementPresentWithMatcher:(id<GREYMatcher>)matcher {
-  NSError *error = nil;
-
-  [[[EarlGrey selectElementWithMatcher:matcher] atIndex:0] assertWithMatcher:grey_notNil()
-                                                                       error:&error];
-
-  if (error && (![error.domain isEqualToString:kGREYInteractionErrorDomain] ||
-                error.code != kGREYInteractionElementNotFoundErrorCode)) {
-    GREYFail(@"Unexpected error when trying to locate an element matching %@: %@", matcher, error);
-  }
-  return error == nil;
-}
-
-- (BOOL)confirmPresenceOfFDLAlertWithURL:(NSString *)URL
-                               matchType:(NSString *)matchType
-                       minimumAppVersion:(NSString *)minimumAppVersion {
-  id<GREYMatcher> alertViewClass = grey_kindOfClass(NSClassFromString(@"_UIAlertControllerView"));
-  NSString *expectedAlertText =
-      [NSString stringWithFormat:@"URL [%@], matchType [%@], minimumAppVersion [%@]", URL,
-                                 matchType, minimumAppVersion];
-
-  return [self waitForElementWithMatcher:grey_allOf(grey_ancestor(alertViewClass),
-                                                    grey_text(expectedAlertText), nil)
-                   toBeVisibleWithinTime:10];
-}
-
-@end

+ 1 - 1
FirebaseFirestore.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseFirestore'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Google Cloud Firestore'
   s.description      = <<-DESC
 Google Cloud Firestore is a NoSQL document database built for automatic scaling, high performance, and ease of application development.

+ 1 - 1
FirebaseFirestoreInternal.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseFirestoreInternal'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Google Cloud Firestore'
 
   s.description      = <<-DESC

+ 1 - 1
FirebaseFunctions.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseFunctions'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Cloud Functions for Firebase'
 
   s.description      = <<-DESC

+ 49 - 51
FirebaseFunctions/Sources/Callable+Codable.swift

@@ -109,56 +109,54 @@ public struct Callable<Request: Encodable, Response: Decodable> {
     call(data, completion: completion)
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    /// Executes this Callable HTTPS trigger asynchronously.
-    ///
-    /// The data passed into the trigger must be of the generic `Request` type:
-    ///
-    /// The request to the Cloud Functions backend made by this method automatically includes a
-    /// FCM token to identify the app instance. If a user is logged in with Firebase
-    /// Auth, an auth ID token for the user is also automatically included.
-    ///
-    /// Firebase Cloud Messaging sends data to the Firebase backend periodically to collect
-    /// information
-    /// regarding the app instance. To stop this, see `Messaging.deleteData()`. It
-    /// resumes with a new FCM Token the next time you call this method.
-    ///
-    /// - Parameter data: The `Request` representing the data to pass to the trigger.
-    ///
-    /// - Throws: An error if any value throws an error during encoding or decoding.
-    /// - Throws: An error if the callable fails to complete
-    ///
-    /// - Returns: The decoded `Response` value
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    public func call(_ data: Request) async throws -> Response {
-      let encoded = try encoder.encode(data)
-      let result = try await callable.call(encoded)
-      return try decoder.decode(Response.self, from: result.data)
-    }
+  /// Executes this Callable HTTPS trigger asynchronously.
+  ///
+  /// The data passed into the trigger must be of the generic `Request` type:
+  ///
+  /// The request to the Cloud Functions backend made by this method automatically includes a
+  /// FCM token to identify the app instance. If a user is logged in with Firebase
+  /// Auth, an auth ID token for the user is also automatically included.
+  ///
+  /// Firebase Cloud Messaging sends data to the Firebase backend periodically to collect
+  /// information
+  /// regarding the app instance. To stop this, see `Messaging.deleteData()`. It
+  /// resumes with a new FCM Token the next time you call this method.
+  ///
+  /// - Parameter data: The `Request` representing the data to pass to the trigger.
+  ///
+  /// - Throws: An error if any value throws an error during encoding or decoding.
+  /// - Throws: An error if the callable fails to complete
+  ///
+  /// - Returns: The decoded `Response` value
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  public func call(_ data: Request) async throws -> Response {
+    let encoded = try encoder.encode(data)
+    let result = try await callable.call(encoded)
+    return try decoder.decode(Response.self, from: result.data)
+  }
 
-    /// Creates a directly callable function.
-    ///
-    /// This allows users to call a HTTPS Callable Function like a normal Swift function:
-    /// ```swift
-    ///     let greeter = functions.httpsCallable("greeter",
-    ///                                           requestType: GreetingRequest.self,
-    ///                                           responseType: GreetingResponse.self)
-    ///     let result = try await greeter(data)
-    ///     print(result.greeting)
-    /// ```
-    /// You can also call a HTTPS Callable function using the following syntax:
-    /// ```swift
-    ///     let greeter: Callable<GreetingRequest, GreetingResponse> =
-    /// functions.httpsCallable("greeter")
-    ///     let result = try await greeter(data)
-    ///     print(result.greeting)
-    /// ```
-    /// - Parameters:
-    ///   - data: Parameters to pass to the trigger.
-    /// - Returns: The decoded `Response` value
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    public func callAsFunction(_ data: Request) async throws -> Response {
-      return try await call(data)
-    }
-  #endif
+  /// Creates a directly callable function.
+  ///
+  /// This allows users to call a HTTPS Callable Function like a normal Swift function:
+  /// ```swift
+  ///     let greeter = functions.httpsCallable("greeter",
+  ///                                           requestType: GreetingRequest.self,
+  ///                                           responseType: GreetingResponse.self)
+  ///     let result = try await greeter(data)
+  ///     print(result.greeting)
+  /// ```
+  /// You can also call a HTTPS Callable function using the following syntax:
+  /// ```swift
+  ///     let greeter: Callable<GreetingRequest, GreetingResponse> =
+  /// functions.httpsCallable("greeter")
+  ///     let result = try await greeter(data)
+  ///     print(result.greeting)
+  /// ```
+  /// - Parameters:
+  ///   - data: Parameters to pass to the trigger.
+  /// - Returns: The decoded `Response` value
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  public func callAsFunction(_ data: Request) async throws -> Response {
+    return try await call(data)
+  }
 }

+ 25 - 27
FirebaseFunctions/Sources/HTTPSCallable.swift

@@ -139,34 +139,32 @@ open class HTTPSCallable: NSObject {
     call(nil, completion: completion)
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    /**
-     * Executes this Callable HTTPS trigger asynchronously.
-     *
-     * The request to the Cloud Functions backend made by this method automatically includes a
-     * FCM token to identify the app instance. If a user is logged in with Firebase
-     * Auth, an auth ID token for the user is also automatically included.
-     *
-     * Firebase Cloud Messaging sends data to the Firebase backend periodically to collect information
-     * regarding the app instance. To stop this, see `Messaging.deleteData()`. It
-     * resumes with a new FCM Token the next time you call this method.
-     *
-     * - Parameter data Parameters to pass to the trigger.
-     * - Throws: An error if the Cloud Functions invocation failed.
-     * - Returns: The result of the call.
-     */
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    open func call(_ data: Any? = nil) async throws -> HTTPSCallableResult {
-      return try await withCheckedThrowingContinuation { continuation in
-        // TODO(bonus): Use task to handle and cancellation.
-        self.call(data) { callableResult, error in
-          if let callableResult = callableResult {
-            continuation.resume(returning: callableResult)
-          } else {
-            continuation.resume(throwing: error!)
-          }
+  /**
+   * Executes this Callable HTTPS trigger asynchronously.
+   *
+   * The request to the Cloud Functions backend made by this method automatically includes a
+   * FCM token to identify the app instance. If a user is logged in with Firebase
+   * Auth, an auth ID token for the user is also automatically included.
+   *
+   * Firebase Cloud Messaging sends data to the Firebase backend periodically to collect information
+   * regarding the app instance. To stop this, see `Messaging.deleteData()`. It
+   * resumes with a new FCM Token the next time you call this method.
+   *
+   * - Parameter data Parameters to pass to the trigger.
+   * - Throws: An error if the Cloud Functions invocation failed.
+   * - Returns: The result of the call.
+   */
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  open func call(_ data: Any? = nil) async throws -> HTTPSCallableResult {
+    return try await withCheckedThrowingContinuation { continuation in
+      // TODO(bonus): Use task to handle and cancellation.
+      self.call(data) { callableResult, error in
+        if let callableResult = callableResult {
+          continuation.resume(returning: callableResult)
+        } else {
+          continuation.resume(throwing: error!)
         }
       }
     }
-  #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+  }
 }

+ 310 - 339
FirebaseFunctions/Tests/Integration/IntegrationTests.swift

@@ -118,36 +118,34 @@ class IntegrationTests: XCTestCase {
     }
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testDataAsync() async throws {
-      let data = DataTestRequest(
-        bool: true,
-        int: 2,
-        long: 9_876_543_210,
-        string: "four",
-        array: [5, 6],
-        null: nil
-      )
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testDataAsync() async throws {
+    let data = DataTestRequest(
+      bool: true,
+      int: 2,
+      long: 9_876_543_210,
+      string: "four",
+      array: [5, 6],
+      null: nil
+    )
 
-      let byName = functions.httpsCallable("dataTest",
-                                           requestAs: DataTestRequest.self,
-                                           responseAs: DataTestResponse.self)
-      let byUrl = functions.httpsCallable(emulatorURL("dataTest"),
-                                          requestAs: DataTestRequest.self,
-                                          responseAs: DataTestResponse.self)
-
-      for function in [byName, byUrl] {
-        let response = try await function.call(data)
-        let expected = DataTestResponse(
-          message: "stub response",
-          long: 420,
-          code: 42
-        )
-        XCTAssertEqual(response, expected)
-      }
+    let byName = functions.httpsCallable("dataTest",
+                                         requestAs: DataTestRequest.self,
+                                         responseAs: DataTestResponse.self)
+    let byUrl = functions.httpsCallable(emulatorURL("dataTest"),
+                                        requestAs: DataTestRequest.self,
+                                        responseAs: DataTestResponse.self)
+
+    for function in [byName, byUrl] {
+      let response = try await function.call(data)
+      let expected = DataTestResponse(
+        message: "stub response",
+        long: 420,
+        code: 42
+      )
+      XCTAssertEqual(response, expected)
     }
-  #endif
+  }
 
   func testScalar() {
     let byName = functions.httpsCallable(
@@ -175,37 +173,34 @@ class IntegrationTests: XCTestCase {
     }
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testScalarAsync() async throws {
-      let byName = functions.httpsCallable(
-        "scalarTest",
-        requestAs: Int16.self,
-        responseAs: Int.self
-      )
-      let byURL = functions.httpsCallable(
-        emulatorURL("scalarTest"),
-        requestAs: Int16.self,
-        responseAs: Int.self
-      )
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testScalarAsync() async throws {
+    let byName = functions.httpsCallable(
+      "scalarTest",
+      requestAs: Int16.self,
+      responseAs: Int.self
+    )
+    let byURL = functions.httpsCallable(
+      emulatorURL("scalarTest"),
+      requestAs: Int16.self,
+      responseAs: Int.self
+    )
 
-      for function in [byName, byURL] {
-        let result = try await function.call(17)
-        XCTAssertEqual(result, 76)
-      }
+    for function in [byName, byURL] {
+      let result = try await function.call(17)
+      XCTAssertEqual(result, 76)
     }
+  }
 
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testScalarAsyncAlternateSignature() async throws {
-      let byName: Callable<Int16, Int> = functions.httpsCallable("scalarTest")
-      let byURL: Callable<Int16, Int> = functions.httpsCallable(emulatorURL("scalarTest"))
-      for function in [byName, byURL] {
-        let result = try await function.call(17)
-        XCTAssertEqual(result, 76)
-      }
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testScalarAsyncAlternateSignature() async throws {
+    let byName: Callable<Int16, Int> = functions.httpsCallable("scalarTest")
+    let byURL: Callable<Int16, Int> = functions.httpsCallable(emulatorURL("scalarTest"))
+    for function in [byName, byURL] {
+      let result = try await function.call(17)
+      XCTAssertEqual(result, 76)
     }
-
-  #endif
+  }
 
   func testToken() {
     // Recreate functions with a token.
@@ -245,37 +240,35 @@ class IntegrationTests: XCTestCase {
     }
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testTokenAsync() async throws {
-      // Recreate functions with a token.
-      let functions = Functions(
-        projectID: "functions-integration-test",
-        region: "us-central1",
-        customDomain: nil,
-        auth: AuthTokenProvider(token: "token"),
-        messaging: MessagingTokenProvider(),
-        appCheck: nil
-      )
-      functions.useEmulator(withHost: "localhost", port: 5005)
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testTokenAsync() async throws {
+    // Recreate functions with a token.
+    let functions = Functions(
+      projectID: "functions-integration-test",
+      region: "us-central1",
+      customDomain: nil,
+      auth: AuthTokenProvider(token: "token"),
+      messaging: MessagingTokenProvider(),
+      appCheck: nil
+    )
+    functions.useEmulator(withHost: "localhost", port: 5005)
 
-      let byName = functions.httpsCallable(
-        "tokenTest",
-        requestAs: [String: Int].self,
-        responseAs: [String: Int].self
-      )
-      let byURL = functions.httpsCallable(
-        emulatorURL("tokenTest"),
-        requestAs: [String: Int].self,
-        responseAs: [String: Int].self
-      )
+    let byName = functions.httpsCallable(
+      "tokenTest",
+      requestAs: [String: Int].self,
+      responseAs: [String: Int].self
+    )
+    let byURL = functions.httpsCallable(
+      emulatorURL("tokenTest"),
+      requestAs: [String: Int].self,
+      responseAs: [String: Int].self
+    )
 
-      for function in [byName, byURL] {
-        let data = try await function.call([:])
-        XCTAssertEqual(data, [:])
-      }
+    for function in [byName, byURL] {
+      let data = try await function.call([:])
+      XCTAssertEqual(data, [:])
     }
-  #endif
+  }
 
   func testFCMToken() {
     let byName = functions.httpsCallable(
@@ -303,26 +296,24 @@ class IntegrationTests: XCTestCase {
     }
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testFCMTokenAsync() async throws {
-      let byName = functions.httpsCallable(
-        "FCMTokenTest",
-        requestAs: [String: Int].self,
-        responseAs: [String: Int].self
-      )
-      let byURL = functions.httpsCallable(
-        emulatorURL("FCMTokenTest"),
-        requestAs: [String: Int].self,
-        responseAs: [String: Int].self
-      )
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testFCMTokenAsync() async throws {
+    let byName = functions.httpsCallable(
+      "FCMTokenTest",
+      requestAs: [String: Int].self,
+      responseAs: [String: Int].self
+    )
+    let byURL = functions.httpsCallable(
+      emulatorURL("FCMTokenTest"),
+      requestAs: [String: Int].self,
+      responseAs: [String: Int].self
+    )
 
-      for function in [byName, byURL] {
-        let data = try await function.call([:])
-        XCTAssertEqual(data, [:])
-      }
+    for function in [byName, byURL] {
+      let data = try await function.call([:])
+      XCTAssertEqual(data, [:])
     }
-  #endif
+  }
 
   func testNull() {
     let byName = functions.httpsCallable(
@@ -350,26 +341,24 @@ class IntegrationTests: XCTestCase {
     }
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testNullAsync() async throws {
-      let byName = functions.httpsCallable(
-        "nullTest",
-        requestAs: Int?.self,
-        responseAs: Int?.self
-      )
-      let byURL = functions.httpsCallable(
-        emulatorURL("nullTest"),
-        requestAs: Int?.self,
-        responseAs: Int?.self
-      )
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testNullAsync() async throws {
+    let byName = functions.httpsCallable(
+      "nullTest",
+      requestAs: Int?.self,
+      responseAs: Int?.self
+    )
+    let byURL = functions.httpsCallable(
+      emulatorURL("nullTest"),
+      requestAs: Int?.self,
+      responseAs: Int?.self
+    )
 
-      for function in [byName, byURL] {
-        let data = try await function.call(nil)
-        XCTAssertEqual(data, nil)
-      }
+    for function in [byName, byURL] {
+      let data = try await function.call(nil)
+      XCTAssertEqual(data, nil)
     }
-  #endif
+  }
 
   func testMissingResult() {
     let byName = functions.httpsCallable(
@@ -401,31 +390,29 @@ class IntegrationTests: XCTestCase {
     }
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testMissingResultAsync() async {
-      let byName = functions.httpsCallable(
-        "missingResultTest",
-        requestAs: Int?.self,
-        responseAs: Int?.self
-      )
-      let byURL = functions.httpsCallable(
-        emulatorURL("missingResultTest"),
-        requestAs: Int?.self,
-        responseAs: Int?.self
-      )
-      for function in [byName, byURL] {
-        do {
-          _ = try await function.call(nil)
-          XCTFail("Failed to throw error for missing result")
-        } catch {
-          let error = error as NSError
-          XCTAssertEqual(FunctionsErrorCode.internal.rawValue, error.code)
-          XCTAssertEqual("Response is missing data field.", error.localizedDescription)
-        }
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testMissingResultAsync() async {
+    let byName = functions.httpsCallable(
+      "missingResultTest",
+      requestAs: Int?.self,
+      responseAs: Int?.self
+    )
+    let byURL = functions.httpsCallable(
+      emulatorURL("missingResultTest"),
+      requestAs: Int?.self,
+      responseAs: Int?.self
+    )
+    for function in [byName, byURL] {
+      do {
+        _ = try await function.call(nil)
+        XCTFail("Failed to throw error for missing result")
+      } catch {
+        let error = error as NSError
+        XCTAssertEqual(FunctionsErrorCode.internal.rawValue, error.code)
+        XCTAssertEqual("Response is missing data field.", error.localizedDescription)
       }
     }
-  #endif
+  }
 
   func testUnhandledError() {
     let byName = functions.httpsCallable(
@@ -457,31 +444,29 @@ class IntegrationTests: XCTestCase {
     }
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testUnhandledErrorAsync() async {
-      let byName = functions.httpsCallable(
-        "unhandledErrorTest",
-        requestAs: [Int].self,
-        responseAs: Int.self
-      )
-      let byURL = functions.httpsCallable(
-        "unhandledErrorTest",
-        requestAs: [Int].self,
-        responseAs: Int.self
-      )
-      for function in [byName, byURL] {
-        do {
-          _ = try await function.call([])
-          XCTFail("Failed to throw error for missing result")
-        } catch {
-          let error = error as NSError
-          XCTAssertEqual(FunctionsErrorCode.internal.rawValue, error.code)
-          XCTAssertEqual("INTERNAL", error.localizedDescription)
-        }
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testUnhandledErrorAsync() async {
+    let byName = functions.httpsCallable(
+      "unhandledErrorTest",
+      requestAs: [Int].self,
+      responseAs: Int.self
+    )
+    let byURL = functions.httpsCallable(
+      "unhandledErrorTest",
+      requestAs: [Int].self,
+      responseAs: Int.self
+    )
+    for function in [byName, byURL] {
+      do {
+        _ = try await function.call([])
+        XCTFail("Failed to throw error for missing result")
+      } catch {
+        let error = error as NSError
+        XCTAssertEqual(FunctionsErrorCode.internal.rawValue, error.code)
+        XCTAssertEqual("INTERNAL", error.localizedDescription)
       }
     }
-  #endif
+  }
 
   func testUnknownError() {
     let byName = functions.httpsCallable(
@@ -512,31 +497,29 @@ class IntegrationTests: XCTestCase {
     waitForExpectations(timeout: 5)
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testUnknownErrorAsync() async {
-      let byName = functions.httpsCallable(
-        "unknownErrorTest",
-        requestAs: [Int].self,
-        responseAs: Int.self
-      )
-      let byURL = functions.httpsCallable(
-        emulatorURL("unknownErrorTest"),
-        requestAs: [Int].self,
-        responseAs: Int.self
-      )
-      for function in [byName, byURL] {
-        do {
-          _ = try await function.call([])
-          XCTAssertFalse(true, "Failed to throw error for missing result")
-        } catch {
-          let error = error as NSError
-          XCTAssertEqual(FunctionsErrorCode.internal.rawValue, error.code)
-          XCTAssertEqual("INTERNAL", error.localizedDescription)
-        }
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testUnknownErrorAsync() async {
+    let byName = functions.httpsCallable(
+      "unknownErrorTest",
+      requestAs: [Int].self,
+      responseAs: Int.self
+    )
+    let byURL = functions.httpsCallable(
+      emulatorURL("unknownErrorTest"),
+      requestAs: [Int].self,
+      responseAs: Int.self
+    )
+    for function in [byName, byURL] {
+      do {
+        _ = try await function.call([])
+        XCTAssertFalse(true, "Failed to throw error for missing result")
+      } catch {
+        let error = error as NSError
+        XCTAssertEqual(FunctionsErrorCode.internal.rawValue, error.code)
+        XCTAssertEqual("INTERNAL", error.localizedDescription)
       }
     }
-  #endif
+  }
 
   func testExplicitError() {
     let byName = functions.httpsCallable(
@@ -569,33 +552,31 @@ class IntegrationTests: XCTestCase {
     }
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testExplicitErrorAsync() async {
-      let byName = functions.httpsCallable(
-        "explicitErrorTest",
-        requestAs: [Int].self,
-        responseAs: Int.self
-      )
-      let byURL = functions.httpsCallable(
-        emulatorURL("explicitErrorTest"),
-        requestAs: [Int].self,
-        responseAs: Int.self
-      )
-      for function in [byName, byURL] {
-        do {
-          _ = try await function.call([])
-          XCTAssertFalse(true, "Failed to throw error for missing result")
-        } catch {
-          let error = error as NSError
-          XCTAssertEqual(FunctionsErrorCode.outOfRange.rawValue, error.code)
-          XCTAssertEqual("explicit nope", error.localizedDescription)
-          XCTAssertEqual(["start": 10 as Int32, "end": 20 as Int32, "long": 30],
-                         error.userInfo["details"] as? [String: Int32])
-        }
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testExplicitErrorAsync() async {
+    let byName = functions.httpsCallable(
+      "explicitErrorTest",
+      requestAs: [Int].self,
+      responseAs: Int.self
+    )
+    let byURL = functions.httpsCallable(
+      emulatorURL("explicitErrorTest"),
+      requestAs: [Int].self,
+      responseAs: Int.self
+    )
+    for function in [byName, byURL] {
+      do {
+        _ = try await function.call([])
+        XCTAssertFalse(true, "Failed to throw error for missing result")
+      } catch {
+        let error = error as NSError
+        XCTAssertEqual(FunctionsErrorCode.outOfRange.rawValue, error.code)
+        XCTAssertEqual("explicit nope", error.localizedDescription)
+        XCTAssertEqual(["start": 10 as Int32, "end": 20 as Int32, "long": 30],
+                       error.userInfo["details"] as? [String: Int32])
       }
     }
-  #endif
+  }
 
   func testHttpError() {
     let byName = functions.httpsCallable(
@@ -626,30 +607,28 @@ class IntegrationTests: XCTestCase {
     }
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testHttpErrorAsync() async {
-      let byName = functions.httpsCallable(
-        "httpErrorTest",
-        requestAs: [Int].self,
-        responseAs: Int.self
-      )
-      let byURL = functions.httpsCallable(
-        emulatorURL("httpErrorTest"),
-        requestAs: [Int].self,
-        responseAs: Int.self
-      )
-      for function in [byName, byURL] {
-        do {
-          _ = try await function.call([])
-          XCTAssertFalse(true, "Failed to throw error for missing result")
-        } catch {
-          let error = error as NSError
-          XCTAssertEqual(FunctionsErrorCode.invalidArgument.rawValue, error.code)
-        }
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testHttpErrorAsync() async {
+    let byName = functions.httpsCallable(
+      "httpErrorTest",
+      requestAs: [Int].self,
+      responseAs: Int.self
+    )
+    let byURL = functions.httpsCallable(
+      emulatorURL("httpErrorTest"),
+      requestAs: [Int].self,
+      responseAs: Int.self
+    )
+    for function in [byName, byURL] {
+      do {
+        _ = try await function.call([])
+        XCTAssertFalse(true, "Failed to throw error for missing result")
+      } catch {
+        let error = error as NSError
+        XCTAssertEqual(FunctionsErrorCode.invalidArgument.rawValue, error.code)
       }
     }
-  #endif
+  }
 
   func testThrowError() {
     let byName = functions.httpsCallable(
@@ -681,31 +660,29 @@ class IntegrationTests: XCTestCase {
     }
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testThrowErrorAsync() async {
-      let byName = functions.httpsCallable(
-        "throwTest",
-        requestAs: [Int].self,
-        responseAs: Int.self
-      )
-      let byURL = functions.httpsCallable(
-        emulatorURL("throwTest"),
-        requestAs: [Int].self,
-        responseAs: Int.self
-      )
-      for function in [byName, byURL] {
-        do {
-          _ = try await function.call([])
-          XCTAssertFalse(true, "Failed to throw error for missing result")
-        } catch {
-          let error = error as NSError
-          XCTAssertEqual(FunctionsErrorCode.invalidArgument.rawValue, error.code)
-          XCTAssertEqual(error.localizedDescription, "Invalid test requested.")
-        }
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testThrowErrorAsync() async {
+    let byName = functions.httpsCallable(
+      "throwTest",
+      requestAs: [Int].self,
+      responseAs: Int.self
+    )
+    let byURL = functions.httpsCallable(
+      emulatorURL("throwTest"),
+      requestAs: [Int].self,
+      responseAs: Int.self
+    )
+    for function in [byName, byURL] {
+      do {
+        _ = try await function.call([])
+        XCTAssertFalse(true, "Failed to throw error for missing result")
+      } catch {
+        let error = error as NSError
+        XCTAssertEqual(FunctionsErrorCode.invalidArgument.rawValue, error.code)
+        XCTAssertEqual(error.localizedDescription, "Invalid test requested.")
       }
     }
-  #endif
+  }
 
   func testTimeout() {
     let byName = functions.httpsCallable(
@@ -738,34 +715,32 @@ class IntegrationTests: XCTestCase {
     }
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testTimeoutAsync() async {
-      var byName = functions.httpsCallable(
-        "timeoutTest",
-        requestAs: [Int].self,
-        responseAs: Int.self
-      )
-      byName.timeoutInterval = 0.05
-      var byURL = functions.httpsCallable(
-        emulatorURL("timeoutTest"),
-        requestAs: [Int].self,
-        responseAs: Int.self
-      )
-      byURL.timeoutInterval = 0.05
-      for function in [byName, byURL] {
-        do {
-          _ = try await function.call([])
-          XCTAssertFalse(true, "Failed to throw error for missing result")
-        } catch {
-          let error = error as NSError
-          XCTAssertEqual(FunctionsErrorCode.deadlineExceeded.rawValue, error.code)
-          XCTAssertEqual("DEADLINE EXCEEDED", error.localizedDescription)
-          XCTAssertNil(error.userInfo["details"])
-        }
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testTimeoutAsync() async {
+    var byName = functions.httpsCallable(
+      "timeoutTest",
+      requestAs: [Int].self,
+      responseAs: Int.self
+    )
+    byName.timeoutInterval = 0.05
+    var byURL = functions.httpsCallable(
+      emulatorURL("timeoutTest"),
+      requestAs: [Int].self,
+      responseAs: Int.self
+    )
+    byURL.timeoutInterval = 0.05
+    for function in [byName, byURL] {
+      do {
+        _ = try await function.call([])
+        XCTAssertFalse(true, "Failed to throw error for missing result")
+      } catch {
+        let error = error as NSError
+        XCTAssertEqual(FunctionsErrorCode.deadlineExceeded.rawValue, error.code)
+        XCTAssertEqual("DEADLINE EXCEEDED", error.localizedDescription)
+        XCTAssertNil(error.userInfo["details"])
       }
     }
-  #endif
+  }
 
   func testCallAsFunction() {
     let data = DataTestRequest(
@@ -802,37 +777,35 @@ class IntegrationTests: XCTestCase {
     }
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testCallAsFunctionAsync() async throws {
-      let data = DataTestRequest(
-        bool: true,
-        int: 2,
-        long: 9_876_543_210,
-        string: "four",
-        array: [5, 6],
-        null: nil
-      )
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testCallAsFunctionAsync() async throws {
+    let data = DataTestRequest(
+      bool: true,
+      int: 2,
+      long: 9_876_543_210,
+      string: "four",
+      array: [5, 6],
+      null: nil
+    )
 
-      let byName = functions.httpsCallable("dataTest",
-                                           requestAs: DataTestRequest.self,
-                                           responseAs: DataTestResponse.self)
-
-      let byURL = functions.httpsCallable(emulatorURL("dataTest"),
-                                          requestAs: DataTestRequest.self,
-                                          responseAs: DataTestResponse.self)
-
-      for function in [byName, byURL] {
-        let response = try await function(data)
-        let expected = DataTestResponse(
-          message: "stub response",
-          long: 420,
-          code: 42
-        )
-        XCTAssertEqual(response, expected)
-      }
+    let byName = functions.httpsCallable("dataTest",
+                                         requestAs: DataTestRequest.self,
+                                         responseAs: DataTestResponse.self)
+
+    let byURL = functions.httpsCallable(emulatorURL("dataTest"),
+                                        requestAs: DataTestRequest.self,
+                                        responseAs: DataTestResponse.self)
+
+    for function in [byName, byURL] {
+      let response = try await function(data)
+      let expected = DataTestResponse(
+        message: "stub response",
+        long: 420,
+        code: 42
+      )
+      XCTAssertEqual(response, expected)
     }
-  #endif
+  }
 
   func testInferredTypes() {
     let data = DataTestRequest(
@@ -867,34 +840,32 @@ class IntegrationTests: XCTestCase {
     }
   }
 
-  #if compiler(>=5.5.2) && canImport(_Concurrency)
-    @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
-    func testInferredTyesAsync() async throws {
-      let data = DataTestRequest(
-        bool: true,
-        int: 2,
-        long: 9_876_543_210,
-        string: "four",
-        array: [5, 6],
-        null: nil
-      )
+  @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
+  func testInferredTyesAsync() async throws {
+    let data = DataTestRequest(
+      bool: true,
+      int: 2,
+      long: 9_876_543_210,
+      string: "four",
+      array: [5, 6],
+      null: nil
+    )
 
-      let byName: Callable<DataTestRequest, DataTestResponse> = functions
-        .httpsCallable("dataTest")
-      let byURL: Callable<DataTestRequest, DataTestResponse> = functions
-        .httpsCallable(emulatorURL("dataTest"))
-
-      for function in [byName, byURL] {
-        let response = try await function(data)
-        let expected = DataTestResponse(
-          message: "stub response",
-          long: 420,
-          code: 42
-        )
-        XCTAssertEqual(response, expected)
-      }
+    let byName: Callable<DataTestRequest, DataTestResponse> = functions
+      .httpsCallable("dataTest")
+    let byURL: Callable<DataTestRequest, DataTestResponse> = functions
+      .httpsCallable(emulatorURL("dataTest"))
+
+    for function in [byName, byURL] {
+      let response = try await function(data)
+      let expected = DataTestResponse(
+        message: "stub response",
+        long: 420,
+        code: 42
+      )
+      XCTAssertEqual(response, expected)
     }
-  #endif
+  }
 }
 
 private class AuthTokenProvider: AuthInterop {

+ 18 - 22
FirebaseFunctions/Tests/Unit/FunctionsAPITests.swift

@@ -85,19 +85,17 @@ final class FunctionsAPITests: XCTestCase {
       }
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            let result = try await callableRef.call(data)
-            _ = result.data
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          let result = try await callableRef.call(data)
+          _ = result.data
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     callableRef.call { result, error in
       if let result = result {
@@ -107,19 +105,17 @@ final class FunctionsAPITests: XCTestCase {
       }
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            let result = try await callableRef.call()
-            _ = result.data
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          let result = try await callableRef.call()
+          _ = result.data
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // MARK: - FunctionsErrorCode
 

+ 1 - 1
FirebaseInAppMessaging.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseInAppMessaging'
-  s.version          = '10.19.0-beta'
+  s.version          = '10.20.0-beta'
   s.summary          = 'Firebase In-App Messaging for iOS'
 
   s.description      = <<-DESC

+ 1 - 1
FirebaseInAppMessaging/Sources/DefaultUI/FIRCore+InAppMessagingDisplay.h

@@ -17,7 +17,7 @@
 #import "FirebaseCore/Extension/FirebaseCoreInternal.h"
 
 // This file contains declarations that should go into FirebaseCore when
-// Firebase InAppMessagingDisplay is merged into master. Keep them separate now to help
+// Firebase InAppMessagingDisplay is merged into main. Keep them separate now to help
 // with build from development folder and avoid merge conflicts.
 
 extern FIRLoggerService kFIRLoggerInAppMessagingDisplay;

+ 1 - 1
FirebaseInAppMessaging/Sources/FIRCore+InAppMessaging.h

@@ -17,7 +17,7 @@
 #import "FirebaseCore/Extension/FirebaseCoreInternal.h"
 
 // This file contains declarations that should go into FirebaseCore when
-// Firebase InAppMessaging is merged into master. Keep them separate now to help
+// Firebase InAppMessaging is merged into main. Keep them separate now to help
 // with build from development folder and avoid merge conflicts.
 
 // this should eventually be in FIRLogger.h

+ 1 - 1
FirebaseInstallations.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseInstallations'
-  s.version          = '10.19.0'
+  s.version          = '10.20.0'
   s.summary          = 'Firebase Installations'
 
   s.description      = <<-DESC

+ 24 - 30
FirebaseInstallations/Source/Tests/Unit/Swift/InstallationsAPITests.swift

@@ -51,18 +51,16 @@ final class InstallationsAPITests {
       }
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            try await Installations.installations().installationID()
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          try await Installations.installations().installationID()
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // Retrieves an installation auth token
     Installations.installations().authToken { result, error in
@@ -73,18 +71,16 @@ final class InstallationsAPITests {
       }
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            _ = try await Installations.installations().authToken()
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          _ = try await Installations.installations().authToken()
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // Retrieves an installation auth token with forcing refresh parameter
     Installations.installations().authTokenForcingRefresh(true) { result, error in
@@ -95,18 +91,16 @@ final class InstallationsAPITests {
       }
     }
 
-    #if compiler(>=5.5.2) && canImport(_Concurrency)
-      if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
-        // async/await is a Swift 5.5+ feature available on iOS 15+
-        Task {
-          do {
-            _ = try await Installations.installations().authTokenForcingRefresh(true)
-          } catch {
-            // ...
-          }
+    if #available(iOS 13.0, macOS 11.15, macCatalyst 13.0, tvOS 13.0, watchOS 7.0, *) {
+      // async/await is a Swift 5.5+ feature available on iOS 15+
+      Task {
+        do {
+          _ = try await Installations.installations().authTokenForcingRefresh(true)
+        } catch {
+          // ...
         }
       }
-    #endif // compiler(>=5.5.2) && canImport(_Concurrency)
+    }
 
     // Delete installation data
     Installations.installations().delete { error in

+ 1 - 1
FirebaseMLModelDownloader.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'FirebaseMLModelDownloader'
-  s.version          = '10.19.0-beta'
+  s.version          = '10.20.0-beta'
   s.summary          = 'Firebase ML Model Downloader'
 
   s.description      = <<-DESC

Неке датотеке нису приказане због велике количине промена