Upgrade app to Expo SDK 57#77
Conversation
Co-Authored-By: Nader Dabit <dabit3@gmail.com>
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
There was a problem hiding this comment.
Devin Review found 7 potential issues.
⚠️ 1 issue in files not directly in the diff
⚠️ Temporary cache file accidentally committed to the repository (app/app.json.ncM01fCIoImSNOk7oHvu9SQ_RDZXzJa9-5eKVgu4N6A:1)
A zero-byte file with a content-hash suffix is added to the repository (app/app.json.ncM01fCIoImSNOk7oHvu9SQ_RDZXzJa9-5eKVgu4N6A), so the repo contains junk that should not be tracked.
Impact: Repository contains an unintended empty file that clutters the project.
There was a problem hiding this comment.
🔍 PrivacyInfo.xcprivacy removed from iOS project
The app-level PrivacyInfo.xcprivacy file was deleted and its references removed from the Xcode project (app/ios/app.xcodeproj/project.pbxproj). Apple requires privacy manifests for App Store submissions. The Podfile at app/ios/Podfile:52 still has privacy_file_aggregation_enabled which aggregates privacy manifests from CocoaPods dependencies, but the app's own privacy manifest (declaring usage of UserDefaults, FileTimestamp, DiskSpace, and SystemBootTime APIs) is gone. If the app itself uses these APIs (not just through pods), this could cause App Store rejection. Verify whether Expo SDK 57 now handles the app-level privacy manifest generation automatically.
Was this helpful? React with 👍 or 👎 to provide feedback.
There was a problem hiding this comment.
SDK 57 handles privacy manifests via aggregation at pod install time (privacy_file_aggregation_enabled in the Podfile) — the standalone app-level PrivacyInfo.xcprivacy is no longer part of the prebuild template.
There was a problem hiding this comment.
🔍 Xcode project removes Pods xcconfig base configurations and several build phases
The Xcode project at app/ios/app.xcodeproj/project.pbxproj removes baseConfigurationReference for both Debug and Release build configurations (previously pointing to Pods-app.debug.xcconfig and Pods-app.release.xcconfig), removes the [Expo] Configure project build phase, and removes the [CP] Embed Pods Frameworks build phase. This suggests a shift in how CocoaPods integration works with the new Expo SDK. The [CP] Check Pods Manifest.lock and [CP] Copy Pods Resources phases are retained. Without the base xcconfig references, pod-provided build settings (header search paths, linker flags, etc.) may not be inherited unless the new Expo SDK handles this differently (e.g., via SPM or a different integration mechanism). The Podfile.lock was also deleted, which means pod install must be run before building.
Was this helpful? React with 👍 or 👎 to provide feedback.
There was a problem hiding this comment.
This reflects the stock SDK 57 Xcode template from expo prebuild --clean; CocoaPods integration (xcconfig references, embed phases) is re-added by pod install, which also regenerates Podfile.lock.
| <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="SplashScreen" translatesAutoresizingMaskIntoConstraints="NO" id="EXPO-SplashScreen" userLabel="SplashScreen"> | ||
| <rect key="frame" x="146.66666666666666" y="381" width="100" height="90.333333333333314"/> |
There was a problem hiding this comment.
🔴 Splash screen image missing on iOS because the image asset was deleted without a replacement
The splash screen image asset is removed (SplashScreenLegacy.imageset deleted at app/ios/app/Images.xcassets/SplashScreenLegacy.imageset/Contents.json) but the storyboard still references an image named SplashScreen (app/ios/app/SplashScreen.storyboard:21), and the resources section declares a different name SplashScreenLogo (app/ios/app/SplashScreen.storyboard:42), so the iOS splash screen will display a blank view with no logo.
Impact: Users see a blank white splash screen on iOS app launch instead of the expected logo.
Image name mismatch and missing asset details
The imageView at line 21 uses image="SplashScreen" but the <resources> block at line 42 declares <image name="SplashScreenLogo"...>. These names are inconsistent with each other. More critically, neither a SplashScreen.imageset nor a SplashScreenLogo.imageset exists in app/ios/app/Images.xcassets/ — the only remaining items are AppIcon.appiconset and Contents.json. The old SplashScreenLegacy.imageset was deleted in this PR but no replacement image asset was added.
At runtime, iOS resolves the image by the image attribute on the imageView (SplashScreen), looking it up in the asset catalog. Since no such asset exists, the imageView will render empty.
Prompt for agents
The SplashScreen.storyboard references an image named 'SplashScreen' in the imageView (line 21) and 'SplashScreenLogo' in the resources section (line 42), but neither image asset exists in the Xcode asset catalog (app/ios/app/Images.xcassets/). The old SplashScreenLegacy.imageset was deleted without adding a replacement.
To fix this:
1. Add a new imageset to app/ios/app/Images.xcassets/ — either named 'SplashScreen' (matching the imageView's image attribute) or 'SplashScreenLogo' (matching the resources declaration), and update the other reference to be consistent.
2. Include the actual splash screen PNG files (1x, 2x, 3x) in the new imageset.
3. Make sure the image attribute on the imageView in line 21 and the image name in the resources block on line 42 use the same name.
Was this helpful? React with 👍 or 👎 to provide feedback.
There was a problem hiding this comment.
Confirmed and fixed. The missing imageset was caused by the deprecated splash field in app.json no longer generating iOS assets in SDK 57. Moved the splash config to the expo-splash-screen config plugin and re-ran expo prebuild --clean — SplashScreenLogo.imageset and SplashScreenBackground.colorset are now generated and the storyboard references are consistent.
| reactNativeDelegate = delegate | ||
| reactNativeFactory = factory |
There was a problem hiding this comment.
🔍 bindReactNativeFactory call removed from iOS AppDelegate
The old AppDelegate called bindReactNativeFactory(factory) after creating the ExpoReactNativeFactory, but the new code at app/ios/app/AppDelegate.swift:20-21 stores the factory in instance variables without calling bindReactNativeFactory. This is likely an intentional Expo SDK 57 API change where the binding is handled internally by ExpoReactNativeFactory or startReactNative, but it's worth confirming that Expo modules (e.g., expo-splash-screen, expo-updates) still receive the factory reference they need to function.
Was this helpful? React with 👍 or 👎 to provide feedback.
There was a problem hiding this comment.
This is the stock SDK 57 template AppDelegate generated by expo prebuild --clean — the factory binding is now handled internally by ExpoReactNativeFactory/startReactNative in the new template.
| "@expo/vector-icons": "^15.0.3", | ||
| "@gorhom/bottom-sheet": "^5.2.14", | ||
| "@react-native-async-storage/async-storage": "3.1.1", | ||
| "@react-native-async-storage/async-storage": "2.2.0", |
There was a problem hiding this comment.
🔍 AsyncStorage version downgraded from 3.1.1 to 2.2.0
The @react-native-async-storage/async-storage dependency was changed from 3.1.1 to 2.2.0 at app/package.json:18. This is a major version downgrade (3.x → 2.x), which is unusual in an SDK upgrade PR. This could be intentional if Expo SDK 57 doesn't yet support AsyncStorage v3, but it may also introduce API incompatibilities or missing features if the codebase was relying on v3 APIs.
Was this helpful? React with 👍 or 👎 to provide feedback.
There was a problem hiding this comment.
Intentional: npx expo install --fix pins the SDK 57-supported versions — async-storage 2.2.0, gesture-handler 2.32.0, get-random-values 1.11.0. The app only uses the basic getItem/setItem API, which is unchanged.
| <style name="Theme.App.SplashScreen" parent="AppTheme"> | ||
| <item name="android:windowBackground">@drawable/splashscreen_logo</item> |
There was a problem hiding this comment.
🔍 Android splash screen approach changed from Android 12 API to windowBackground
The Android splash screen theme at app/android/app/src/main/res/values/styles.xml:8-9 changed from using Theme.SplashScreen parent with windowSplashScreenAnimatedIcon (Android 12+ splash screen API) to using AppTheme parent with android:windowBackground. The old approach centered the icon using the system splash screen API; the new approach sets the entire window background to the drawable. Since splashscreen_logo.png is a logo image (not a full-screen background), using it as android:windowBackground will stretch/tile it to fill the screen rather than centering it. This may be intentional if expo-splash-screen now handles the centering programmatically, but it's worth verifying the visual result.
Was this helpful? React with 👍 or 👎 to provide feedback.
There was a problem hiding this comment.
Fixed — this was a side effect of the legacy splash config in app.json. After moving to the expo-splash-screen config plugin and regenerating, Theme.App.SplashScreen again uses the Android 12+ Theme.SplashScreen parent with windowSplashScreenAnimatedIcon.
… remove stray temp file Co-Authored-By: Nader Dabit <dabit3@gmail.com>
Summary
Upgrades
app/from Expo SDK 54 → 57 (latest stable), aligning all dependencies vianpx expo install --fix:expo54.0.35 → 57.0.4,react-native0.81.5 → 0.86.0,react/react-dom19.1.0 → 19.2.3,typescript→ 6.0.3expo-*modules moved to the SDK 57 unified versioning (~57.0.x)react-native-worklets@~0.10.0(new peer dep ofexpo-modules-core/reanimated4.5)@react-native-async-storage/async-storage3.1.1 → 2.2.0,react-native-gesture-handler3.0.2 → 2.32.0,react-native-get-random-values2.0.0 → 1.11.0 (these are the SDK 57-supported versions)android/andios/vianpx expo prebuild --clean(RN 0.86 native template).ios/Podfile.lockwas removed by prebuild and will be regenerated on the nextpod install(macOS only)ColorSchemeNamenow includes'unspecified', sogetThemeinapp/src/theme.tsaccepts itVerified:
tsc --noEmit,expo lint, andexpo export --platform weball pass.Link to Devin session: https://app.devin.ai/sessions/948670b311474be4be99f8912d7d85a5
Requested by: @dabit3
Devin Review