Skip to content

Commit 3a22693

Browse files
peachbitsclaude
andcommitted
iOS: build and run under React Native 0.86 / Expo SDK 57 / Xcode 26
Expo autolinking + new-architecture Podfile (deployment target 16.4), the ExpoReactNativeFactory AppDelegate, and RCTNewArchEnabled in Info.plist. Includes the build fixes needed under Xcode 26. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent bcc2c96 commit 3a22693

5 files changed

Lines changed: 1203 additions & 1033 deletions

File tree

ios/Podfile

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,20 @@ require_relative '../node_modules/react-native-permissions/scripts/setup'
1313
$RNFirebaseAnalyticsWithoutAdIdSupport = true
1414
$RNFirebaseAsStaticFramework = true
1515

16-
# The min_ios_version_supported is iOS 13.4 for RN 74:
17-
# However any device that can use iOS 13.4 can also upgrade to iOS 15.6 which
18-
# is still supported by the latest version of Xcode for debugging
19-
ios_platform_version = '15.6'
16+
# Expo SDK 57 / React Native 0.86 require a minimum deployment target of iOS 16.4.
17+
ios_platform_version = '16.4'
2018
platform :ios, ios_platform_version
19+
20+
# Pin the React/Hermes pairing so pod install is deterministic regardless of
21+
# the machine's environment: Hermes V1 (the RN/Expo default engine, and what
22+
# Edge already ships) with React-Core built from source. Do NOT enable
23+
# RCT_USE_PREBUILT_RNCORE: the 0.86.0 prebuilt React-Core binary is built
24+
# against the non-V1 jsi ABI (jsi::Runtime vs V1's jsi::IRuntime), and pairing
25+
# it with the V1 hermesvm artifact crashes at launch with
26+
# "Symbol not found: facebook::jsi::Array::createWithElements".
27+
ENV['RCT_USE_PREBUILT_RNCORE'] = '0'
28+
ENV['RCT_HERMES_V1_ENABLED'] = '1'
29+
2130
prepare_react_native_project!
2231

2332
# Edge addition:
@@ -44,7 +53,25 @@ target 'edge' do
4453
Pod::UI.warn e
4554
end
4655
end
47-
config = use_native_modules!
56+
# Expo SDK 56 autolinking: feed expo's unified native-module config (which
57+
# registers ExpoModulesCore + expo modules + RN community modules) into
58+
# use_native_modules!.
59+
if ENV['EXPO_USE_COMMUNITY_AUTOLINKING'] == '1'
60+
config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"]
61+
else
62+
config_command = [
63+
'node',
64+
'--no-warnings',
65+
'--eval',
66+
'require(\'expo/bin/autolinking\')',
67+
'expo-modules-autolinking',
68+
'react-native-config',
69+
'--json',
70+
'--platform',
71+
'ios'
72+
]
73+
end
74+
config = use_native_modules!(config_command)
4875

4976
use_react_native!(
5077
:path => config[:reactNativePath],
@@ -61,6 +88,20 @@ target 'edge' do
6188
target.build_configurations.each do |config|
6289
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = ios_platform_version
6390

91+
# Allow non-modular includes (e.g. @react-native-firebase headers that
92+
# include <React/RCTConvert.h>) under use_frameworks! + Xcode 26's strict
93+
# explicit-modules scanning, which otherwise errors on RNFBApp.
94+
config.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
95+
96+
# @react-native-firebase wrappers import React/Firebase headers
97+
# textually (#import, not @import). Under clang modules + use_frameworks
98+
# on Xcode 26 this fails ("RCTPromiseRejectBlock must be imported from
99+
# module RNFBApp.RNFBAppModule"). Build the RNFB pods without modules so
100+
# their textual imports resolve directly.
101+
if target.name.start_with?('RNFB')
102+
config.build_settings['CLANG_ENABLE_MODULES'] = 'NO'
103+
end
104+
64105
# Xcode 17+ / iOS 26 SDK workaround: Re-enable std::allocator<const T>
65106
# which was removed for stricter C++ standard compliance.
66107
# See: https://github.com/getsentry/sentry-cocoa/issues/5172

0 commit comments

Comments
 (0)