From 911a995c6aa1f18d551686f1947df3b8f13af036 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 14 Mar 2026 22:35:55 +0000 Subject: [PATCH 1/2] Initial plan From 3372a93f71f76d0dacb9c41458240b4146e33d9f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 14 Mar 2026 22:50:29 +0000 Subject: [PATCH 2/2] fix(mobile): resolve iOS build errors by enabling buildReactNativeFromSource for Expo SDK 54 Expo SDK 54 switched to precompiled React Native XCFrameworks by default for faster iOS builds. However, the precompiled frameworks do not expose legacy bridge headers (RCTBridge, RCTViewManager, RCTSurfaceHostingProxyRootView, RCTPackagerConnection, RCTDevSettings.isDebuggingRemotely, rootViewFactory) that some native modules (e.g. expo-dev-client) still reference. Add expo-build-properties (v1.0.10, the SDK 54-compatible version) and configure buildReactNativeFromSource: true for iOS. This compiles React Native from source, making all native headers available to linked modules and resolving the Xcode compilation errors seen in the EAS production build. Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com> --- docs/MobileApp.md | 2 ++ mobile/app.json | 8 +++++++ mobile/package-lock.json | 48 ++++++++++++++++++++++++++++++++++++++++ mobile/package.json | 1 + 4 files changed, 59 insertions(+) diff --git a/docs/MobileApp.md b/docs/MobileApp.md index 92e92383..3736542b 100644 --- a/docs/MobileApp.md +++ b/docs/MobileApp.md @@ -53,6 +53,8 @@ eas build --platform ios eas build --platform android ``` +> **Note:** The mobile app uses `expo-build-properties` with `buildReactNativeFromSource: true` for iOS builds. This is required for Expo SDK 54 (React Native 0.81) compatibility — some native modules still use legacy bridge APIs (`RCTBridge`, `RCTViewManager`, etc.) that are no longer included in the default precompiled XCFrameworks. Building React Native from source makes these headers available, at the cost of slightly longer iOS build times. + See the [EAS Build documentation](https://docs.expo.dev/build/introduction/) for full setup instructions. ## Authentication diff --git a/mobile/app.json b/mobile/app.json index 97d8dfd9..7cc083c7 100644 --- a/mobile/app.json +++ b/mobile/app.json @@ -46,6 +46,14 @@ }, "plugins": [ "expo-router", + [ + "expo-build-properties", + { + "ios": { + "buildReactNativeFromSource": true + } + } + ], [ "expo-notifications", { diff --git a/mobile/package-lock.json b/mobile/package-lock.json index 81c630c7..9a29fb8e 100644 --- a/mobile/package-lock.json +++ b/mobile/package-lock.json @@ -15,6 +15,7 @@ "@react-navigation/native-stack": "^7.2.0", "expo": "~54.0.0", "expo-auth-session": "~7.0.10", + "expo-build-properties": "~1.0.10", "expo-camera": "~17.0.10", "expo-constants": "~18.0.13", "expo-crypto": "~15.0.8", @@ -6782,6 +6783,53 @@ "react-native": "*" } }, + "node_modules/expo-build-properties": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/expo-build-properties/-/expo-build-properties-1.0.10.tgz", + "integrity": "sha512-mFCZbrbrv0AP5RB151tAoRzwRJelqM7bCJzCkxpu+owOyH+p/rFC/q7H5q8B9EpVWj8etaIuszR+gKwohpmu1Q==", + "license": "MIT", + "dependencies": { + "ajv": "^8.11.0", + "semver": "^7.6.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-build-properties/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/expo-build-properties/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/expo-build-properties/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/expo-camera": { "version": "17.0.10", "resolved": "https://registry.npmjs.org/expo-camera/-/expo-camera-17.0.10.tgz", diff --git a/mobile/package.json b/mobile/package.json index 51636722..3764948f 100644 --- a/mobile/package.json +++ b/mobile/package.json @@ -24,6 +24,7 @@ "@react-navigation/native-stack": "^7.2.0", "expo": "~54.0.0", "expo-auth-session": "~7.0.10", + "expo-build-properties": "~1.0.10", "expo-dev-client": "~6.0.20", "expo-font": "~14.0.0", "expo-camera": "~17.0.10",