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.
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.
MODIFIED
1 | 1 | apply plugin: "com.android.application" |
2 | apply plugin: "org.jetbrains.kotlin.android" | |
2 | 3 | apply plugin: "com.facebook.react" |
3 | 4 | |
4 | 5 | def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath() |
11 | 12 | entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim()) |
12 | 13 | reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() |
13 | 14 | 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() | |
15 | 16 | |
16 | 17 | // Use Expo CLI to bundle the app, this ensures the Metro config |
17 | 18 | // 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()) | |
19 | 20 | bundleCommand = "export:embed" |
20 | 21 | |
21 | 22 | /* Folders */ |
79 | 80 | android { |
80 | 81 | ndkVersion rootProject.ext.ndkVersion |
81 | 82 | |
82 | compileSdkVersion rootProject.ext.compileSdkVersion | |
83 | buildToolsVersion rootProject.ext.buildToolsVersion | |
84 | compileSdk rootProject.ext.compileSdkVersion | |
83 | 85 | |
84 | 86 | namespace "com.helloworld" |
85 | 87 | defaultConfig { |
112 | 114 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" |
113 | 115 | } |
114 | 116 | } |
117 | packagingOptions { | |
118 | jniLibs { | |
119 | useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false) | |
120 | } | |
121 | } | |
115 | 122 | } |
116 | 123 | |
117 | 124 | // Apply static values from `gradle.properties` to the `android.packagingOptions` |
141 | 148 | def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; |
142 | 149 | def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; |
143 | 150 | 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 | } | |
151 | 151 | |
152 | 152 | if (isGifEnabled) { |
153 | 153 | // For animated gif support |
154 | implementation("com.facebook.fresco:animated-gif:${frescoVersion}") | |
154 | implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}") | |
155 | 155 | } |
156 | 156 | |
157 | 157 | if (isWebpEnabled) { |
158 | 158 | // For webp support |
159 | implementation("com.facebook.fresco:webpsupport:${frescoVersion}") | |
159 | implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}") | |
160 | 160 | if (isWebpAnimatedEnabled) { |
161 | 161 | // Animated webp support |
162 | implementation("com.facebook.fresco:animated-webp:${frescoVersion}") | |
162 | implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}") | |
163 | 163 | } |
164 | 164 | } |
165 | 165 | |
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") | |
171 | 167 | |
172 | 168 | if (hermesEnabled.toBoolean()) { |
173 | 169 | implementation("com.facebook.react:hermes-android") |
176 | 172 | } |
177 | 173 | } |
178 | 174 | |
179 | apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); | |
175 | apply 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"); | |
180 | 176 | applyNativeModulesAppBuildGradle(project) |
MODIFIED
21 | 21 | <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"> |
22 | 22 | <meta-data android:name="expo.modules.updates.EXPO_UPDATE_URL" android:value="YOUR-APP-URL-HERE"/> |
23 | 23 | <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"> | |
25 | 25 | <intent-filter> |
26 | 26 | <action android:name="android.intent.action.MAIN"/> |
27 | 27 | <category android:name="android.intent.category.LAUNCHER"/> |
29 | 29 | </activity> |
30 | 30 | <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false"/> |
31 | 31 | </application> |
32 | </manifest> | |
32 | </manifest> |
ADDED
1 | package com.helloworld | |
2 | ||
3 | import android.os.Build | |
4 | import android.os.Bundle | |
5 | ||
6 | import com.facebook.react.ReactActivity | |
7 | import com.facebook.react.ReactActivityDelegate | |
8 | import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled | |
9 | import com.facebook.react.defaults.DefaultReactActivityDelegate | |
10 | ||
11 | import expo.modules.ReactActivityDelegateWrapper | |
12 | ||
13 | class 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 | } |
ADDED
1 | package com.helloworld | |
2 | ||
3 | import android.app.Application | |
4 | import android.content.res.Configuration | |
5 | import androidx.annotation.NonNull | |
6 | ||
7 | import com.facebook.react.PackageList | |
8 | import com.facebook.react.ReactApplication | |
9 | import com.facebook.react.ReactNativeHost | |
10 | import com.facebook.react.ReactPackage | |
11 | import com.facebook.react.ReactHost | |
12 | import com.facebook.react.config.ReactFeatureFlags | |
13 | import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load | |
14 | import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost | |
15 | import com.facebook.react.defaults.DefaultReactNativeHost | |
16 | import com.facebook.react.flipper.ReactNativeFlipper | |
17 | import com.facebook.soloader.SoLoader | |
18 | ||
19 | import expo.modules.ApplicationLifecycleDispatcher | |
20 | import expo.modules.ReactNativeHostWrapper | |
21 | ||
22 | class 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 | } |
MODIFIED
2 | 2 | |
3 | 3 | buildscript { |
4 | 4 | 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') | |
9 | 9 | kotlinVersion = findProperty('android.kotlinVersion') ?: '1.8.10' |
10 | frescoVersion = findProperty('expo.frescoVersion') ?: '2.5.0' | |
11 | 10 | |
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" | |
14 | 12 | } |
15 | 13 | repositories { |
16 | 14 | google() |
17 | 15 | mavenCentral() |
18 | 16 | } |
19 | 17 | dependencies { |
20 | classpath('com.android.tools.build:gradle:7.4.2') | |
18 | classpath('com.android.tools.build:gradle') | |
21 | 19 | classpath('com.facebook.react:react-native-gradle-plugin') |
22 | 20 | } |
23 | 21 | } |
24 | 22 | |
23 | apply plugin: "com.facebook.react.rootproject" | |
24 | ||
25 | 25 | allprojects { |
26 | 26 | repositories { |
27 | 27 | maven { |
30 | 30 | } |
31 | 31 | maven { |
32 | 32 | // 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')) | |
34 | 34 | } |
35 | 35 | |
36 | 36 | google() |
MODIFIED
25 | 25 | # Automatically convert third-party libraries to use AndroidX |
26 | 26 | android.enableJetifier=true |
27 | 27 | |
28 | # Version of flipper SDK to use with React Native | |
29 | FLIPPER_VERSION=0.182.0 | |
30 | ||
31 | 28 | # Use this property to specify which architecture you want to build. |
32 | 29 | # You can also override it from the CLI using |
33 | 30 | # ./gradlew <task> -PreactNativeArchitectures=x86_64 |
54 | 51 | |
55 | 52 | # Enable network inspector |
56 | 53 | EX_DEV_CLIENT_NETWORK_INSPECTOR=true |
54 | ||
55 | # Use legacy packaging to compress native libraries in the resulting APK. | |
56 | expo.useLegacyPackaging=false |
MODIFIED
1 | 1 | distributionBase=GRADLE_USER_HOME |
2 | 2 | distributionPath=wrapper/dists |
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-all.zip | |
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip | |
4 | 4 | networkTimeout=10000 |
5 | validateDistributionUrl=true | |
5 | 6 | zipStoreBase=GRADLE_USER_HOME |
6 | 7 | zipStorePath=wrapper/dists |
MODIFIED
55 | 55 | # Darwin, MinGW, and NonStop. |
56 | 56 | # |
57 | 57 | # (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 | |
59 | 59 | # within the Gradle project. |
60 | 60 | # |
61 | 61 | # You can find Gradle at https://github.com/gradle/gradle/. |
80 | 80 | esac |
81 | 81 | done |
82 | 82 | |
83 | APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit | |
84 | ||
85 | APP_NAME="Gradle" | |
83 | # This is normally unused | |
84 | # shellcheck disable=SC2034 | |
86 | 85 | APP_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. | |
89 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | |
86 | # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) | |
87 | APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit | |
90 | 88 | |
91 | 89 | # Use the maximum available, or set MAX_FD != -1 to use that value. |
92 | 90 | MAX_FD=maximum |
133 | 131 | fi |
134 | 132 | else |
135 | 133 | 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. | |
137 | 137 | |
138 | 138 | Please set the JAVA_HOME variable in your environment to match the |
139 | 139 | location of your Java installation." |
140 | fi | |
140 | 141 | fi |
141 | 142 | |
142 | 143 | # Increase the maximum file descriptors if we can. |
143 | 144 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then |
144 | 145 | case $MAX_FD in #( |
145 | 146 | 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 | |
146 | 149 | MAX_FD=$( ulimit -H -n ) || |
147 | 150 | warn "Could not query maximum file descriptor limit" |
148 | 151 | esac |
149 | 152 | case $MAX_FD in #( |
150 | 153 | '' | soft) :;; #( |
151 | 154 | *) |
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 | |
152 | 157 | ulimit -n "$MAX_FD" || |
153 | 158 | warn "Could not set maximum file descriptor limit to $MAX_FD" |
154 | 159 | esac |
193 | 198 | done |
194 | 199 | fi |
195 | 200 | |
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. | |
203 | DEFAULT_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. | |
201 | 210 | |
202 | 211 | set -- \ |
203 | 212 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ |
MODIFIED
1 | 1 | rootProject.name = 'HelloWorld' |
2 | 2 | |
3 | dependencyResolutionManagement { | |
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 | ||
3 | 11 | apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle"); |
4 | 12 | useExpoModules() |
5 | 13 | |
6 | apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); | |
14 | apply 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"); | |
7 | 15 | applyNativeModulesSettingsGradle(settings) |
8 | 16 | |
9 | 17 | include ':app' |
10 | includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json')"].execute(null, rootDir).text.trim()).getParentFile()) | |
18 | 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()) |
MODIFIED
139 | 139 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "HelloWorld" */; |
140 | 140 | buildPhases = ( |
141 | 141 | 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, |
142 | FD10A7F022414F080027D42C /* Start Packager */, | |
143 | 142 | 13B07F871A680F5B00A75B9A /* Sources */, |
144 | 143 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, |
145 | 144 | 13B07F8E1A680F5B00A75B9A /* Resources */, |
202 | 201 | /* Begin PBXShellScriptBuildPhase section */ |
203 | 202 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { |
204 | 203 | isa = PBXShellScriptBuildPhase; |
204 | alwaysOutOfDate = 1; | |
205 | 205 | buildActionMask = 2147483647; |
206 | 206 | files = ( |
207 | 207 | ); |
212 | 212 | ); |
213 | 213 | runOnlyForDeploymentPostprocessing = 0; |
214 | 214 | 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"; | |
216 | 216 | }; |
217 | 217 | 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = { |
218 | 218 | isa = PBXShellScriptBuildPhase; |
245 | 245 | "${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-resources.sh", |
246 | 246 | "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", |
247 | 247 | "${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", | |
249 | 249 | ); |
250 | 250 | name = "[CP] Copy Pods Resources"; |
251 | 251 | outputPaths = ( |
252 | 252 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", |
253 | 253 | "${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", | |
255 | 255 | ); |
256 | 256 | runOnlyForDeploymentPostprocessing = 0; |
257 | 257 | shellPath = /bin/sh; |
258 | 258 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-resources.sh\"\n"; |
259 | 259 | showEnvVarsInLog = 0; |
260 | 260 | }; |
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 | }; | |
280 | 261 | /* End PBXShellScriptBuildPhase section */ |
281 | 262 | |
282 | 263 | /* Begin PBXSourcesBuildPhase section */ |
306 | 287 | "FB_SONARKIT_ENABLED=1", |
307 | 288 | ); |
308 | 289 | INFOPLIST_FILE = HelloWorld/Info.plist; |
309 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; | |
290 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; | |
310 | 291 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; |
311 | MARKETING_VERSION = 1.0; | |
292 | MARKETING_VERSION = 1.0; | |
312 | 293 | OTHER_LDFLAGS = ( |
313 | 294 | "$(inherited)", |
314 | 295 | "-ObjC", |
330 | 311 | CLANG_ENABLE_MODULES = YES; |
331 | 312 | CURRENT_PROJECT_VERSION = 1; |
332 | 313 | INFOPLIST_FILE = HelloWorld/Info.plist; |
333 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; | |
314 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; | |
334 | 315 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; |
335 | MARKETING_VERSION = 1.0; | |
316 | MARKETING_VERSION = 1.0; | |
336 | 317 | OTHER_LDFLAGS = ( |
337 | 318 | "$(inherited)", |
338 | 319 | "-ObjC", |
350 | 331 | buildSettings = { |
351 | 332 | ALWAYS_SEARCH_USER_PATHS = NO; |
352 | 333 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; |
353 | CLANG_CXX_LANGUAGE_STANDARD = "c++17"; | |
334 | CLANG_CXX_LANGUAGE_STANDARD = "c++20"; | |
354 | 335 | CLANG_CXX_LIBRARY = "libc++"; |
355 | 336 | CLANG_ENABLE_MODULES = YES; |
356 | 337 | CLANG_ENABLE_OBJC_ARC = YES; |
392 | 373 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; |
393 | 374 | GCC_WARN_UNUSED_FUNCTION = YES; |
394 | 375 | GCC_WARN_UNUSED_VARIABLE = YES; |
395 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; | |
376 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; | |
396 | 377 | LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; |
397 | 378 | LIBRARY_SEARCH_PATHS = "\"$(inherited)\""; |
398 | 379 | MTL_ENABLE_DEBUG_INFO = YES; |
406 | 387 | buildSettings = { |
407 | 388 | ALWAYS_SEARCH_USER_PATHS = NO; |
408 | 389 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; |
409 | CLANG_CXX_LANGUAGE_STANDARD = "c++17"; | |
390 | CLANG_CXX_LANGUAGE_STANDARD = "c++20"; | |
410 | 391 | CLANG_CXX_LIBRARY = "libc++"; |
411 | 392 | CLANG_ENABLE_MODULES = YES; |
412 | 393 | CLANG_ENABLE_OBJC_ARC = YES; |
441 | 422 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; |
442 | 423 | GCC_WARN_UNUSED_FUNCTION = YES; |
443 | 424 | GCC_WARN_UNUSED_VARIABLE = YES; |
444 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; | |
425 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; | |
445 | 426 | LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; |
446 | 427 | LIBRARY_SEARCH_PATHS = "\"$(inherited)\""; |
447 | 428 | MTL_ENABLE_DEBUG_INFO = NO; |
MODIFIED
17 | 17 | } |
18 | 18 | |
19 | 19 | - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge |
20 | { | |
21 | return [self getBundleURL]; | |
22 | } | |
23 | ||
24 | - (NSURL *)getBundleURL | |
20 | 25 | { |
21 | 26 | #if DEBUG |
22 | 27 | return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"]; |
MODIFIED
2 | 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
3 | 3 | <plist version="1.0"> |
4 | 4 | <dict> |
5 | <key>CADisableMinimumFrameDurationOnPhone</key> | |
6 | <true/> | |
5 | 7 | <key>CFBundleDevelopmentRegion</key> |
6 | 8 | <string>$(DEVELOPMENT_LANGUAGE)</string> |
7 | 9 | <key>CFBundleExecutable</key> |
14 | 16 | <string>$(PRODUCT_NAME)</string> |
15 | 17 | <key>CFBundlePackageType</key> |
16 | 18 | <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string> |
17 | <key>CFBundleSignature</key> | |
18 | <string>????</string> | |
19 | 19 | <key>CFBundleShortVersionString</key> |
20 | 20 | <string>1.0</string> |
21 | <key>CFBundleSignature</key> | |
22 | <string>????</string> | |
21 | 23 | <key>CFBundleVersion</key> |
22 | 24 | <string>1</string> |
23 | 25 | <key>LSRequiresIPhoneOS</key> |
25 | 27 | <key>NSAppTransportSecurity</key> |
26 | 28 | <dict> |
27 | 29 | <key>NSAllowsArbitraryLoads</key> |
30 | <false/> | |
31 | <key>NSAllowsLocalNetworking</key> | |
28 | 32 | <true/> |
29 | <key>NSExceptionDomains</key> | |
30 | <dict> | |
31 | <key>localhost</key> | |
32 | <dict> | |
33 | <key>NSExceptionAllowsInsecureHTTPLoads</key> | |
34 | <true/> | |
35 | </dict> | |
36 | </dict> | |
37 | 33 | </dict> |
38 | 34 | <key>UILaunchStoryboardName</key> |
39 | 35 | <string>SplashScreen</string> |
41 | 37 | <array> |
42 | 38 | <string>armv7</string> |
43 | 39 | </array> |
40 | <key>UIStatusBarStyle</key> | |
41 | <string>UIStatusBarStyleDefault</string> | |
44 | 42 | <key>UISupportedInterfaceOrientations</key> |
45 | 43 | <array> |
46 | 44 | <string>UIInterfaceOrientationPortrait</string> |
49 | 47 | </array> |
50 | 48 | <key>UIViewControllerBasedStatusBarAppearance</key> |
51 | 49 | <false/> |
52 | <key>UIStatusBarStyle</key> | |
53 | <string>UIStatusBarStyleDefault</string> | |
54 | <key>CADisableMinimumFrameDurationOnPhone</key> | |
55 | <true/> | |
56 | 50 | </dict> |
57 | 51 | </plist> |
MODIFIED
7 | 7 | ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0' |
8 | 8 | ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR'] |
9 | 9 | |
10 | platform :ios, podfile_properties['ios.deploymentTarget'] || '13.0' | |
10 | platform :ios, podfile_properties['ios.deploymentTarget'] || '13.4' | |
11 | 11 | install! 'cocoapods', |
12 | 12 | :deterministic_uuids => false |
13 | 13 | |
44 | 44 | use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] |
45 | 45 | use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS'] |
46 | 46 | |
47 | # Flags change depending on the env values. | |
48 | flags = get_default_flags() | |
49 | ||
50 | 47 | use_react_native!( |
51 | 48 | :path => config[:reactNativePath], |
52 | 49 | :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes', |
53 | :fabric_enabled => flags[:fabric_enabled], | |
54 | 50 | # An absolute path to your application root. |
55 | 51 | :app_path => "#{Pod::Config.instance.installation_root}/..", |
56 | 52 | # Note that if you have use_frameworks! enabled, Flipper will not work if enabled |
63 | 59 | config[:reactNativePath], |
64 | 60 | :mac_catalyst_enabled => false |
65 | 61 | ) |
66 | __apply_Xcode_12_5_M1_post_install_workaround(installer) | |
67 | 62 | |
68 | 63 | # This is necessary for Xcode 14, because it signs resource bundles by default |
69 | 64 | # when building for devices. |
MODIFIED
1 | 1 | { |
2 | 2 | "name": "expo-template-bare-minimum", |
3 | 3 | "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", | |
5 | 5 | "main": "index.js", |
6 | 6 | "scripts": { |
7 | 7 | "start": "expo start --dev-client", |
10 | 10 | "web": "expo start --web" |
11 | 11 | }, |
12 | 12 | "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", | |
16 | 15 | "react": "18.2.0", |
17 | "react-native": "0.72.6" | |
16 | "react-native": "0.73.4" | |
18 | 17 | }, |
19 | 18 | "devDependencies": { |
20 | 19 | "@babel/core": "^7.20.0" |