HomeGuidesReferenceLearn

Native project upgrade helper

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 a to SDK version to see the 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 49 to 50

android/app/build.gradle

MODIFIED

11apply plugin: "com.android.application"
2apply plugin: "org.jetbrains.kotlin.android"
23apply plugin: "com.facebook.react"
34
45def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath()
1112 entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim())
1213 reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()
1314 hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc"
14 codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()
15 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()
1516
1617 // Use Expo CLI to bundle the app, this ensures the Metro config
1718 // works correctly with Expo projects.
18 cliFile = new File(["node", "--print", "require.resolve('@expo/cli')"].execute(null, rootDir).text.trim())
19 cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim())
1920 bundleCommand = "export:embed"
2021
2122 /* Folders */
7980android {
8081 ndkVersion rootProject.ext.ndkVersion
8182
82 compileSdkVersion rootProject.ext.compileSdkVersion
83 buildToolsVersion rootProject.ext.buildToolsVersion
84 compileSdk rootProject.ext.compileSdkVersion
8385
8486 namespace "com.helloworld"
8587 defaultConfig {
112114 proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
113115 }
114116 }
117 packagingOptions {
118 jniLibs {
119 useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false)
120 }
121 }
115122}
116123
117124// Apply static values from `gradle.properties` to the `android.packagingOptions`
141148 def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true";
142149 def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true";
143150 def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true";
144 def frescoVersion = rootProject.ext.frescoVersion
145
146 // If your app supports Android versions before Ice Cream Sandwich (API level 14)
147 if (isGifEnabled || isWebpEnabled) {
148 implementation("com.facebook.fresco:fresco:${frescoVersion}")
149 implementation("com.facebook.fresco:imagepipeline-okhttp3:${frescoVersion}")
150 }
151151
152152 if (isGifEnabled) {
153153 // For animated gif support
154 implementation("com.facebook.fresco:animated-gif:${frescoVersion}")
154 implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}")
155155 }
156156
157157 if (isWebpEnabled) {
158158 // For webp support
159 implementation("com.facebook.fresco:webpsupport:${frescoVersion}")
159 implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}")
160160 if (isWebpAnimatedEnabled) {
161161 // Animated webp support
162 implementation("com.facebook.fresco:animated-webp:${frescoVersion}")
162 implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}")
163163 }
164164 }
165165
166 debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}")
167 debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
168 exclude group:'com.squareup.okhttp3', module:'okhttp'
169 }
170 debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}")
166 implementation("com.facebook.react:flipper-integration")
171167
172168 if (hermesEnabled.toBoolean()) {
173169 implementation("com.facebook.react:hermes-android")
176172 }
177173}
178174
179apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle");
175apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), "../native_modules.gradle");
180176applyNativeModulesAppBuildGradle(project)
android/app/src/main/AndroidManifest.xml

MODIFIED

2121 <application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="false" android:theme="@style/AppTheme">
2222 <meta-data android:name="expo.modules.updates.EXPO_UPDATE_URL" android:value="YOUR-APP-URL-HERE"/>
2323 <meta-data android:name="expo.modules.updates.EXPO_SDK_VERSION" android:value="YOUR-APP-SDK-VERSION-HERE"/>
24 <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.App.SplashScreen" android:exported="true">
24 <activity android:name=".MainActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.App.SplashScreen" android:exported="true">
2525 <intent-filter>
2626 <action android:name="android.intent.action.MAIN"/>
2727 <category android:name="android.intent.category.LAUNCHER"/>
2929 </activity>
3030 <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false"/>
3131 </application>
32</manifest>
32</manifest>
android/app/src/main/java/com/helloworld/MainActivity.kt

ADDED

1package com.helloworld
2
3import android.os.Build
4import android.os.Bundle
5
6import com.facebook.react.ReactActivity
7import com.facebook.react.ReactActivityDelegate
8import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
9import com.facebook.react.defaults.DefaultReactActivityDelegate
10
11import expo.modules.ReactActivityDelegateWrapper
12
13class MainActivity : ReactActivity() {
14 override fun onCreate(savedInstanceState: Bundle?) {
15 // Set the theme to AppTheme BEFORE onCreate to support
16 // coloring the background, status bar, and navigation bar.
17 // This is required for expo-splash-screen.
18 setTheme(R.style.AppTheme);
19 super.onCreate(null)
20 }
21
22 /**
23 * Returns the name of the main component registered from JavaScript. This is used to schedule
24 * rendering of the component.
25 */
26 override fun getMainComponentName(): String = "main"
27
28 /**
29 * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate]
30 * which allows you to enable New Architecture with a single boolean flags [fabricEnabled]
31 */
32 override fun createReactActivityDelegate(): ReactActivityDelegate {
33 return ReactActivityDelegateWrapper(
34 this,
35 BuildConfig.IS_NEW_ARCHITECTURE_ENABLED,
36 object : DefaultReactActivityDelegate(
37 this,
38 mainComponentName,
39 fabricEnabled
40 ){})
41 }
42
43 /**
44 * Align the back button behavior with Android S
45 * where moving root activities to background instead of finishing activities.
46 * @see <a href="https://developer.android.com/reference/android/app/Activity#onBackPressed()">onBackPressed</a>
47 */
48 override fun invokeDefaultOnBackPressed() {
49 if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
50 if (!moveTaskToBack(false)) {
51 // For non-root activities, use the default implementation to finish them.
52 super.invokeDefaultOnBackPressed()
53 }
54 return
55 }
56
57 // Use the default back button implementation on Android S
58 // because it's doing more than [Activity.moveTaskToBack] in fact.
59 super.invokeDefaultOnBackPressed()
60 }
61}
android/app/src/main/java/com/helloworld/MainApplication.kt

ADDED

1package com.helloworld
2
3import android.app.Application
4import android.content.res.Configuration
5import androidx.annotation.NonNull
6
7import com.facebook.react.PackageList
8import com.facebook.react.ReactApplication
9import com.facebook.react.ReactNativeHost
10import com.facebook.react.ReactPackage
11import com.facebook.react.ReactHost
12import com.facebook.react.config.ReactFeatureFlags
13import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
14import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
15import com.facebook.react.defaults.DefaultReactNativeHost
16import com.facebook.react.flipper.ReactNativeFlipper
17import com.facebook.soloader.SoLoader
18
19import expo.modules.ApplicationLifecycleDispatcher
20import expo.modules.ReactNativeHostWrapper
21
22class MainApplication : Application(), ReactApplication {
23
24 override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper(
25 this,
26 object : DefaultReactNativeHost(this) {
27 override fun getPackages(): List<ReactPackage> {
28 // Packages that cannot be autolinked yet can be added manually here, for example:
29 // packages.add(new MyReactNativePackage());
30 return PackageList(this).packages
31 }
32
33 override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry"
34
35 override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
36
37 override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
38 override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
39 }
40 )
41
42 override val reactHost: ReactHost
43 get() = getDefaultReactHost(this.applicationContext, reactNativeHost)
44
45 override fun onCreate() {
46 super.onCreate()
47 SoLoader.init(this, false)
48 if (!BuildConfig.REACT_NATIVE_UNSTABLE_USE_RUNTIME_SCHEDULER_ALWAYS) {
49 ReactFeatureFlags.unstable_useRuntimeSchedulerAlways = false
50 }
51 if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
52 // If you opted-in for the New Architecture, we load the native entry point for this app.
53 load()
54 }
55 if (BuildConfig.DEBUG) {
56 ReactNativeFlipper.initializeFlipper(this, reactNativeHost.reactInstanceManager)
57 }
58 ApplicationLifecycleDispatcher.onApplicationCreate(this)
59 }
60
61 override fun onConfigurationChanged(newConfig: Configuration) {
62 super.onConfigurationChanged(newConfig)
63 ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig)
64 }
65}
android/build.gradle

MODIFIED

22
33buildscript {
44 ext {
5 buildToolsVersion = findProperty('android.buildToolsVersion') ?: '33.0.0'
6 minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '21')
7 compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '33')
8 targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '33')
5 buildToolsVersion = findProperty('android.buildToolsVersion') ?: '34.0.0'
6 minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '23')
7 compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '34')
8 targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34')
99 kotlinVersion = findProperty('android.kotlinVersion') ?: '1.8.10'
10 frescoVersion = findProperty('expo.frescoVersion') ?: '2.5.0'
1110
12 // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP.
13 ndkVersion = "23.1.7779620"
11 ndkVersion = "25.1.8937393"
1412 }
1513 repositories {
1614 google()
1715 mavenCentral()
1816 }
1917 dependencies {
20 classpath('com.android.tools.build:gradle:7.4.2')
18 classpath('com.android.tools.build:gradle')
2119 classpath('com.facebook.react:react-native-gradle-plugin')
2220 }
2321}
2422
23apply plugin: "com.facebook.react.rootproject"
24
2525allprojects {
2626 repositories {
2727 maven {
3030 }
3131 maven {
3232 // Android JSC is installed from npm
33 url(new File(['node', '--print', "require.resolve('jsc-android/package.json')"].execute(null, rootDir).text.trim(), '../dist'))
33 url(new File(['node', '--print', "require.resolve('jsc-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), '../dist'))
3434 }
3535
3636 google()
android/gradle.properties

MODIFIED

2525# Automatically convert third-party libraries to use AndroidX
2626android.enableJetifier=true
2727
28# Version of flipper SDK to use with React Native
29FLIPPER_VERSION=0.182.0
30
3128# Use this property to specify which architecture you want to build.
3229# You can also override it from the CLI using
3330# ./gradlew <task> -PreactNativeArchitectures=x86_64
5451
5552# Enable network inspector
5653EX_DEV_CLIENT_NETWORK_INSPECTOR=true
54
55# Use legacy packaging to compress native libraries in the resulting APK.
56expo.useLegacyPackaging=false
android/gradle/wrapper/gradle-wrapper.properties

MODIFIED

11distributionBase=GRADLE_USER_HOME
22distributionPath=wrapper/dists
3distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-all.zip
3distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
44networkTimeout=10000
5validateDistributionUrl=true
56zipStoreBase=GRADLE_USER_HOME
67zipStorePath=wrapper/dists
android/gradlew

MODIFIED

5555# Darwin, MinGW, and NonStop.
5656#
5757# (3) This script is generated from the Groovy template
58# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
58# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
5959# within the Gradle project.
6060#
6161# You can find Gradle at https://github.com/gradle/gradle/.
8080 esac
8181done
8282
83APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
84
85APP_NAME="Gradle"
83# This is normally unused
84# shellcheck disable=SC2034
8685APP_BASE_NAME=${0##*/}
87
88# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
89DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
86# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
87APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
9088
9189# Use the maximum available, or set MAX_FD != -1 to use that value.
9290MAX_FD=maximum
133131 fi
134132else
135133 JAVACMD=java
136 which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
134 if ! command -v java >/dev/null 2>&1
135 then
136 die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
137137
138138Please set the JAVA_HOME variable in your environment to match the
139139location of your Java installation."
140 fi
140141fi
141142
142143# Increase the maximum file descriptors if we can.
143144if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
144145 case $MAX_FD in #(
145146 max*)
147 # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
148 # shellcheck disable=SC2039,SC3045
146149 MAX_FD=$( ulimit -H -n ) ||
147150 warn "Could not query maximum file descriptor limit"
148151 esac
149152 case $MAX_FD in #(
150153 '' | soft) :;; #(
151154 *)
155 # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
156 # shellcheck disable=SC2039,SC3045
152157 ulimit -n "$MAX_FD" ||
153158 warn "Could not set maximum file descriptor limit to $MAX_FD"
154159 esac
193198 done
194199fi
195200
196# Collect all arguments for the java command;
197# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
198# shell script including quotes and variable substitutions, so put them in
199# double quotes to make sure that they get re-expanded; and
200# * put everything else in single quotes, so that it's not re-expanded.
201
202# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
203DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
204
205# Collect all arguments for the java command:
206# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
207# and any embedded shellness will be escaped.
208# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
209# treated as '${Hostname}' itself on the command line.
201210
202211set -- \
203212 "-Dorg.gradle.appname=$APP_BASE_NAME" \
android/settings.gradle

MODIFIED

11rootProject.name = 'HelloWorld'
22
3dependencyResolutionManagement {
4 versionCatalogs {
5 reactAndroidLibs {
6 from(files(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../gradle/libs.versions.toml")))
7 }
8 }
9}
10
311apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle");
412useExpoModules()
513
6apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle");
14apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), "../native_modules.gradle");
715applyNativeModulesSettingsGradle(settings)
816
917include ':app'
10includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json')"].execute(null, rootDir).text.trim()).getParentFile())
18includeBuild(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())
ios/HelloWorld.xcodeproj/project.pbxproj

MODIFIED

139139 buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "HelloWorld" */;
140140 buildPhases = (
141141 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */,
142 FD10A7F022414F080027D42C /* Start Packager */,
143142 13B07F871A680F5B00A75B9A /* Sources */,
144143 13B07F8C1A680F5B00A75B9A /* Frameworks */,
145144 13B07F8E1A680F5B00A75B9A /* Resources */,
202201/* Begin PBXShellScriptBuildPhase section */
203202 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
204203 isa = PBXShellScriptBuildPhase;
204 alwaysOutOfDate = 1;
205205 buildActionMask = 2147483647;
206206 files = (
207207 );
212212 );
213213 runOnlyForDeploymentPostprocessing = 0;
214214 shellPath = /bin/sh;
215 shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios relative | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli')\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n";
215 shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios relative | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n";
216216 };
217217 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = {
218218 isa = PBXShellScriptBuildPhase;
245245 "${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-resources.sh",
246246 "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle",
247247 "${PODS_CONFIGURATION_BUILD_DIR}/EXUpdates/EXUpdates.bundle",
248 "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
248 "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
249249 );
250250 name = "[CP] Copy Pods Resources";
251251 outputPaths = (
252252 "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle",
253253 "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXUpdates.bundle",
254 "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
254 "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
255255 );
256256 runOnlyForDeploymentPostprocessing = 0;
257257 shellPath = /bin/sh;
258258 shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-resources.sh\"\n";
259259 showEnvVarsInLog = 0;
260260 };
261 FD10A7F022414F080027D42C /* Start Packager */ = {
262 isa = PBXShellScriptBuildPhase;
263 buildActionMask = 2147483647;
264 files = (
265 );
266 inputFileListPaths = (
267 );
268 inputPaths = (
269 );
270 name = "Start Packager";
271 outputFileListPaths = (
272 );
273 outputPaths = (
274 );
275 runOnlyForDeploymentPostprocessing = 0;
276 shellPath = /bin/sh;
277 shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\nexport RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/.packager.env'\"`\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open `$NODE_BINARY --print \"require('path').dirname(require.resolve('expo/package.json')) + '/scripts/launchPackager.command'\"` || echo \"Can't start packager automatically\"\n fi\nfi\n";
278 showEnvVarsInLog = 0;
279 };
280261/* End PBXShellScriptBuildPhase section */
281262
282263/* Begin PBXSourcesBuildPhase section */
306287 "FB_SONARKIT_ENABLED=1",
307288 );
308289 INFOPLIST_FILE = HelloWorld/Info.plist;
309 IPHONEOS_DEPLOYMENT_TARGET = 13.0;
290 IPHONEOS_DEPLOYMENT_TARGET = 13.4;
310291 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
311 MARKETING_VERSION = 1.0;
292 MARKETING_VERSION = 1.0;
312293 OTHER_LDFLAGS = (
313294 "$(inherited)",
314295 "-ObjC",
330311 CLANG_ENABLE_MODULES = YES;
331312 CURRENT_PROJECT_VERSION = 1;
332313 INFOPLIST_FILE = HelloWorld/Info.plist;
333 IPHONEOS_DEPLOYMENT_TARGET = 13.0;
314 IPHONEOS_DEPLOYMENT_TARGET = 13.4;
334315 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
335 MARKETING_VERSION = 1.0;
316 MARKETING_VERSION = 1.0;
336317 OTHER_LDFLAGS = (
337318 "$(inherited)",
338319 "-ObjC",
350331 buildSettings = {
351332 ALWAYS_SEARCH_USER_PATHS = NO;
352333 CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
353 CLANG_CXX_LANGUAGE_STANDARD = "c++17";
334 CLANG_CXX_LANGUAGE_STANDARD = "c++20";
354335 CLANG_CXX_LIBRARY = "libc++";
355336 CLANG_ENABLE_MODULES = YES;
356337 CLANG_ENABLE_OBJC_ARC = YES;
392373 GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
393374 GCC_WARN_UNUSED_FUNCTION = YES;
394375 GCC_WARN_UNUSED_VARIABLE = YES;
395 IPHONEOS_DEPLOYMENT_TARGET = 13.0;
376 IPHONEOS_DEPLOYMENT_TARGET = 13.4;
396377 LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
397378 LIBRARY_SEARCH_PATHS = "\"$(inherited)\"";
398379 MTL_ENABLE_DEBUG_INFO = YES;
406387 buildSettings = {
407388 ALWAYS_SEARCH_USER_PATHS = NO;
408389 CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
409 CLANG_CXX_LANGUAGE_STANDARD = "c++17";
390 CLANG_CXX_LANGUAGE_STANDARD = "c++20";
410391 CLANG_CXX_LIBRARY = "libc++";
411392 CLANG_ENABLE_MODULES = YES;
412393 CLANG_ENABLE_OBJC_ARC = YES;
441422 GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
442423 GCC_WARN_UNUSED_FUNCTION = YES;
443424 GCC_WARN_UNUSED_VARIABLE = YES;
444 IPHONEOS_DEPLOYMENT_TARGET = 13.0;
425 IPHONEOS_DEPLOYMENT_TARGET = 13.4;
445426 LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
446427 LIBRARY_SEARCH_PATHS = "\"$(inherited)\"";
447428 MTL_ENABLE_DEBUG_INFO = NO;
ios/HelloWorld/AppDelegate.mm

MODIFIED

1717}
1818
1919- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
20{
21 return [self getBundleURL];
22}
23
24- (NSURL *)getBundleURL
2025{
2126#if DEBUG
2227 return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"];
ios/HelloWorld/Info.plist

MODIFIED

22<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
33<plist version="1.0">
44<dict>
5 <key>CADisableMinimumFrameDurationOnPhone</key>
6 <true/>
57 <key>CFBundleDevelopmentRegion</key>
68 <string>$(DEVELOPMENT_LANGUAGE)</string>
79 <key>CFBundleExecutable</key>
1416 <string>$(PRODUCT_NAME)</string>
1517 <key>CFBundlePackageType</key>
1618 <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
17 <key>CFBundleSignature</key>
18 <string>????</string>
1919 <key>CFBundleShortVersionString</key>
2020 <string>1.0</string>
21 <key>CFBundleSignature</key>
22 <string>????</string>
2123 <key>CFBundleVersion</key>
2224 <string>1</string>
2325 <key>LSRequiresIPhoneOS</key>
2527 <key>NSAppTransportSecurity</key>
2628 <dict>
2729 <key>NSAllowsArbitraryLoads</key>
30 <false/>
31 <key>NSAllowsLocalNetworking</key>
2832 <true/>
29 <key>NSExceptionDomains</key>
30 <dict>
31 <key>localhost</key>
32 <dict>
33 <key>NSExceptionAllowsInsecureHTTPLoads</key>
34 <true/>
35 </dict>
36 </dict>
3733 </dict>
3834 <key>UILaunchStoryboardName</key>
3935 <string>SplashScreen</string>
4137 <array>
4238 <string>armv7</string>
4339 </array>
40 <key>UIStatusBarStyle</key>
41 <string>UIStatusBarStyleDefault</string>
4442 <key>UISupportedInterfaceOrientations</key>
4543 <array>
4644 <string>UIInterfaceOrientationPortrait</string>
4947 </array>
5048 <key>UIViewControllerBasedStatusBarAppearance</key>
5149 <false/>
52 <key>UIStatusBarStyle</key>
53 <string>UIStatusBarStyleDefault</string>
54 <key>CADisableMinimumFrameDurationOnPhone</key>
55 <true/>
5650</dict>
5751</plist>
ios/Podfile

MODIFIED

77ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0'
88ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR']
99
10platform :ios, podfile_properties['ios.deploymentTarget'] || '13.0'
10platform :ios, podfile_properties['ios.deploymentTarget'] || '13.4'
1111install! 'cocoapods',
1212 :deterministic_uuids => false
1313
4444 use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks']
4545 use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS']
4646
47 # Flags change depending on the env values.
48 flags = get_default_flags()
49
5047 use_react_native!(
5148 :path => config[:reactNativePath],
5249 :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes',
53 :fabric_enabled => flags[:fabric_enabled],
5450 # An absolute path to your application root.
5551 :app_path => "#{Pod::Config.instance.installation_root}/..",
5652 # Note that if you have use_frameworks! enabled, Flipper will not work if enabled
6359 config[:reactNativePath],
6460 :mac_catalyst_enabled => false
6561 )
66 __apply_Xcode_12_5_M1_post_install_workaround(installer)
6762
6863 # This is necessary for Xcode 14, because it signs resource bundles by default
6964 # when building for devices.
package.json

MODIFIED

11{
22 "name": "expo-template-bare-minimum",
33 "description": "This bare project template includes a minimal setup for using unimodules with React Native.",
4 "version": "49.0.24",
4 "version": "50.0.36",
55 "main": "index.js",
66 "scripts": {
77 "start": "expo start --dev-client",
1010 "web": "expo start --web"
1111 },
1212 "dependencies": {
13 "expo": "~49.0.18",
14 "expo-splash-screen": "~0.20.5",
15 "expo-status-bar": "~1.6.0",
13 "expo": "~50.0.6",
14 "expo-status-bar": "~1.11.1",
1615 "react": "18.2.0",
17 "react-native": "0.72.6"
16 "react-native": "0.73.4"
1817 },
1918 "devDependencies": {
2019 "@babel/core": "^7.20.0"