I can’t get my app to work in Testflight after upgrading from Expo SDK 44 (expo build) to SDK 47 with EAS. So far, I got the app working in Expo. But when I build with EAS and try to run it, it crashes after the splash screen.
Crash log mentions EXUpdatesErrorRecovery.m but a search on the internet so far only learned me it can be anything.
Trace
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Triggered by Thread: 2
Last Exception Backtrace:
0 CoreFoundation 0x18da4de88 __exceptionPreprocess + 164 (NSException.m:202)
1 libobjc.A.dylib 0x186d838d8 objc_exception_throw + 60 (objc-exception.mm:356)
2 MetarTaf 0x102d8b3bc -[EXUpdatesAppController throwException:] + 24 (EXUpdatesAppController.m:485)
3 MetarTaf 0x102d9cbd8 -[EXUpdatesErrorRecovery _crash] + 768 (EXUpdatesErrorRecovery.m:268)
4 MetarTaf 0x102d9c420 -[EXUpdatesErrorRecovery _runNextTask] + 200 (EXUpdatesErrorRecovery.m:184)
5 libdispatch.dylib 0x19501c4b4 _dispatch_call_block_and_release + 32 (init.c:1518)
6 libdispatch.dylib 0x19501dfdc _dispatch_client_callout + 20 (object.m:560)
7 libdispatch.dylib 0x195025694 _dispatch_lane_serial_drain + 672 (inline_internal.h:2632)
8 libdispatch.dylib 0x1950261e0 _dispatch_lane_invoke + 384 (queue.c:3940)
9 libdispatch.dylib 0x195030e10 _dispatch_workloop_worker_thread + 652 (queue.c:6846)
10 libsystem_pthread.dylib 0x1daaa3df8 _pthread_wqthread + 288 (pthread.c:2618)
11 libsystem_pthread.dylib 0x1daaa3b98 start_wqthread + 8 (:-1)
Hardware used (iPhone 13)
Incident Identifier: A562E67E-ABF6-4196-B5DD-ACED79363679
Hardware Model: iPhone14,5
Process: -- [16963]
Path: --
Identifier: --
Version: 2.4.0 (2.4.5)
AppStoreTools: 14C17
AppVariant: 1:iPhone14,5:16
Beta: YES
Code Type: ARM-64 (Native)
Role: Foreground
Parent Process: launchd [1]
Coalition: -- [2764]
Date/Time: 2023-01-28 11:53:14.2711 +0100
Launch Time: 2023-01-28 11:53:13.6737 +0100
OS Version: iPhone OS 16.1.1 (20B101)
Release Type: User
Baseband Version: 2.12.02
Report Version: 104
Packages.json
.. "dependencies": {
"@react-native-async-storage/async-storage": "~1.17.3",
"@react-native-clipboard/clipboard": "^1.11.1",
"@react-navigation/material-bottom-tabs": "^6.2.11",
"@react-navigation/material-top-tabs": "^6.5.2",
"@react-navigation/native-stack": "^6.9.8",
"deprecated-react-native-prop-types": "^4.0.0",
"expo": "^47.0.0",
"expo-application": "~5.0.1",
"expo-constants": "~14.0.2",
"expo-device": "~5.0.0",
"expo-file-system": "~15.1.1",
"expo-font": "~11.0.1",
"expo-linking": "~3.3.0",
"expo-localization": "~14.0.0",
"expo-location": "~15.0.1",
"expo-notifications": "~0.17.0",
"expo-speech": "~11.0.0",
"expo-status-bar": "~1.4.2",
"expo-store-review": "~6.0.0",
"expo-system-ui": "~2.0.1",
"expo-updates": "~0.15.6",
"react": "18.1.0",
"react-dom": "18.1.0",
"react-native": "0.70.5",
"react-native-elements": "^3.4.3",
"react-native-gesture-handler": "~2.8.0",
"react-native-pager-view": "6.0.1",
"react-native-paper": "^4.12.5",
"react-native-popup-menu": "^0.15.13",
"react-native-root-toast": "^3.3.1",
"react-native-safe-area-context": "4.4.1",
"react-native-screens": "~3.18.0",
"react-native-stack": "^1.0.0-alpha11",
"react-native-svg": "13.4.0",
"react-native-swipeable": "^0.6.0",
"react-native-tab-view": "^3.3.4",
"react-native-vector-icons": "^9.2.0",
"react-native-web": "~0.18.7",
"react-native-webview": "11.23.1",
"react-navigation": "^4.4.4" }, "devDependencies": {
"@babel/core": "^7.19.3",
"typescript": "^4.6.3" }, ..
UPDATE:
When the crash occurs, I find some errors in the XCode console that I have already solved in my local environment.
To do so, I had to hack into node_modules for react-native-swipeable and react-native itself, per the instructions listed here: Invariant Violation: ViewPropTypes has been removed from React Native. Migrate to ViewPropTypes exported from 'deprecated-react-native-prop-types'
Invariant Violation: ViewPropTypes has been removed from React Native. Migrate to ViewPropTypes exported from 'deprecated-react-native-prop-types'.
Unhandled JS Exception: Invariant Violation: ViewPropTypes has been removed from React Native. Migrate to ViewPropTypes exported from 'deprecated-react-native-prop-types'.
..
Invariant Violation: Failed to call into JavaScript module method AppRegistry.runApplication(). Module has not been registered as callable. Registered callable JavaScript modules (n = 11): Systrace, JSTimers, HeapCapture, SamplingProfiler, RCTLog, RCTDeviceEventEmitter, RCTNativeAppEventEmitter, GlobalPerformanceLogger, JSDevSupportModule, HMRClient, RCTEventEmitter.
A frequent cause of the error is that the application entry file path is incorrect. This can also happen when the JS bundle is corrupt or there is an early initialization error when loading React Native.
It seems that EAS is trying to build the application with a different node_modules directory.
Hope anyone can help me with it.
2
Answers
EAS maintains its own copy of node_modules. So altering scripts in local node_modules will have no effect for the production build.
Both the react-native package (0.70.5) and react-native-swipeable (0.6.0) are not properly maintained and don't work as they are released. They still use ViewPropTypes that have been dropped from React Native. There is a workaround by using the deprecated-react-native-prop-types package.
To use the deprecated proptypes package, you need to manually alter node_modules. But those changes aren't sent to EAS.
Patch-package takes care of that, by replaying changes you made on the server-side as well.
Per its documentation I installed patch-package (see https://www.npmjs.com/package/patch-package). First added the post-install hook in app.json:
Then I installed the npm package:
Next I registered the patched packages:
And started a new EAS build with clear cache, to be sure:
You can check the Expo > Build Details > Prebuild to see if the patches are applied remotely:
Hope this helps anyone with the same issue.
Any how you need to implement the patches.
In my case there were the four libraries I added the patches for all of them and it works for me.