Native project upgrade helper

Edit this page

View file-by-file diffs of all the changes you need to make to your native projects to upgrade them to the next Expo SDK version.


If you manage your native projects (previously known as bare workflow), to upgrade to the latest Expo SDK, you have to make changes to your native projects. It can be a complex process to find which native file changes and what to update in which file.

The following guide provides diffs to compare native project files between your project's current SDK version and the target SDK version you want to upgrade. You can use them to make changes to your project depending on the expo package version your project uses. The tools on this page are similar to React Native Upgrade Helper. However, they are oriented around projects that use Expo modules and related tooling.

Interested in avoiding upgrading native code altogether? See Continuous Native Generation (CNG) to learn how Expo Prebuild can generate your native projects before a build.

Upgrade native project files

Once you have upgraded your Expo SDK version and related dependencies, use the diff tool below to learn about changes you need to make to your native project and bring them up to date with the current Expo SDK version.

Choose your from SDK version and to SDK version to see the generated diff. Then, apply those changes to your native projects by copying and pasting or manually making changes to the project files.

From SDK version:

To SDK version:

Native code changes from SDK 52 to 53

android/app/build.gradle
MODIFIED
1414 hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc"
1515 codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()
1616
17 enableBundleCompression = (findProperty('android.enableBundleCompression') ?: false).toBoolean()
1718 // Use Expo CLI to bundle the app, this ensures the Metro config
1819 // works correctly with Expo projects.
1920 cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim())
7879 * give correct results when using with locales other than en-US. Note that
7980 * this variant is about 6MiB larger per architecture than default.
8081 */
81def jscFlavor = 'org.webkit:android-jsc:+'
82def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+'
8283
8384android {
8485 ndkVersion rootProject.ext.ndkVersion
156157
157158 if (isGifEnabled) {
158159 // For animated gif support
159 implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}")
160 implementation("com.facebook.fresco:animated-gif:${expoLibs.versions.fresco.get()}")
160161 }
161162
162163 if (isWebpEnabled) {
163164 // For webp support
164 implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}")
165 implementation("com.facebook.fresco:webpsupport:${expoLibs.versions.fresco.get()}")
165166 if (isWebpAnimatedEnabled) {
166167 // Animated webp support
167 implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}")
168 implementation("com.facebook.fresco:animated-webp:${expoLibs.versions.fresco.get()}")
168169 }
169170 }
170171
android/app/src/main/res/values/styles.xml
MODIFIED
11<resources>
2 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
3 <item name="android:textColor">@android:color/black</item>
4 <item name="android:editTextStyle">@style/ResetEditText</item>
2 <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
53 <item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
64 </style>
7 <style name="ResetEditText" parent="@android:style/Widget.EditText">
8 <item name="android:padding">0dp</item>
9 <item name="android:textColorHint">#c8c8c8</item>
10 <item name="android:textColor">@android:color/black</item>
11 </style>
125 <style name="Theme.App.SplashScreen" parent="AppTheme">
136 <item name="android:windowBackground">@drawable/splashscreen_logo</item>
147 </style>
android/build.gradle
MODIFIED
11// Top-level build file where you can add configuration options common to all sub-projects/modules.
22
33buildscript {
4 ext {
5 buildToolsVersion = findProperty('android.buildToolsVersion') ?: '35.0.0'
6 minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '24')
7 compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '35')
8 targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34')
9 kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.25'
10
11 ndkVersion = "26.1.10909125"
12 }
13 repositories {
14 google()
15 mavenCentral()
16 }
17 dependencies {
18 classpath('com.android.tools.build:gradle')
19 classpath('com.facebook.react:react-native-gradle-plugin')
20 classpath('org.jetbrains.kotlin:kotlin-gradle-plugin')
21 }
4 repositories {
5 google()
6 mavenCentral()
7 }
8 dependencies {
9 classpath('com.android.tools.build:gradle')
10 classpath('com.facebook.react:react-native-gradle-plugin')
11 classpath('org.jetbrains.kotlin:kotlin-gradle-plugin')
12 }
2213}
2314
24apply plugin: "com.facebook.react.rootproject"
15def reactNativeAndroidDir = new File(
16 providers.exec {
17 workingDir(rootDir)
18 commandLine("node", "--print", "require.resolve('react-native/package.json')")
19 }.standardOutput.asText.get().trim(),
20 "../android"
21)
2522
2623allprojects {
27 repositories {
28 maven {
29 // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
30 url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android'))
31 }
32 maven {
33 // Android JSC is installed from npm
34 url(new File(['node', '--print', "require.resolve('jsc-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), '../dist'))
35 }
36
37 google()
38 mavenCentral()
39 maven { url 'https://www.jitpack.io' }
24 repositories {
25 maven {
26 // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
27 url(reactNativeAndroidDir)
4028 }
29
30 google()
31 mavenCentral()
32 maven { url 'https://www.jitpack.io' }
33 }
4134}
35
36apply plugin: "expo-root-project"
37apply plugin: "com.facebook.react.rootproject"
android/gradle.properties
MODIFIED
3535# your application. You should enable this flag either if you want
3636# to write custom TurboModules/Fabric components OR use libraries that
3737# are providing them.
38newArchEnabled=false
38newArchEnabled=true
3939
4040# Use this property to enable or disable the Hermes JS engine.
4141# If set to false, you will be using JSC instead.
android/gradle/wrapper/gradle-wrapper.properties
MODIFIED
11distributionBase=GRADLE_USER_HOME
22distributionPath=wrapper/dists
3distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
3distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
44networkTimeout=10000
55validateDistributionUrl=true
66zipStoreBase=GRADLE_USER_HOME
android/gradlew
MODIFIED
8686# shellcheck disable=SC2034
8787APP_BASE_NAME=${0##*/}
8888# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
89APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
90' "$PWD" ) || exit
89APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
9190
9291# Use the maximum available, or set MAX_FD != -1 to use that value.
9392MAX_FD=maximum
android/settings.gradle
MODIFIED
11pluginManagement {
2 includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().toString())
2 def reactNativeGradlePlugin = new File(
3 providers.exec {
4 workingDir(rootDir)
5 commandLine("node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })")
6 }.standardOutput.asText.get().trim()
7 ).getParentFile().absolutePath
8 includeBuild(reactNativeGradlePlugin)
9
10 def expoPluginsPath = new File(
11 providers.exec {
12 workingDir(rootDir)
13 commandLine("node", "--print", "require.resolve('expo-modules-autolinking/package.json', { paths: [require.resolve('expo/package.json')] })")
14 }.standardOutput.asText.get().trim(),
15 "../android/expo-gradle-plugin"
16 ).absolutePath
17 includeBuild(expoPluginsPath)
18}
19
20plugins {
21 id("com.facebook.react.settings")
22 id("expo-autolinking-settings")
323}
4plugins { id("com.facebook.react.settings") }
524
625extensions.configure(com.facebook.react.ReactSettingsExtension) { ex ->
726 if (System.getenv('EXPO_USE_COMMUNITY_AUTOLINKING') == '1') {
827 ex.autolinkLibrariesFromCommand()
928 } else {
10 def command = [
11 'node',
12 '--no-warnings',
13 '--eval',
14 'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))',
15 'react-native-config',
16 '--json',
17 '--platform',
18 'android'
19 ].toList()
20 ex.autolinkLibrariesFromCommand(command)
29 ex.autolinkLibrariesFromCommand(expoAutolinking.rnConfigCommand)
2130 }
2231}
32expoAutolinking.useExpoModules()
2333
2434rootProject.name = 'HelloWorld'
2535
26dependencyResolutionManagement {
27 versionCatalogs {
28 reactAndroidLibs {
29 from(files(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../gradle/libs.versions.toml")))
30 }
31 }
32}
33
34apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle");
35useExpoModules()
36expoAutolinking.useExpoVersionCatalog()
3637
3738include ':app'
38includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile())
39includeBuild(expoAutolinking.reactNativeGradlePlugin)
ios/HelloWorld.xcodeproj/project.pbxproj
MODIFIED
33 archiveVersion = 1;
44 classes = {
55 };
6 objectVersion = 46;
6 objectVersion = 54;
77 objects = {
88
99/* Begin PBXBuildFile section */
10 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
1110 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
12 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
1311 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; };
14 96905EF65AED1B983A6B3ABC /* libPods-HelloWorld.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-HelloWorld.a */; };
15 B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; };
1612 BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; };
13 F11748422D0307B40044C1D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F11748412D0307B40044C1D9 /* AppDelegate.swift */; };
1714/* End PBXBuildFile section */
1815
1916/* Begin PBXFileReference section */
2017 13B07F961A680F5B00A75B9A /* HelloWorld.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HelloWorld.app; sourceTree = BUILT_PRODUCTS_DIR; };
21 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = HelloWorld/AppDelegate.h; sourceTree = "<group>"; };
22 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = HelloWorld/AppDelegate.mm; sourceTree = "<group>"; };
2318 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = HelloWorld/Images.xcassets; sourceTree = "<group>"; };
2419 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = HelloWorld/Info.plist; sourceTree = "<group>"; };
25 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = HelloWorld/main.m; sourceTree = "<group>"; };
26 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-HelloWorld.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HelloWorld.a"; sourceTree = BUILT_PRODUCTS_DIR; };
27 6C2E3173556A471DD304B334 /* Pods-HelloWorld.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld.debug.xcconfig"; path = "Target Support Files/Pods-HelloWorld/Pods-HelloWorld.debug.xcconfig"; sourceTree = "<group>"; };
28 7A4D352CD337FB3A3BF06240 /* Pods-HelloWorld.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld.release.xcconfig"; path = "Target Support Files/Pods-HelloWorld/Pods-HelloWorld.release.xcconfig"; sourceTree = "<group>"; };
2920 AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = HelloWorld/SplashScreen.storyboard; sourceTree = "<group>"; };
3021 BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = "<group>"; };
3122 ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
32 FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-HelloWorld/ExpoModulesProvider.swift"; sourceTree = "<group>"; };
23 F11748412D0307B40044C1D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = HelloWorld/AppDelegate.swift; sourceTree = "<group>"; };
24 F11748442D0722820044C1D9 /* HelloWorld-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "HelloWorld-Bridging-Header.h"; path = "HelloWorld/HelloWorld-Bridging-Header.h"; sourceTree = "<group>"; };
3325/* End PBXFileReference section */
3426
3527/* Begin PBXFrameworksBuildPhase section */
3729 isa = PBXFrameworksBuildPhase;
3830 buildActionMask = 2147483647;
3931 files = (
40 96905EF65AED1B983A6B3ABC /* libPods-HelloWorld.a in Frameworks */,
4132 );
4233 runOnlyForDeploymentPostprocessing = 0;
4334 };
4738 13B07FAE1A68108700A75B9A /* HelloWorld */ = {
4839 isa = PBXGroup;
4940 children = (
41 F11748412D0307B40044C1D9 /* AppDelegate.swift */,
42 F11748442D0722820044C1D9 /* HelloWorld-Bridging-Header.h */,
5043 BB2F792B24A3F905000567C9 /* Supporting */,
51 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
52 13B07FB01A68108700A75B9A /* AppDelegate.mm */,
5344 13B07FB51A68108700A75B9A /* Images.xcassets */,
5445 13B07FB61A68108700A75B9A /* Info.plist */,
55 13B07FB71A68108700A75B9A /* main.m */,
5646 AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */,
5747 );
5848 name = HelloWorld;
6252 isa = PBXGroup;
6353 children = (
6454 ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
65 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-HelloWorld.a */,
6655 );
6756 name = Frameworks;
6857 sourceTree = "<group>";
8170 832341AE1AAA6A7D00B99B32 /* Libraries */,
8271 83CBBA001A601CBA00E9B192 /* Products */,
8372 2D16E6871FA4F8E400B85C8A /* Frameworks */,
84 D65327D7A22EEC0BE12398D9 /* Pods */,
85 D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */,
8673 );
8774 indentWidth = 2;
8875 sourceTree = "<group>";
9784 name = Products;
9885 sourceTree = "<group>";
9986 };
100 92DBD88DE9BF7D494EA9DA96 /* HelloWorld */ = {
101 isa = PBXGroup;
102 children = (
103 FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */,
104 );
105 name = HelloWorld;
106 sourceTree = "<group>";
107 };
10887 BB2F792B24A3F905000567C9 /* Supporting */ = {
10988 isa = PBXGroup;
11089 children = (
11493 path = HelloWorld/Supporting;
11594 sourceTree = "<group>";
11695 };
117 D65327D7A22EEC0BE12398D9 /* Pods */ = {
118 isa = PBXGroup;
119 children = (
120 6C2E3173556A471DD304B334 /* Pods-HelloWorld.debug.xcconfig */,
121 7A4D352CD337FB3A3BF06240 /* Pods-HelloWorld.release.xcconfig */,
122 );
123 path = Pods;
124 sourceTree = "<group>";
125 };
126 D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = {
127 isa = PBXGroup;
128 children = (
129 92DBD88DE9BF7D494EA9DA96 /* HelloWorld */,
130 );
131 name = ExpoModulesProviders;
132 sourceTree = "<group>";
133 };
13496/* End PBXGroup section */
13597
13698/* Begin PBXNativeTarget section */
265227 isa = PBXSourcesBuildPhase;
266228 buildActionMask = 2147483647;
267229 files = (
268 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */,
269 13B07FC11A68108700A75B9A /* main.m in Sources */,
270 B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */,
230 F11748422D0307B40044C1D9 /* AppDelegate.swift in Sources */,
271231 );
272232 runOnlyForDeploymentPostprocessing = 0;
273233 };
276236/* Begin XCBuildConfiguration section */
277237 13B07F941A680F5B00A75B9A /* Debug */ = {
278238 isa = XCBuildConfiguration;
279 baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-HelloWorld.debug.xcconfig */;
280239 buildSettings = {
281240 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
282241 CLANG_ENABLE_MODULES = YES;
288247 );
289248 INFOPLIST_FILE = HelloWorld/Info.plist;
290249 IPHONEOS_DEPLOYMENT_TARGET = 15.1;
291 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
250 LD_RUNPATH_SEARCH_PATHS = (
251 "$(inherited)",
252 "@executable_path/Frameworks",
253 );
292254 MARKETING_VERSION = 1.0;
293255 OTHER_LDFLAGS = (
294256 "$(inherited)",
297259 );
298260 PRODUCT_BUNDLE_IDENTIFIER = org.name.HelloWorld;
299261 PRODUCT_NAME = HelloWorld;
262 SWIFT_OBJC_BRIDGING_HEADER = "HelloWorld/HelloWorld-Bridging-Header.h";
300263 SWIFT_OPTIMIZATION_LEVEL = "-Onone";
301264 SWIFT_VERSION = 5.0;
302265 VERSIONING_SYSTEM = "apple-generic";
305268 };
306269 13B07F951A680F5B00A75B9A /* Release */ = {
307270 isa = XCBuildConfiguration;
308 baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-HelloWorld.release.xcconfig */;
309271 buildSettings = {
310272 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
311273 CLANG_ENABLE_MODULES = YES;
312274 CURRENT_PROJECT_VERSION = 1;
313275 INFOPLIST_FILE = HelloWorld/Info.plist;
314276 IPHONEOS_DEPLOYMENT_TARGET = 15.1;
315 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
277 LD_RUNPATH_SEARCH_PATHS = (
278 "$(inherited)",
279 "@executable_path/Frameworks",
280 );
316281 MARKETING_VERSION = 1.0;
317282 OTHER_LDFLAGS = (
318283 "$(inherited)",
321286 );
322287 PRODUCT_BUNDLE_IDENTIFIER = org.name.HelloWorld;
323288 PRODUCT_NAME = HelloWorld;
289 SWIFT_OBJC_BRIDGING_HEADER = "HelloWorld/HelloWorld-Bridging-Header.h";
324290 SWIFT_VERSION = 5.0;
325291 VERSIONING_SYSTEM = "apple-generic";
326292 };
374340 GCC_WARN_UNUSED_FUNCTION = YES;
375341 GCC_WARN_UNUSED_VARIABLE = YES;
376342 IPHONEOS_DEPLOYMENT_TARGET = 15.1;
377 LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
343 LD_RUNPATH_SEARCH_PATHS = (
344 /usr/lib/swift,
345 "$(inherited)",
346 );
378347 LIBRARY_SEARCH_PATHS = "\"$(inherited)\"";
379348 MTL_ENABLE_DEBUG_INFO = YES;
380349 ONLY_ACTIVE_ARCH = YES;
423392 GCC_WARN_UNUSED_FUNCTION = YES;
424393 GCC_WARN_UNUSED_VARIABLE = YES;
425394 IPHONEOS_DEPLOYMENT_TARGET = 15.1;
426 LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
395 LD_RUNPATH_SEARCH_PATHS = (
396 /usr/lib/swift,
397 "$(inherited)",
398 );
427399 LIBRARY_SEARCH_PATHS = "\"$(inherited)\"";
428400 MTL_ENABLE_DEBUG_INFO = NO;
429401 SDKROOT = iphoneos;
ios/HelloWorld/AppDelegate.swift
ADDED
1import Expo
2import React
3import ReactAppDependencyProvider
4
5@UIApplicationMain
6public class AppDelegate: ExpoAppDelegate {
7 public override func application(
8 _ application: UIApplication,
9 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
10 ) -> Bool {
11 self.moduleName = "main"
12 self.initialProps = [:]
13
14 let delegate = ReactNativeDelegate()
15 let factory = ExpoReactNativeFactory(delegate: delegate)
16 delegate.dependencyProvider = RCTAppDependencyProvider()
17
18 reactNativeFactoryDelegate = delegate
19 reactNativeFactory = factory
20
21 return super.application(application, didFinishLaunchingWithOptions: launchOptions)
22 }
23
24 // Linking API
25 public override func application(
26 _ app: UIApplication,
27 open url: URL,
28 options: [UIApplication.OpenURLOptionsKey: Any] = [:]
29 ) -> Bool {
30 return super.application(app, open: url, options: options) || RCTLinkingManager.application(app, open: url, options: options)
31 }
32
33 // Universal Links
34 public override func application(
35 _ application: UIApplication,
36 continue userActivity: NSUserActivity,
37 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
38 ) -> Bool {
39 let result = RCTLinkingManager.application(application, continue: userActivity, restorationHandler: restorationHandler)
40 return super.application(application, continue: userActivity, restorationHandler: restorationHandler) || result
41 }
42}
43
44class ReactNativeDelegate: ExpoReactNativeFactoryDelegate {
45 // Extension point for config-plugins
46}
ios/HelloWorld/HelloWorld-Bridging-Header.h
ADDED
1//
2// Use this file to import your target's public headers that you would like to expose to Swift.
3//
ios/Podfile
MODIFIED
44require 'json'
55podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {}
66
7ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0'
7ENV['RCT_NEW_ARCH_ENABLED'] = '0' if podfile_properties['newArchEnabled'] == 'false'
88ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR']
99
1010platform :ios, podfile_properties['ios.deploymentTarget'] || '15.1'
2020 config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"];
2121 else
2222 config_command = [
23 'node',
24 '--no-warnings',
25 '--eval',
26 'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))',
23 'npx',
24 'expo-modules-autolinking',
2725 'react-native-config',
2826 '--json',
2927 '--platform',
package.json
MODIFIED
22 "name": "expo-template-bare-minimum",
33 "description": "This bare project template includes a minimal setup for using unimodules with React Native.",
44 "license": "0BSD",
5 "version": "52.0.76",
5 "version": "53.0.14",
66 "main": "index.js",
77 "scripts": {
88 "start": "expo start --dev-client",
1111 "web": "expo start --web"
1212 },
1313 "dependencies": {
14 "expo": "~52.0.46",
15 "expo-status-bar": "~2.0.1",
16 "react": "18.3.1",
17 "react-native": "0.76.9"
14 "expo": "~53.0.0-preview.11",
15 "expo-status-bar": "~2.2.1",
16 "react": "19.0.0",
17 "react-native": "0.79.1"
1818 },
1919 "devDependencies": {
2020 "@babel/core": "^7.20.0"