EAS Update - Could not get BatchedBridge

I’m on SDK 46, managed workflow, with eas-cli version 2.1.0. I’m testing on a real iphone device (still on iOS15).
I built a dev-client and my app runs fine using npx expo start --dev-client. However, when I try to load an update through the Extensions / EAS Updates tab then it fails immediately with the below error.

I have just recently moved to EAS Update, and I believe I had it working at one point but now for the past couple weeks I always get this error. I made a lot of changes to my project between then and now, so it’s hard to deduce which change may have done something. For example, I set up an app variant (this error happens regardless of setting app variant or not), and split out app.config.js from app.json. Let me know if that could cause something like this?

There was a problem loading the project.
This development build encountered the following error:

Could not get BatchedBridge, make sure your bundle is packaged correctly.

Here is my eas.json:

{
  "cli": {
    "version": ">= 0.39.0"
  },
  "build": {
    "dev": {
      "developmentClient": true,
      "distribution": "internal",
      "channel": "dev",
      "env": {
        "APP_VARIANT": "prod"
      },
      "cache": {
        "key": "Invalidate"
      }
    },
    "test": {
      "channel": "test-307"
    },
    "prod": {
      "channel": "prod-307"
    }
  },
  "submit": {
    "prod": {
      "android": {
        "serviceAccountKeyPath": "pc-api-xxxxxx.json",
        "track": "production"
      },
      "ios": {
        "appleId": "email@email.com",
        "ascAppId": "xxxxxx",
        "appleTeamId": "XXXXXX",
        "sku": "myapp"
      }
    },
    "test": {
      "extends": "prod",
      "android": {
        "track": "internal"
      }
    }
  }
}

My app.json:

{
  "react-native-google-mobile-ads": {
    "android_app_id": "ca-app-pub-xxxxx",
    "ios_app_id": "ca-app-pub-xxxxx"
  }
}

And my app.config.js:

const APP_VARIANT = process.env.APP_VARIANT;
const IS_DEV = APP_VARIANT === 'dev';
const bundleId = IS_DEV ? 'com.myapp.dev' : 'com.myapp';

export default {
  expo: {
    name: IS_DEV ? "Myapp (Dev)" : "Myapp",
    slug: "myapp",
    privacy: "public",
    platforms: [
      "ios",
      "android"
    ],
    jsEngine: "hermes",
    version: "3.0.7",
    scheme: bundleId,
    userInterfaceStyle: "automatic",
    notification: {
      icon: "./assets/images/icon-96-greyscale.png",
      color: "#F7D52F",
      iosDisplayInForeground: true
    },
    icon: "./assets/images/icon-1024.png",
    splash: {
      image: "./assets/images/myapp.png",
      resizeMode: "contain",
      backgroundColor: "#ffffff"
    },
    androidStatusBar: {
      translucent: true
    },
    updates: {
      fallbackToCacheTimeout: 30000,
      url: "https://u.expo.dev/1d27e76f-f0a5-45e2-a8ba-d35fdbae9053"
    },
    assetBundlePatterns: [
      "**/*"
    ],
    developmentClient: {
      silentLaunch: false
    },
    ios: {
      supportsTablet: true,
      requireFullScreen: true,
      config: {
        usesNonExemptEncryption: false
      },
      bundleIdentifier: bundleId,
      buildNumber: "3.0.7.0",
      infoPlist: {
        "NSLocationWhenInUseUsageDescription": "Allow app to use location for the purpose of loading weather conditions at your location.",
        "NSPhotoLibraryUsageDescription": "Allow app to use photos to be able to set a background image and images for each family member.",
        "NSCalendarsUsageDescription": "Allow app to show your iOS calendar events in this view. You can disable this later in your app Settings if desired.",
        "NSRemindersUsageDescription": "Allow app to integrate your iOS reminder events in with app calendar events.",
        "NSUserTrackingUsageDescription": "This will be used to deliver personalized ads to you.",
        "NSContactsUsageDescription": "Allow app to access your contacts so you can send event reminders to them."
      },
      appStoreUrl: "https://apps.apple.com/us/app/xxxx",
      googleServicesFile: IS_DEV ? "./GoogleService-Info-dev.plist" : "./GoogleService-Info.plist"
    },
    android: {
      package: bundleId,
      versionCode: 3070,
      permissions: [
        "READ_CALENDAR",
        "WRITE_CALENDAR",
        "READ_EXTERNAL_STORAGE",
        "WRITE_EXTERNAL_STORAGE",
        "ACCESS_COARSE_LOCATION",
        "ACCESS_FINE_LOCATION",
        "FOREGROUND_SERVICE",
        "BILLING",
        "READ_CONTACTS",
        "WRITE_CONTACTS"
      ],
      adaptiveIcon: {
        foregroundImage: "./assets/images/icon-foreground-1024.png",
        backgroundImage: "./assets/images/icon-background-1024.png",
        backgroundColor: "#FFFFFF"
      },
      softwareKeyboardLayoutMode: "resize",
      playStoreUrl: "https://play.google.com/store/apps/details?id=com.myapp",
      googleServicesFile: IS_DEV ? "./google-services-dev.json" : "./google-services.json"
    },
    description: "",
    hooks: {
      postPublish: [
        {
          file: "sentry-expo/upload-sourcemaps",
          config: {
            organization: "me",
            project: "myapp",
            authToken: "xxxxxx"
          }
        }
      ]
    },
    plugins: [
      "sentry-expo",
      [
        "expo-build-properties",
        {
          "ios": {
            "useFrameworks": "static"
          }
        }
      ]
    ],
    extra: {
      eas: {
        projectId: "1d27e76f-f0a5-45e2-a8ba-d35fdbae9053"
      },
      appVariant: APP_VARIANT,
      isDevVariant: IS_DEV
    },
    runtimeVersion: {
      policy: "sdkVersion"
    }
  }
}

Let me know if there’s any other files that might help give a clue. Any help would be greatly appreciated!

I forgot to mention, this only happens with iOS. On Android I can load and run updates fine in the dev-client.

hi there! it’s hard to say what may be wrong without more context. could you try narrowing it down further? this might help: fyi/manual-debugging.md at main · expo/fyi · GitHub

I got the same error with the new SDK46 on iOS:

*** Terminating app due to uncaught exception 'RCTFatalException: Could not get BatchedBridge, make sure your bundle is packaged correctly', reason: 'Could not get BatchedBridge, make sure your bundle is packaged correctly'

this happens on an EAS build, after installing it on device.

it does work okay with the dev-client build on simulator.

just a guess at the moment… but useFrameworks is not supported by hermes as far as i know… chance that thats why it fails… i’ll remove useframeworks and revert the packages to the previous versions … then hopefully i can confirm…

right, so i can confirm that useframework doesnt work with hermes, or at least after i removed that and the lib that required it, the build works okay on EAS and runs on device.

Thanks for narrowing that down @artanis99 ! Unfortunately, I had useFrameworks in there for FirebaseAnalytics (FirebaseAnalytics - Expo Documentation) and without it I kept running into build errors for that library. Does this mean essentially that FirebaseAnalytics won’t work with Hermes?

Just downgrade firebase to 14.x, that doesnt need useframework. Thats what i did.

It looks like expo-firebase-analytics is on version 7.2.0 and not sure if there’s some previous version that works with hermes. I did see out there where a workaround for react-native-firebase and the use_frameworks! issue was to downgrade from 15 to 14, but I’m not using that library.

I ended up going back to the library I was using before for analytics, expo-analytics (which unfortunately only integrates with Google Universal Analytics instead of the newer Google Analytics 4), and found a fork someone made that fixed the issues with the latest Expo SDK: Not compatible with Expo SDK44 · Issue #81 · betaacid/expo-analytics · GitHub
Not ideal in any way, but will at least allow analytics to continue to work and hopefully will just be temporary until use_frameworks and hermes gets sorted out in a future version of RN/Expo (Road to 0.69.0 · Discussion #21 · reactwg/react-native-releases · GitHub)

1 Like

right, im using rnfirebase, not expo firebase.

This topic was automatically closed 20 days after the last reply. New replies are no longer allowed.