Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[🐛] 🔥 On Android, calls to getAppStartupDeepLinkUrl() cause an ObjectAlreadyConsumedException #5812

Closed
2 of 8 tasks
hsource opened this issue Oct 25, 2021 · 2 comments · Fixed by #5814
Closed
2 of 8 tasks
Labels
help: needs-triage Issue needs additional investigation/triaging. type: bug New bug report

Comments

@hsource
Copy link

hsource commented Oct 25, 2021

Issue

We call firebase.dynamicLinks().getInitialLink() on app startup. In our logs, this seems to result in unhandled exceptions sometimes in the Java code.

We run on:

  • react-native 0.64.2
  • @react-native-firebase/dynamic-links 12.8.0

Here's the stacktrace:

com.facebook.react.bridge.ObjectAlreadyConsumedException: Map already consumed
        at com.facebook.react.bridge.WritableNativeMap.putNativeMap(WritableNativeMap.java:-2)
        at com.facebook.react.bridge.WritableNativeMap.putMap(WritableNativeMap.java:45)
        at io.invertase.firebase.dynamiclinks.ReactNativeFirebaseDynamicLinksModule.dynamicLinkToWritableMap(ReactNativeFirebaseDynamicLinksModule.java:259)
        at io.invertase.firebase.dynamiclinks.ReactNativeFirebaseDynamicLinksModule.lambda$getInitialLink$4$ReactNativeFirebaseDynamicLinksModule(ReactNativeFirebaseDynamicLinksModule.java:199)
        at io.invertase.firebase.dynamiclinks.-$$Lambda$ReactNativeFirebaseDynamicLinksModule$SvkL2IUA9JkrdDtdvcRI6AkH2FY.onComplete(Unknown:4)
        at com.google.android.gms.tasks.zzi.run(com.google.android.gms:play-services-tasks@@17.2.1:1)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7073)
        at java.lang.reflect.Method.invoke(Method.java:-2)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

Project Files

Javascript: our code calling

import { Linking } from 'react-native';
import firebase from '@react-native-firebase/app';
import '@react-native-firebase/dynamic-links';

/**
 * Get the deep link URL from either Firebase or just a regular deep link
 * on startup
 */
export async function getAppStartupDeepLinkUrl() {
  const [firebaseInitialUrl, linkingInitialUrl] = await Promise.all([
    // We support both direct URLs (e.g.,
    // https://app.myproject.com/plan/blah?loginToken=...) and URLs from
    // Firebase
    firebase.dynamicLinks().getInitialLink(),
    // Note: if you're debugging this on iOS and can't get it to work,
    // the react-native currently (as of 2019-08-27) has a bug
    // that causes `Linking.getInitialURL()` to always return null when
    // in iOS Simulator with remote debugging turned on. See
    // https://github.com/facebook/react-native/issues/24429#issuecomment-489702443
    Linking.getInitialURL(),
  ]);

  return firebaseInitialUrl?.url || linkingInitialUrl;
}

package.json:

{
  "name": "...",
  "version": "0.0.1",
  "private": true,
  "scripts": {},
  "dependencies": {
    "@invertase/react-native-apple-authentication": "^1.1.2",
    "@notifee/react-native": "^3.0.1",
    "@react-native-firebase/analytics": "^12.9.2",
    "@react-native-firebase/app": "^12.8.0",
    "@react-native-firebase/dynamic-links": "^12.8.0",
    "@react-native-firebase/messaging": "^12.8.0",
    "@react-navigation/core": "^3.7.9",
    "expo-camera": "^11.2.2",
    "expo-contacts": "^9.2.5",
    "expo-crypto": "^9.2.0",
    "expo-image-picker": "^10.1.4",
    "expo-location": "^12.1.2",
    "expo-notifications": "^0.12.3",
    "react": "17.0.1",
    "react-dom": "17.0.1",
    "react-native": "0.64.2",
    "react-native-fbsdk-next": "^4.3.0",
    "react-native-reanimated": "^1.9.0",
    "react-native-unimodules": "^0.14.8",
    "react-navigation": "^4.0.10",
    "react-navigation-animated-switch": "^0.6.0",
    "react-navigation-hooks": "^1.1.0",
    "react-navigation-stack": "^1.9.1",
    "react-navigation-tabs": "^2.5.5",
  }
}

firebase.json for react-native-firebase v6:

N/A

Android

Click To Expand

Have you converted to AndroidX?

  • my application is an AndroidX application?
  • I am using android/gradle.settings jetifier=true for Android compatibility?
  • I am using the NPM package jetifier for react-native compatibility?

android/build.gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext {
        buildToolsVersion = "29.0.3"
        minSdkVersion = 23
        // Changed SDK to 30 from https://docs.expo.io/bare/installing-unimodules/#configuration-for-android
        compileSdkVersion = 30
        targetSdkVersion = 30
        ndkVersion = "20.1.5948944"
    }
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath("com.android.tools.build:gradle:4.1.0")
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files

        // Added from https://v5.rnfirebase.io/docs/v5.x.x/installation/android#2.-Setup-google-services.json
        // Updated to version 4.3.10 based on https://rnfirebase.io/#configure-firebase-with-android-credentials
        classpath("com.google.gms:google-services:4.3.10")
    }
}

allprojects {
    repositories {
        mavenLocal()
        maven {
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url("$rootDir/../node_modules/react-native/android")
        }
        maven {
            // Android JSC is installed from npm
            url("$rootDir/../node_modules/jsc-android/dist")
        }

        google()
        jcenter()
        maven { url 'https://www.jitpack.io' }

        maven {
            // Added from https://github.com/expo/expo/issues/3639
            // expo-camera bundles a custom com.google.android:cameraview
            url "$rootDir/../node_modules/expo-camera/android/maven"
        }

        maven {
          // For notifee:
          // https://notifee.app/react-native/docs/installation
          url "$rootDir/../node_modules/@notifee/react-native/android/libs"
        }
    }
}

android/app/build.gradle:

apply plugin: "com.android.application"

import com.android.build.OutputFile

/**
 * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
 * and bundleReleaseJsAndAssets).
 * These basically call `react-native bundle` with the correct arguments during the Android build
 * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
 * bundle directly from the development server. Below you can see all the possible configurations
 * and their defaults. If you decide to add a configuration block, make sure to add it before the
 * `apply from: "../../node_modules/react-native/react.gradle"` line.
 *
 * project.ext.react = [
 *   // the name of the generated asset file containing your JS bundle
 *   bundleAssetName: "index.android.bundle",
 *
 *   // the entry file for bundle generation. If none specified and
 *   // "index.android.js" exists, it will be used. Otherwise "index.js" is
 *   // default. Can be overridden with ENTRY_FILE environment variable.
 *   entryFile: "index.android.js",
 *
 *   // https://reactnative.dev/docs/performance#enable-the-ram-format
 *   bundleCommand: "ram-bundle",
 *
 *   // whether to bundle JS and assets in debug mode
 *   bundleInDebug: false,
 *
 *   // whether to bundle JS and assets in release mode
 *   bundleInRelease: true,
 *
 *   // whether to bundle JS and assets in another build variant (if configured).
 *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
 *   // The configuration property can be in the following formats
 *   //         'bundleIn${productFlavor}${buildType}'
 *   //         'bundleIn${buildType}'
 *   // bundleInFreeDebug: true,
 *   // bundleInPaidRelease: true,
 *   // bundleInBeta: true,
 *
 *   // whether to disable dev mode in custom build variants (by default only disabled in release)
 *   // for example: to disable dev mode in the staging build type (if configured)
 *   devDisabledInStaging: true,
 *   // The configuration property can be in the following formats
 *   //         'devDisabledIn${productFlavor}${buildType}'
 *   //         'devDisabledIn${buildType}'
 *
 *   // the root of your project, i.e. where "package.json" lives
 *   root: "../../",
 *
 *   // where to put the JS bundle asset in debug mode
 *   jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
 *
 *   // where to put the JS bundle asset in release mode
 *   jsBundleDirRelease: "$buildDir/intermediates/assets/release",
 *
 *   // where to put drawable resources / React Native assets, e.g. the ones you use via
 *   // require('./image.png')), in debug mode
 *   resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
 *
 *   // where to put drawable resources / React Native assets, e.g. the ones you use via
 *   // require('./image.png')), in release mode
 *   resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
 *
 *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means
 *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
 *   // date; if you have any other folders that you want to ignore for performance reasons (gradle
 *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
 *   // for example, you might want to remove it from here.
 *   inputExcludes: ["android/**", "ios/**"],
 *
 *   // override which node gets called and with what additional arguments
 *   nodeExecutableAndArgs: ["node"],
 *
 *   // supply additional arguments to the packager
 *   extraPackagerArgs: []
 * ]
 */

project.ext.react = [
    // Changed from false to true from https://reactnative.dev/docs/hermes#android
    // This measurably improved Android app start time per our own benchmarks.
    // See https://gitlab.com/travelchime/itineraries/-/merge_requests/2728
    enableHermes: true,  // clean and rebuild if changing
]

apply from: "../../node_modules/react-native/react.gradle"

// Added from https://docs.expo.io/bare/installing-unimodules/#configuration-for-android
apply from: '../../node_modules/react-native-unimodules/gradle.groovy'

/**
 * Set this to true to create two separate APKs instead of one:
 *   - An APK that only works on ARM devices
 *   - An APK that only works on x86 devices
 * The advantage is the size of the APK is reduced by about 4MB.
 * Upload all the APKs to the Play Store and people will download
 * the correct one based on the CPU architecture of their device.
 */
def enableSeparateBuildPerCPUArchitecture = false

/**
 * Run Proguard to shrink the Java bytecode in release builds.
 */
def enableProguardInReleaseBuilds = false

/**
 * The preferred build flavor of JavaScriptCore.
 *
 * For example, to use the international variant, you can use:
 * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
 *
 * The international variant includes ICU i18n library and necessary data
 * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
 * give correct results when using with locales other than en-US.  Note that
 * this variant is about 6MiB larger per architecture than default.
 */
def jscFlavor = 'org.webkit:android-jsc-intl:+'

/**
 * Whether to enable the Hermes VM.
 *
 * This should be set on project.ext.react and mirrored here.  If it is not set
 * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
 * and the benefits of using Hermes will therefore be sharply reduced.
 */
def enableHermes = project.ext.react.get("enableHermes", false);

android {
    ndkVersion rootProject.ext.ndkVersion

    compileSdkVersion rootProject.ext.compileSdkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
        applicationId "com.myProject.android"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 2021101915
        versionName "2.38"
    }
    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // If true, also generate a universal APK
            include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
        }
    }
    signingConfigs {
        debug {
            storeFile file('debug.keystore')
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
        // Start added from https://reactnative.dev/docs/signed-apk-android#adding-signing-config-to-your-app-s-gradle-config
        release {
            if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
                storeFile file(MYAPP_UPLOAD_STORE_FILE)
                storePassword MYAPP_UPLOAD_STORE_PASSWORD
                keyAlias MYAPP_UPLOAD_KEY_ALIAS
                keyPassword MYAPP_UPLOAD_KEY_PASSWORD
            }
        }
        // End added
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
        release {
            // Changed based on https://reactnative.dev/docs/signed-apk-android#adding-signing-config-to-your-app-s-gradle-config
            signingConfig signingConfigs.release
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
        }
    }

    // applicationVariants are e.g. debug, release
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            // For each separate APK per architecture, set a unique version code as described here:
            // https://developer.android.com/studio/build/configure-apk-splits.html
            // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc.
            def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
            def abi = output.getFilter(OutputFile.ABI)
            if (abi != null) {  // null for the universal-debug, universal-release variants
                output.versionCodeOverride =
                        defaultConfig.versionCode * 1000 + versionCodes.get(abi)
            }
        }

    }

    // Added from https://stackoverflow.com/a/47689687/309011
    dexOptions {
        javaMaxHeapSize "4g"
    }
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    //noinspection GradleDynamicVersion
    implementation "com.facebook.react:react-native:+"  // From node_modules

    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"

    debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
      exclude group:'com.facebook.fbjni'
    }

    debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
        exclude group:'com.facebook.flipper'
        exclude group:'com.squareup.okhttp3', module:'okhttp'
    }

    debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
        exclude group:'com.facebook.flipper'
    }

    if (enableHermes) {
        def hermesPath = "../../node_modules/hermes-engine/android/";
        debugImplementation files(hermesPath + "hermes-debug.aar")
        releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
        implementation jscFlavor
    }

    // Added from https://docs.expo.io/bare/installing-unimodules/#configuration-for-android
    addUnimodulesDependencies()
}

// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
    from configurations.compile
    into 'libs'
}

apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)

// Added from https://rnfirebase.io/docs/v5.x.x/installation/android#2.-Setup-google-services.json
// and from updated https://rnfirebase.io/#configure-firebase-with-android-credentials
apply plugin: 'com.google.gms.google-services'

android/settings.gradle:

// Start added from https://docs.expo.io/bare/installing-unimodules/#configuration-for-android
apply from: '../node_modules/react-native-unimodules/gradle.groovy'
includeUnimodulesProjects()
// End added

rootProject.name = 'myProject'
apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)

MainApplication.java:

package com.myproject.android;

import android.app.Application;
import android.content.Context;
import android.webkit.WebView;

import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.imagepicker.ImagePickerPackage;
import com.facebook.react.ReactInstanceManager;

import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader;

// Start added from https://docs.expo.io/bare/installing-unimodules/#configuration-for-android
import com.myproject.android.generated.BasePackageList;

import org.unimodules.adapters.react.ModuleRegistryAdapter;
import org.unimodules.adapters.react.ReactModuleRegistryProvider;
import org.unimodules.core.interfaces.SingletonModule;
// End added

import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.List;

public class MainApplication extends Application implements ReactApplication {
  // https://docs.expo.io/bare/installing-unimodules/#configuration-for-android
  private final ReactModuleRegistryProvider mModuleRegistryProvider = new ReactModuleRegistryProvider(new BasePackageList().getPackageList(), null);

  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    @Override
    public boolean getUseDeveloperSupport() {
      return BuildConfig.DEBUG;
    }

    @Override
    protected List<ReactPackage> getPackages() {
      @SuppressWarnings("UnnecessaryLocalVariable")
      List<ReactPackage> packages = new PackageList(this).getPackages();
      // Packages that cannot be autolinked yet can be added manually here, for example:

      // Start added from https://docs.expo.io/bare/installing-unimodules/#configuration-for-android
      List<ReactPackage> unimodules = Arrays.<ReactPackage>asList(
        new ModuleRegistryAdapter(mModuleRegistryProvider)
      );
      packages.addAll(unimodules);
      // End added

      return packages;
    }

    @Override
    protected String getJSMainModuleName() {
      return "index";
    }
  };

  @Override
  public ReactNativeHost getReactNativeHost() {
    return mReactNativeHost;
  }

  @Override
  public void onCreate() {
    super.onCreate();

    SoLoader.init(this, /* native exopackage */ false);
    WebView.setWebContentsDebuggingEnabled(true);
    initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
  }

  /**
   * Loads Flipper in React Native templates. Call this in the onCreate method with something like
   * initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
   *
   * @param context
   * @param reactInstanceManager
   */
  private static void initializeFlipper(
      Context context, ReactInstanceManager reactInstanceManager) {
    if (BuildConfig.DEBUG) {
      try {
        /*
         We use reflection here to pick up the class that initializes Flipper,
         since Flipper library is not available in release mode
        */
        Class<?> aClass = Class.forName("com.myproject.android.ReactNativeFlipper");
        aClass
            .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
            .invoke(null, context, reactInstanceManager);
      } catch (ClassNotFoundException e) {
        e.printStackTrace();
      } catch (NoSuchMethodException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      } catch (InvocationTargetException e) {
        e.printStackTrace();
      }
    }
  }
}

AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  package="com.myproject.android">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

  <!--
    tools:replace="android:allowBackup" added for AztecEditor because of conflicting allowBackup setting
    inside of com.github.wordpress-mobile.WordPress-Aztec-Android:glide-loader:v1.3.44
  -->
  <application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:roundIcon="@mipmap/ic_launcher_round"
      android:allowBackup="false"
      android:theme="@style/AppTheme"
      tools:replace="android:allowBackup">
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize"
        android:launchMode="singleTask">
        <!--
          android:launchMode="singleTask" added from https://rnfirebase.io/docs/v5.x.x/links/android#Configure-Android-Project
          and should allow opening up links in existing instances of the MainActivity
          (i.e. if the app is already open, it wouldn't "reopen" the app)
        -->
        <intent-filter>
          <action android:name="android.intent.action.MAIN" />
          <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
          <action android:name="android.intent.action.VIEW" />
          <category android:name="android.intent.category.DEFAULT" />
          <category android:name="android.intent.category.BROWSABLE" />
          <data android:scheme="myproject" />
        </intent-filter>
        <intent-filter android:autoVerify="true">
          <action android:name="android.intent.action.VIEW" />
          <category android:name="android.intent.category.DEFAULT" />
          <category android:name="android.intent.category.BROWSABLE" />
          <!--
            Note that we only handle /plan/create and /plan/<ID> since all others
            are not supported in the app yet
          -->
          <data android:scheme="https" />
          <data android:scheme="http" />
          <data android:host="myproject.com" />
          <data android:host="*.myproject.com" />

          <!-- Allow for app deep links that otherwise would redirect to the app store -->
          <data android:pathPrefix="/ios/" />
          <data android:pathPrefix="/android/" />
          <data android:pathPrefix="/deepLink/" />
        </intent-filter>

        <intent-filter>
          <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
      </activity>
    </application>
</manifest>


Environment

Click To Expand

react-native info output:

System:
    OS: macOS 11.6
    CPU: (8) x64 Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz
    Memory: 85.99 MB / 16.00 GB
    Shell: 5.1.4 - /usr/local/bin/bash
  Binaries:
    Node: 14.17.4 - /var/folders/nj/3v9_4kts7_l2n0cdfxldc8bm0000gn/T/yarn--1635182312125-0.05199772079424636/node
    Yarn: 1.22.11 - /var/folders/nj/3v9_4kts7_l2n0cdfxldc8bm0000gn/T/yarn--1635182312125-0.05199772079424636/yarn
    npm: 7.24.1 - ~/.nvm/versions/node/v14.17.4/bin/npm
    Watchman: 2021.09.06.00 - /usr/local/bin/watchman
  Managers:
    CocoaPods: 1.11.2 - /usr/local/bin/pod
  SDKs:
    iOS SDK:
      Platforms: iOS 15.0, DriverKit 20.4, macOS 11.3, tvOS 15.0, watchOS 8.0
    Android SDK:
      API Levels: 29, 30
      Build Tools: 28.0.3, 29.0.2, 29.0.3, 30.0.2, 31.0.0
      System Images: android-23 | Google APIs Intel x86 Atom_64, android-24 | Google APIs Intel x86 Atom_64
      Android NDK: Not Found
  IDEs:
    Android Studio: 4.2 AI-202.7660.26.42.7351085
    Xcode: 13.0/13A233 - /usr/bin/xcodebuild
  Languages:
    Java: 1.8.0_292 - /usr/bin/javac
  npmPackages:
    @react-native-community/cli: Not Found
    react: 17.0.1 => 17.0.1
    react-native: 0.64.2 => 0.64.2
    react-native-macos: Not Found
  npmGlobalPackages:
    *react-native*: Not Found
  • Platform that you're experiencing the issue on:
    • iOS
    • Android
    • iOS but have not tested behavior on Android
    • Android but have not tested behavior on iOS
    • Both
  • react-native-firebase version you're using that has this issue:
    • 12.8.0
  • Firebase module(s) you're using that has the issue:
    • @react-native-firebase/dynamic-links
  • Are you using TypeScript?
    • Yes: 4.0


@hsource hsource added help: needs-triage Issue needs additional investigation/triaging. type: bug New bug report labels Oct 25, 2021
@hsource hsource changed the title 🔥 [🐛] On Android, calls to getAppStartupDeepLinkUrl() cause an ObjectAlreadyConsumedException [🐛] 🔥 On Android, calls to getAppStartupDeepLinkUrl() cause an ObjectAlreadyConsumedException Oct 25, 2021
@mikehardy
Copy link
Collaborator

Great report, thanks @hsource
This is related to #5593 which was first released in react-native-firebase v12.6.0, so it will affect all versions between v12.6.0 and current (12.9.3 IIRC)
I think I've got a patch ready will post in a moment

mikehardy added a commit that referenced this issue Oct 25, 2021
put the UTM Parameters initialization local to where it may be used,
this way regardless of execution path it's always fresh and will
not be consumed twice

Fixes #5812
mikehardy added a commit that referenced this issue Oct 25, 2021
put the UTM Parameters initialization local to where it may be used,
this way regardless of execution path it's always fresh and will
not be consumed twice

Fixes #5812
@mikehardy
Copy link
Collaborator

You can find a downloadable patch-package patch set here until this is released, I'd love to hear feedback on it if you test integrate this prior to release https://github.com/invertase/react-native-firebase/actions/runs/1382454301

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help: needs-triage Issue needs additional investigation/triaging. type: bug New bug report
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants