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 eb1ec14d..b1642765 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 e14275c4..ccaa2218 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",