Skip to content

[Bug][iOS] Firebase Crashlytic causes static or crashes on background external Audio whenever an exception is loggedΒ #1376

@khangnguyenvn1004

Description

@khangnguyenvn1004

Description

When playing a Unity game project on iOS using Firebase Crashlytics, if Crashlytics.ReportUncaughtExceptionsAsFatal is set to true and an exception is logged, then the audio playing in the background will be disrupted and static noises can be heard. Spamming too many exceptions will cause that audio to crash.

Setting Crashlytics.ReportUncaughtExceptionsAsFatal to false only delays this issue. It causes the playing audio to completely stop AFTER closing and reopening the app and cannot be restored except by locking and unlocking the phone, reconnecting the Bluetooth device (if Bluetooth is used), or even restarting the phone. This can take a while to take effect, depending on when Firebase sends exception messages after closing and reopening the app.

While this can be reproduced on Unity 2022.3.62f2, Unity 6000.3.0f1 also has this issue. So I'm confident this happens regardless of Unity version. And it happens on any exception, not just NotImplementedException.

Only this code snippet is needed:

public class MainGame : MonoBehaviour
{
    [SerializeField] private Button _exceptionButton;
    
    private void Awake()
    {
        Firebase.FirebaseApp.CheckAndFixDependenciesAsync()
            .ContinueWithOnMainThread(
                previousTask => 
                {
                    var dependencyStatus = previousTask.Result;
                    if (dependencyStatus == Firebase.DependencyStatus.Available) {
                        // Create a reference to the FirebaseApp
                        _ = Firebase.FirebaseApp.DefaultInstance;
                        
                        // Set the recommended Crashlytics uncaught exception behavior.
                        Crashlytics.ReportUncaughtExceptionsAsFatal = true;

                        SetupExceptionButton();
                    } else {
                        Debug.LogError(
                            $"Could not resolve all Firebase dependencies: {dependencyStatus}\n" +
                            "Firebase Unity SDK is not safe to use here");
                    }
                });
    }

    private void SetupExceptionButton()
    {
        _exceptionButton.onClick.AddListener(ThrowException);
    }

    private static void ThrowException()
    {
        throw new NotImplementedException();
    }
}

Reproducing the issue

The reproduction machine should have Unity 2022.3.62f2 with iOS build support.
Steps to reproduce:

  1. Download and decompress this minimum project file: firebase-audio-crash.zip
  2. Add these firebase packages to the GooglePackages folder:
    • com.google.external-dependency-manager-1.2.186.tgz
    • com.google.firebase.analytics-13.6.0.tgz
    • com.google.firebase.app-13.6.0.tgz
    • com.google.firebase.crashlytics-13.6.0.tgz

The folder structure should look like this:
Image

  1. Open the project using Unity 2022.3.62f2

  2. Export the project to xCode then build the project to an iOS device

  3. Play any background music using any music app (Spotify, YouTube Music, Netflix, Prime Video, Disney+)

  4. Open the game on iOS, the screen should look like this:

Image

  1. Press the "Throw Exception" button on the screen
  2. The static noise on external audio will be heard. If the button is spammed, the audio could crash.

Firebase Unity SDK Version

13.6.0

Unity editor version

2022.3.62f2

Installation Method

Unity Package Manager

Problematic Firebase Component(s)

Crashlytics

Other Firebase Component(s) in use

Analytics

Additional SDKs you are using

No response

Targeted Platform(s)

Apple Platforms

Unity editor platform

Mac

Scripting Runtime

IL2CPP

Release Distribution Type

Pre-built SDK from https://firebase.google.com/download/unity

Relevant Log Output

NotImplementedException: The method or operation is not implemented.
  at MainGame.ThrowException () [0x00000] in <00000000000000000000000000000000>:0 
  at UnityEngine.Events.UnityEvent.Invoke () [0x00000] in <00000000000000000000000000000000>:0 
  at UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) [0x00000] in <00000000000000000000000000000000>:0 
  at UnityEngine.EventSystems.StandaloneInputModule.ProcessTouchPress (UnityEngine.EventSystems.PointerEventData pointerEvent, System.Boolean pressed, System.Boolean released) [0x00000] in <00000000000000000000000000000000>:0 
  at UnityEngine.EventSystems.StandaloneInputModule.ProcessTouchEvents () [0x00000] in <00000000000000000000000000000000>:0 
  at UnityEngine.EventSystems.StandaloneInputModule.Process () [0x00000] in <00000000000000000000000000000000>:0 
UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject, BaseEventData, EventFunction`1)
UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchPress(PointerEventData, Boolean, Boolean)
UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchEvents()
UnityEngine.EventSystems.StandaloneInputModule:Process()

App is being debugged, do not track this hang
Hang detected: 0.39s (debugger attached, not reporting)
12.6.0 - [FirebaseCrashlytics][I-CLS000000] Crashlytics skipped rotating the Install ID during urgent mode because it is run on the main thread, which can't succeed. This can happen if the app crashed the last run and Crashlytics is uploading urgently.
12.6.0 - [FirebaseAnalytics][I-ACS023060] Too many real-time events. Event is no longer real-time. Event name, parameters: _ae, {
    "_o" = clx;
    "_sc" = UnityDefaultViewController;
    "_si" = "-1365693618175320601";
    fatal = 1;
    timestamp = 0;
}

If using CocoaPods for Apple platforms, the project's Podfile.lock

Expand Podfile.lock snippet
PODS:
  - Firebase/Analytics (12.6.0):
    - Firebase/Core
  - Firebase/Core (12.6.0):
    - Firebase/CoreOnly
    - FirebaseAnalytics (~> 12.6.0)
  - Firebase/CoreOnly (12.6.0):
    - FirebaseCore (~> 12.6.0)
  - Firebase/Crashlytics (12.6.0):
    - Firebase/CoreOnly
    - FirebaseCrashlytics (~> 12.6.0)
  - FirebaseAnalytics (12.6.0):
    - FirebaseAnalytics/Default (= 12.6.0)
    - FirebaseCore (~> 12.6.0)
    - FirebaseInstallations (~> 12.6.0)
    - GoogleUtilities/AppDelegateSwizzler (~> 8.1)
    - GoogleUtilities/MethodSwizzler (~> 8.1)
    - GoogleUtilities/Network (~> 8.1)
    - "GoogleUtilities/NSData+zlib (~> 8.1)"
    - nanopb (~> 3.30910.0)
  - FirebaseAnalytics/Default (12.6.0):
    - FirebaseCore (~> 12.6.0)
    - FirebaseInstallations (~> 12.6.0)
    - GoogleAppMeasurement/Default (= 12.6.0)
    - GoogleUtilities/AppDelegateSwizzler (~> 8.1)
    - GoogleUtilities/MethodSwizzler (~> 8.1)
    - GoogleUtilities/Network (~> 8.1)
    - "GoogleUtilities/NSData+zlib (~> 8.1)"
    - nanopb (~> 3.30910.0)
  - FirebaseCore (12.6.0):
    - FirebaseCoreInternal (~> 12.6.0)
    - GoogleUtilities/Environment (~> 8.1)
    - GoogleUtilities/Logger (~> 8.1)
  - FirebaseCoreExtension (12.6.0):
    - FirebaseCore (~> 12.6.0)
  - FirebaseCoreInternal (12.6.0):
    - "GoogleUtilities/NSData+zlib (~> 8.1)"
  - FirebaseCrashlytics (12.6.0):
    - FirebaseCore (~> 12.6.0)
    - FirebaseInstallations (~> 12.6.0)
    - FirebaseRemoteConfigInterop (~> 12.6.0)
    - FirebaseSessions (~> 12.6.0)
    - GoogleDataTransport (~> 10.1)
    - GoogleUtilities/Environment (~> 8.1)
    - nanopb (~> 3.30910.0)
    - PromisesObjC (~> 2.4)
  - FirebaseInstallations (12.6.0):
    - FirebaseCore (~> 12.6.0)
    - GoogleUtilities/Environment (~> 8.1)
    - GoogleUtilities/UserDefaults (~> 8.1)
    - PromisesObjC (~> 2.4)
  - FirebaseRemoteConfigInterop (12.6.0)
  - FirebaseSessions (12.6.0):
    - FirebaseCore (~> 12.6.0)
    - FirebaseCoreExtension (~> 12.6.0)
    - FirebaseInstallations (~> 12.6.0)
    - GoogleDataTransport (~> 10.1)
    - GoogleUtilities/Environment (~> 8.1)
    - GoogleUtilities/UserDefaults (~> 8.1)
    - nanopb (~> 3.30910.0)
    - PromisesSwift (~> 2.1)
  - GoogleAdsOnDeviceConversion (3.2.0):
    - GoogleUtilities/Environment (~> 8.1)
    - GoogleUtilities/Logger (~> 8.1)
    - GoogleUtilities/Network (~> 8.1)
    - nanopb (~> 3.30910.0)
  - GoogleAppMeasurement/Core (12.6.0):
    - GoogleUtilities/AppDelegateSwizzler (~> 8.1)
    - GoogleUtilities/MethodSwizzler (~> 8.1)
    - GoogleUtilities/Network (~> 8.1)
    - "GoogleUtilities/NSData+zlib (~> 8.1)"
    - nanopb (~> 3.30910.0)
  - GoogleAppMeasurement/Default (12.6.0):
    - GoogleAdsOnDeviceConversion (~> 3.2.0)
    - GoogleAppMeasurement/Core (= 12.6.0)
    - GoogleAppMeasurement/IdentitySupport (= 12.6.0)
    - GoogleUtilities/AppDelegateSwizzler (~> 8.1)
    - GoogleUtilities/MethodSwizzler (~> 8.1)
    - GoogleUtilities/Network (~> 8.1)
    - "GoogleUtilities/NSData+zlib (~> 8.1)"
    - nanopb (~> 3.30910.0)
  - GoogleAppMeasurement/IdentitySupport (12.6.0):
    - GoogleAppMeasurement/Core (= 12.6.0)
    - GoogleUtilities/AppDelegateSwizzler (~> 8.1)
    - GoogleUtilities/MethodSwizzler (~> 8.1)
    - GoogleUtilities/Network (~> 8.1)
    - "GoogleUtilities/NSData+zlib (~> 8.1)"
    - nanopb (~> 3.30910.0)
  - GoogleDataTransport (10.1.0):
    - nanopb (~> 3.30910.0)
    - PromisesObjC (~> 2.4)
  - GoogleUtilities/AppDelegateSwizzler (8.1.0):
    - GoogleUtilities/Environment
    - GoogleUtilities/Logger
    - GoogleUtilities/Network
    - GoogleUtilities/Privacy
  - GoogleUtilities/Environment (8.1.0):
    - GoogleUtilities/Privacy
  - GoogleUtilities/Logger (8.1.0):
    - GoogleUtilities/Environment
    - GoogleUtilities/Privacy
  - GoogleUtilities/MethodSwizzler (8.1.0):
    - GoogleUtilities/Logger
    - GoogleUtilities/Privacy
  - GoogleUtilities/Network (8.1.0):
    - GoogleUtilities/Logger
    - "GoogleUtilities/NSData+zlib"
    - GoogleUtilities/Privacy
    - GoogleUtilities/Reachability
  - "GoogleUtilities/NSData+zlib (8.1.0)":
    - GoogleUtilities/Privacy
  - GoogleUtilities/Privacy (8.1.0)
  - GoogleUtilities/Reachability (8.1.0):
    - GoogleUtilities/Logger
    - GoogleUtilities/Privacy
  - GoogleUtilities/UserDefaults (8.1.0):
    - GoogleUtilities/Logger
    - GoogleUtilities/Privacy
  - nanopb (3.30910.0):
    - nanopb/decode (= 3.30910.0)
    - nanopb/encode (= 3.30910.0)
  - nanopb/decode (3.30910.0)
  - nanopb/encode (3.30910.0)
  - PromisesObjC (2.4.0)
  - PromisesSwift (2.4.0):
    - PromisesObjC (= 2.4.0)

DEPENDENCIES:
  - Firebase/Analytics (= 12.6.0)
  - Firebase/Core (= 12.6.0)
  - Firebase/Crashlytics (= 12.6.0)

SPEC REPOS:
  trunk:
    - Firebase
    - FirebaseAnalytics
    - FirebaseCore
    - FirebaseCoreExtension
    - FirebaseCoreInternal
    - FirebaseCrashlytics
    - FirebaseInstallations
    - FirebaseRemoteConfigInterop
    - FirebaseSessions
    - GoogleAdsOnDeviceConversion
    - GoogleAppMeasurement
    - GoogleDataTransport
    - GoogleUtilities
    - nanopb
    - PromisesObjC
    - PromisesSwift

SPEC CHECKSUMS:
  Firebase: a451a7b61536298fd5cbfe3a746fd40443a50679
  FirebaseAnalytics: d0a97a0db6425e5a5d966340b87f92ca7b13a557
  FirebaseCore: 0e38ad5d62d980a47a64b8e9301ffa311457be04
  FirebaseCoreExtension: 032fd6f8509e591fda8cb76f6651f20d926b121f
  FirebaseCoreInternal: 69bf1306a05b8ac43004f6cc1f804bb7b05b229e
  FirebaseCrashlytics: 3d6248c50726ee7832aef0e53cb84c9e64d9fa7e
  FirebaseInstallations: 631b38da2e11a83daa4bfb482f79d286a5dfa7ad
  FirebaseRemoteConfigInterop: 3443b8cb8fffd76bb3e03b2a84bfd3db952fcda4
  FirebaseSessions: 2e8f808347e665dff3e5843f275715f07045297d
  GoogleAdsOnDeviceConversion: d68c69dd9581a0f5da02617b6f377e5be483970f
  GoogleAppMeasurement: 3bf40aff49a601af5da1c3345702fcb4991d35ee
  GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
  GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
  nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
  PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
  PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851

PODFILE CHECKSUM: 5595eab1a8bff94d2f61346616c0e91aa940952b

COCOAPODS: 1.15.2

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions