expo 55.0.0-canary-20250919-7a31b96 → 55.0.0-canary-20251003-7b9d7ff
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +5 -5
- package/android/src/main/java/expo/modules/ExpoReactHostFactory.kt +84 -14
- package/android/src/main/java/expo/modules/ReactActivityDelegateWrapper.kt +1 -1
- package/android/src/test/java/expo/modules/ReactActivityDelegateWrapperDelayLoadTest.kt +2 -3
- package/bundledNativeModules.json +84 -84
- package/ios/AppDelegates/ExpoAppDelegate.swift +29 -301
- package/package.json +21 -21
- package/template.tgz +0 -0
package/android/build.gradle
CHANGED
|
@@ -32,7 +32,7 @@ buildscript {
|
|
|
32
32
|
def reactNativeVersion = project.extensions.getByType(ExpoModuleExtension).reactNativeVersion
|
|
33
33
|
|
|
34
34
|
group = 'host.exp.exponent'
|
|
35
|
-
version = '55.0.0-canary-
|
|
35
|
+
version = '55.0.0-canary-20251003-7b9d7ff'
|
|
36
36
|
|
|
37
37
|
expoModule {
|
|
38
38
|
// We can't prebuild the module because it depends on the generated files.
|
|
@@ -43,7 +43,7 @@ android {
|
|
|
43
43
|
namespace "expo.core"
|
|
44
44
|
defaultConfig {
|
|
45
45
|
versionCode 1
|
|
46
|
-
versionName "55.0.0-canary-
|
|
46
|
+
versionName "55.0.0-canary-20251003-7b9d7ff"
|
|
47
47
|
consumerProguardFiles("proguard-rules.pro")
|
|
48
48
|
}
|
|
49
49
|
testOptions {
|
|
@@ -65,11 +65,11 @@ dependencies { dependencyHandler ->
|
|
|
65
65
|
implementation 'com.facebook.react:react-android'
|
|
66
66
|
|
|
67
67
|
testImplementation 'junit:junit:4.13.2'
|
|
68
|
-
testImplementation 'androidx.test:core:1.5.0'
|
|
69
|
-
testImplementation "com.google.truth:truth:1.1.2"
|
|
70
68
|
testImplementation 'io.mockk:mockk:1.13.5'
|
|
69
|
+
testImplementation 'androidx.test:core:1.7.0'
|
|
70
|
+
testImplementation "com.google.truth:truth:1.4.5"
|
|
71
71
|
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2'
|
|
72
|
-
testImplementation 'org.robolectric:robolectric:4.
|
|
72
|
+
testImplementation 'org.robolectric:robolectric:4.16'
|
|
73
73
|
|
|
74
74
|
if (useLegacyAutolinking) {
|
|
75
75
|
// Link expo modules as dependencies of the adapter. It uses `api` configuration so they all will be visible for the app as well.
|
|
@@ -11,6 +11,7 @@ import com.facebook.react.ReactPackageTurboModuleManagerDelegate
|
|
|
11
11
|
import com.facebook.react.bridge.JSBundleLoader
|
|
12
12
|
import com.facebook.react.bridge.ReactContext
|
|
13
13
|
import com.facebook.react.common.annotations.UnstableReactNativeAPI
|
|
14
|
+
import com.facebook.react.common.build.ReactBuildConfig
|
|
14
15
|
import com.facebook.react.defaults.DefaultComponentsRegistry
|
|
15
16
|
import com.facebook.react.defaults.DefaultTurboModuleManagerDelegate
|
|
16
17
|
import com.facebook.react.fabric.ComponentFactory
|
|
@@ -19,6 +20,7 @@ import com.facebook.react.runtime.JSRuntimeFactory
|
|
|
19
20
|
import com.facebook.react.runtime.ReactHostDelegate
|
|
20
21
|
import com.facebook.react.runtime.ReactHostImpl
|
|
21
22
|
import com.facebook.react.runtime.hermes.HermesInstance
|
|
23
|
+
import expo.modules.core.interfaces.ReactNativeHostHandler
|
|
22
24
|
import java.lang.ref.WeakReference
|
|
23
25
|
|
|
24
26
|
object ExpoReactHostFactory {
|
|
@@ -27,10 +29,15 @@ object ExpoReactHostFactory {
|
|
|
27
29
|
@UnstableReactNativeAPI
|
|
28
30
|
private class ExpoReactHostDelegate(
|
|
29
31
|
private val weakContext: WeakReference<Context>,
|
|
30
|
-
private val
|
|
32
|
+
private val packageList: List<ReactPackage>,
|
|
33
|
+
override val jsMainModulePath: String,
|
|
34
|
+
private val jsBundleAssetPath: String?,
|
|
35
|
+
private val jsBundleFilePath: String? = null,
|
|
36
|
+
private val useDevSupport: Boolean,
|
|
31
37
|
override val bindingsInstaller: BindingsInstaller? = null,
|
|
32
38
|
override val turboModuleManagerDelegateBuilder: ReactPackageTurboModuleManagerDelegate.Builder =
|
|
33
|
-
DefaultTurboModuleManagerDelegate.Builder()
|
|
39
|
+
DefaultTurboModuleManagerDelegate.Builder(),
|
|
40
|
+
private val hostHandlers: List<ReactNativeHostHandler>
|
|
34
41
|
) : ReactHostDelegate {
|
|
35
42
|
|
|
36
43
|
// Keeps this `_jsBundleLoader` backing property for DevLauncher to replace its internal value
|
|
@@ -42,33 +49,28 @@ object ExpoReactHostFactory {
|
|
|
42
49
|
return backingJSBundleLoader
|
|
43
50
|
}
|
|
44
51
|
val context = weakContext.get() ?: throw IllegalStateException("Unable to get concrete Context")
|
|
45
|
-
|
|
52
|
+
jsBundleFilePath?.let { jsBundleFile ->
|
|
46
53
|
if (jsBundleFile.startsWith("assets://")) {
|
|
47
54
|
return JSBundleLoader.createAssetLoader(context, jsBundleFile, true)
|
|
48
55
|
}
|
|
49
56
|
return JSBundleLoader.createFileLoader(jsBundleFile)
|
|
50
57
|
}
|
|
51
|
-
|
|
58
|
+
|
|
52
59
|
return JSBundleLoader.createAssetLoader(context, "assets://$jsBundleAssetPath", true)
|
|
53
60
|
}
|
|
54
61
|
|
|
55
|
-
override val jsMainModulePath: String
|
|
56
|
-
get() = reactNativeHostWrapper.jsMainModuleName
|
|
57
|
-
|
|
58
62
|
override val jsRuntimeFactory: JSRuntimeFactory
|
|
59
63
|
get() = HermesInstance()
|
|
60
64
|
|
|
61
65
|
override val reactPackages: List<ReactPackage>
|
|
62
|
-
get() =
|
|
66
|
+
get() = packageList
|
|
63
67
|
|
|
64
68
|
override fun handleInstanceException(error: Exception) {
|
|
65
|
-
|
|
66
|
-
if (handlers.isEmpty()) {
|
|
69
|
+
if (hostHandlers.isEmpty()) {
|
|
67
70
|
throw error
|
|
68
71
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
handler.onReactInstanceException(useDeveloperSupport, error)
|
|
72
|
+
hostHandlers.forEach { handler ->
|
|
73
|
+
handler.onReactInstanceException(useDevSupport, error)
|
|
72
74
|
}
|
|
73
75
|
}
|
|
74
76
|
}
|
|
@@ -84,7 +86,6 @@ object ExpoReactHostFactory {
|
|
|
84
86
|
}
|
|
85
87
|
if (reactHost == null) {
|
|
86
88
|
val useDeveloperSupport = reactNativeHost.useDeveloperSupport
|
|
87
|
-
val reactHostDelegate = ExpoReactHostDelegate(WeakReference(context), reactNativeHost)
|
|
88
89
|
val componentFactory = ComponentFactory()
|
|
89
90
|
DefaultComponentsRegistry.register(componentFactory)
|
|
90
91
|
|
|
@@ -92,6 +93,16 @@ object ExpoReactHostFactory {
|
|
|
92
93
|
handler.onWillCreateReactInstance(useDeveloperSupport)
|
|
93
94
|
}
|
|
94
95
|
|
|
96
|
+
val reactHostDelegate = ExpoReactHostDelegate(
|
|
97
|
+
WeakReference(context),
|
|
98
|
+
reactNativeHost.packages,
|
|
99
|
+
reactNativeHost.jsMainModuleName,
|
|
100
|
+
reactNativeHost.bundleAssetName,
|
|
101
|
+
reactNativeHost.jsBundleFile,
|
|
102
|
+
reactNativeHost.useDeveloperSupport,
|
|
103
|
+
hostHandlers = reactNativeHost.reactNativeHostHandlers
|
|
104
|
+
)
|
|
105
|
+
|
|
95
106
|
val reactHostImpl =
|
|
96
107
|
ReactHostImpl(
|
|
97
108
|
context,
|
|
@@ -117,4 +128,63 @@ object ExpoReactHostFactory {
|
|
|
117
128
|
}
|
|
118
129
|
return reactHost as ReactHost
|
|
119
130
|
}
|
|
131
|
+
|
|
132
|
+
@OptIn(UnstableReactNativeAPI::class)
|
|
133
|
+
@JvmStatic
|
|
134
|
+
fun getDefaultReactHost(
|
|
135
|
+
context: Context,
|
|
136
|
+
packageList: List<ReactPackage>,
|
|
137
|
+
jsMainModulePath: String = ".expo/.virtual-metro-entry",
|
|
138
|
+
jsBundleAssetPath: String = "index.android.bundle",
|
|
139
|
+
jsBundleFilePath: String? = null,
|
|
140
|
+
jsRuntimeFactory: JSRuntimeFactory? = null,
|
|
141
|
+
useDevSupport: Boolean = ReactBuildConfig.DEBUG,
|
|
142
|
+
bindingsInstaller: BindingsInstaller? = null
|
|
143
|
+
): ReactHost {
|
|
144
|
+
if (reactHost == null) {
|
|
145
|
+
val hostHandlers = ExpoModulesPackage.packageList
|
|
146
|
+
.flatMap { it.createReactNativeHostHandlers(context) }
|
|
147
|
+
|
|
148
|
+
val reactHostDelegate = ExpoReactHostDelegate(
|
|
149
|
+
WeakReference(context),
|
|
150
|
+
packageList,
|
|
151
|
+
jsMainModulePath,
|
|
152
|
+
jsBundleAssetPath,
|
|
153
|
+
jsBundleFilePath,
|
|
154
|
+
useDevSupport,
|
|
155
|
+
bindingsInstaller,
|
|
156
|
+
hostHandlers = hostHandlers
|
|
157
|
+
)
|
|
158
|
+
val componentFactory = ComponentFactory()
|
|
159
|
+
DefaultComponentsRegistry.register(componentFactory)
|
|
160
|
+
|
|
161
|
+
hostHandlers.forEach { handler ->
|
|
162
|
+
handler.onWillCreateReactInstance(useDevSupport)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
val reactHostImpl =
|
|
166
|
+
ReactHostImpl(
|
|
167
|
+
context,
|
|
168
|
+
reactHostDelegate,
|
|
169
|
+
componentFactory,
|
|
170
|
+
true,
|
|
171
|
+
useDevSupport
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
hostHandlers.forEach { handler ->
|
|
175
|
+
handler.onDidCreateDevSupportManager(reactHostImpl.devSupportManager)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
reactHostImpl.addReactInstanceEventListener(object : ReactInstanceEventListener {
|
|
179
|
+
override fun onReactContextInitialized(context: ReactContext) {
|
|
180
|
+
hostHandlers.forEach { handler ->
|
|
181
|
+
handler.onDidCreateReactInstance(useDevSupport, context)
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
reactHost = reactHostImpl
|
|
187
|
+
}
|
|
188
|
+
return reactHost as ReactHost
|
|
189
|
+
}
|
|
120
190
|
}
|
|
@@ -64,7 +64,7 @@ class ReactActivityDelegateWrapper(
|
|
|
64
64
|
}
|
|
65
65
|
private val delayLoadAppHandler: DelayLoadAppHandler? by lazy {
|
|
66
66
|
reactActivityHandlers.asSequence()
|
|
67
|
-
.mapNotNull { it.getDelayLoadAppHandler(activity,
|
|
67
|
+
.mapNotNull { it.getDelayLoadAppHandler(activity, reactHost) }
|
|
68
68
|
.firstOrNull()
|
|
69
69
|
}
|
|
70
70
|
|
|
@@ -7,12 +7,12 @@ import com.facebook.react.ReactActivity
|
|
|
7
7
|
import com.facebook.react.ReactActivityDelegate
|
|
8
8
|
import com.facebook.react.ReactApplication
|
|
9
9
|
import com.facebook.react.ReactHost
|
|
10
|
-
import com.facebook.react.ReactNativeHost
|
|
11
10
|
import com.facebook.react.ReactRootView
|
|
12
11
|
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
|
|
13
12
|
import com.facebook.react.defaults.DefaultReactActivityDelegate
|
|
14
13
|
import com.facebook.react.interfaces.fabric.ReactSurface
|
|
15
14
|
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags
|
|
15
|
+
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests
|
|
16
16
|
import com.facebook.soloader.SoLoader
|
|
17
17
|
import expo.modules.core.interfaces.Package
|
|
18
18
|
import expo.modules.core.interfaces.ReactActivityHandler
|
|
@@ -59,6 +59,7 @@ internal class ReactActivityDelegateWrapperDelayLoadTest {
|
|
|
59
59
|
fun setUp() {
|
|
60
60
|
SoLoader.setInTestMode()
|
|
61
61
|
mockkObject(ExpoModulesPackage.Companion)
|
|
62
|
+
ReactNativeFeatureFlagsForTests.setUp()
|
|
62
63
|
mockkStatic(ReactNativeFeatureFlags::class)
|
|
63
64
|
every { ReactNativeFeatureFlags.enableBridgelessArchitecture() } returns true
|
|
64
65
|
every { ReactNativeFeatureFlags.enableFabricRenderer() } returns true
|
|
@@ -251,8 +252,6 @@ internal class MockApplication : Application(), ReactApplication {
|
|
|
251
252
|
currentActivity = activity
|
|
252
253
|
}
|
|
253
254
|
|
|
254
|
-
override val reactNativeHost: ReactNativeHost = mockk<ReactNativeHost>(relaxed = true)
|
|
255
|
-
|
|
256
255
|
override val reactHost: ReactHost by lazy {
|
|
257
256
|
mockk<ReactHost>(relaxed = true)
|
|
258
257
|
.also {
|
|
@@ -1,99 +1,99 @@
|
|
|
1
1
|
{
|
|
2
|
-
"@expo/fingerprint": "0.15.2-canary-
|
|
3
|
-
"@expo/metro-runtime": "6.1.3-canary-
|
|
2
|
+
"@expo/fingerprint": "0.15.2-canary-20251003-7b9d7ff",
|
|
3
|
+
"@expo/metro-runtime": "6.1.3-canary-20251003-7b9d7ff",
|
|
4
4
|
"@expo/vector-icons": "^15.0.2",
|
|
5
|
-
"@expo/ui": "0.2.0-canary-
|
|
5
|
+
"@expo/ui": "0.2.0-canary-20251003-7b9d7ff",
|
|
6
6
|
"@react-native-async-storage/async-storage": "2.2.0",
|
|
7
7
|
"@react-native-community/datetimepicker": "8.4.4",
|
|
8
8
|
"@react-native-masked-view/masked-view": "0.3.2",
|
|
9
9
|
"@react-native-community/netinfo": "11.4.1",
|
|
10
10
|
"@react-native-community/slider": "5.0.1",
|
|
11
11
|
"@react-native-community/viewpager": "5.0.11",
|
|
12
|
-
"@react-native-picker/picker": "2.11.
|
|
12
|
+
"@react-native-picker/picker": "2.11.2",
|
|
13
13
|
"@react-native-segmented-control/segmented-control": "2.5.7",
|
|
14
14
|
"@stripe/stripe-react-native": "0.50.3",
|
|
15
|
-
"eslint-config-expo": "10.0.1-canary-
|
|
15
|
+
"eslint-config-expo": "10.0.1-canary-20251003-7b9d7ff",
|
|
16
16
|
"expo-analytics-amplitude": "~11.3.0",
|
|
17
17
|
"expo-app-auth": "~11.1.0",
|
|
18
18
|
"expo-app-loader-provider": "~8.0.0",
|
|
19
|
-
"expo-apple-authentication": "8.0.8-canary-
|
|
20
|
-
"expo-application": "7.0.8-canary-
|
|
21
|
-
"expo-asset": "12.0.10-canary-
|
|
22
|
-
"expo-audio": "1.0
|
|
23
|
-
"expo-auth-session": "7.0.9-canary-
|
|
24
|
-
"expo-av": "16.0.8-canary-
|
|
25
|
-
"expo-background-fetch": "14.0.8-canary-
|
|
26
|
-
"expo-background-task": "1.
|
|
27
|
-
"expo-battery": "10.0.8-canary-
|
|
28
|
-
"expo-blur": "15.0.8-canary-
|
|
29
|
-
"expo-brightness": "14.0.8-canary-
|
|
30
|
-
"expo-build-properties": "1.0.10-canary-
|
|
31
|
-
"expo-calendar": "15.0.8-canary-
|
|
32
|
-
"expo-camera": "17.0.9-canary-
|
|
33
|
-
"expo-cellular": "8.0.8-canary-
|
|
34
|
-
"expo-checkbox": "5.0.8-canary-
|
|
35
|
-
"expo-clipboard": "8.0.8-canary-
|
|
36
|
-
"expo-constants": "18.0.10-canary-
|
|
37
|
-
"expo-contacts": "15.0.
|
|
38
|
-
"expo-crypto": "15.0.8-canary-
|
|
39
|
-
"expo-dev-client": "6.0.
|
|
40
|
-
"expo-device": "8.
|
|
41
|
-
"expo-document-picker": "14.0.8-canary-
|
|
42
|
-
"expo-file-system": "19.
|
|
43
|
-
"expo-font": "14.0.9-canary-
|
|
44
|
-
"expo-gl": "16.0.8-canary-
|
|
45
|
-
"expo-glass-effect": "0.1.5-canary-
|
|
19
|
+
"expo-apple-authentication": "8.0.8-canary-20251003-7b9d7ff",
|
|
20
|
+
"expo-application": "7.0.8-canary-20251003-7b9d7ff",
|
|
21
|
+
"expo-asset": "12.0.10-canary-20251003-7b9d7ff",
|
|
22
|
+
"expo-audio": "1.1.0-canary-20251003-7b9d7ff",
|
|
23
|
+
"expo-auth-session": "7.0.9-canary-20251003-7b9d7ff",
|
|
24
|
+
"expo-av": "16.0.8-canary-20251003-7b9d7ff",
|
|
25
|
+
"expo-background-fetch": "14.0.8-canary-20251003-7b9d7ff",
|
|
26
|
+
"expo-background-task": "1.0.9-canary-20251003-7b9d7ff",
|
|
27
|
+
"expo-battery": "10.0.8-canary-20251003-7b9d7ff",
|
|
28
|
+
"expo-blur": "15.0.8-canary-20251003-7b9d7ff",
|
|
29
|
+
"expo-brightness": "14.0.8-canary-20251003-7b9d7ff",
|
|
30
|
+
"expo-build-properties": "1.0.10-canary-20251003-7b9d7ff",
|
|
31
|
+
"expo-calendar": "15.0.8-canary-20251003-7b9d7ff",
|
|
32
|
+
"expo-camera": "17.0.9-canary-20251003-7b9d7ff",
|
|
33
|
+
"expo-cellular": "8.0.8-canary-20251003-7b9d7ff",
|
|
34
|
+
"expo-checkbox": "5.0.8-canary-20251003-7b9d7ff",
|
|
35
|
+
"expo-clipboard": "8.0.8-canary-20251003-7b9d7ff",
|
|
36
|
+
"expo-constants": "18.0.10-canary-20251003-7b9d7ff",
|
|
37
|
+
"expo-contacts": "15.0.10-canary-20251003-7b9d7ff",
|
|
38
|
+
"expo-crypto": "15.0.8-canary-20251003-7b9d7ff",
|
|
39
|
+
"expo-dev-client": "6.0.14-canary-20251003-7b9d7ff",
|
|
40
|
+
"expo-device": "8.0.10-canary-20251003-7b9d7ff",
|
|
41
|
+
"expo-document-picker": "14.0.8-canary-20251003-7b9d7ff",
|
|
42
|
+
"expo-file-system": "19.0.17-canary-20251003-7b9d7ff",
|
|
43
|
+
"expo-font": "14.0.9-canary-20251003-7b9d7ff",
|
|
44
|
+
"expo-gl": "16.0.8-canary-20251003-7b9d7ff",
|
|
45
|
+
"expo-glass-effect": "0.1.5-canary-20251003-7b9d7ff",
|
|
46
46
|
"expo-google-app-auth": "~8.3.0",
|
|
47
|
-
"expo-haptics": "15.0.8-canary-
|
|
48
|
-
"expo-image": "3.1.0-canary-
|
|
49
|
-
"expo-image-loader": "6.0.1-canary-
|
|
50
|
-
"expo-image-manipulator": "14.0.8-canary-
|
|
51
|
-
"expo-image-picker": "17.0.9-canary-
|
|
52
|
-
"expo-intent-launcher": "13.0.8-canary-
|
|
53
|
-
"expo-insights": "0.10.8-canary-
|
|
54
|
-
"expo-keep-awake": "15.0.8-canary-
|
|
55
|
-
"expo-linear-gradient": "15.0.8-canary-
|
|
56
|
-
"expo-linking": "8.0.9-canary-
|
|
57
|
-
"expo-local-authentication": "17.0.8-canary-
|
|
58
|
-
"expo-localization": "17.0.8-canary-
|
|
59
|
-
"expo-location": "19.0.8-canary-
|
|
60
|
-
"expo-mail-composer": "15.0.8-canary-
|
|
61
|
-
"expo-manifests": "1.0.9-canary-
|
|
62
|
-
"expo-maps": "0.12.
|
|
63
|
-
"expo-media-library": "18.3.0-canary-
|
|
64
|
-
"expo-mesh-gradient": "0.4.8-canary-
|
|
65
|
-
"expo-module-template": "11.0.
|
|
66
|
-
"expo-modules-core": "3.0
|
|
67
|
-
"expo-navigation-bar": "5.0.9-canary-
|
|
68
|
-
"expo-network": "8.0.8-canary-
|
|
69
|
-
"expo-notifications": "0.
|
|
70
|
-
"expo-print": "15.0.8-canary-
|
|
71
|
-
"expo-live-photo": "1.0.8-canary-
|
|
72
|
-
"expo-router": "6.0
|
|
73
|
-
"expo-screen-capture": "8.0.9-canary-
|
|
74
|
-
"expo-screen-orientation": "9.0.8-canary-
|
|
75
|
-
"expo-secure-store": "15.0.8-canary-
|
|
76
|
-
"expo-sensors": "15.0.8-canary-
|
|
77
|
-
"expo-sharing": "14.0.8-canary-
|
|
78
|
-
"expo-sms": "14.0.8-canary-
|
|
79
|
-
"expo-speech": "14.0.8-canary-
|
|
80
|
-
"expo-splash-screen": "31.0.11-canary-
|
|
81
|
-
"expo-sqlite": "16.0.9-canary-
|
|
82
|
-
"expo-status-bar": "3.0.9-canary-
|
|
83
|
-
"expo-store-review": "9.0.
|
|
84
|
-
"expo-symbols": "1.0
|
|
85
|
-
"expo-system-ui": "6.0.8-canary-
|
|
86
|
-
"expo-task-manager": "14.0.8-canary-
|
|
87
|
-
"expo-tracking-transparency": "6.0.8-canary-
|
|
88
|
-
"expo-updates": "29.1.0-canary-
|
|
89
|
-
"expo-video-thumbnails": "10.0.8-canary-
|
|
90
|
-
"expo-video": "3.0.12-canary-
|
|
91
|
-
"expo-web-browser": "15.0.
|
|
92
|
-
"jest-expo": "55.0.0-canary-
|
|
47
|
+
"expo-haptics": "15.0.8-canary-20251003-7b9d7ff",
|
|
48
|
+
"expo-image": "3.1.0-canary-20251003-7b9d7ff",
|
|
49
|
+
"expo-image-loader": "6.0.1-canary-20251003-7b9d7ff",
|
|
50
|
+
"expo-image-manipulator": "14.0.8-canary-20251003-7b9d7ff",
|
|
51
|
+
"expo-image-picker": "17.0.9-canary-20251003-7b9d7ff",
|
|
52
|
+
"expo-intent-launcher": "13.0.8-canary-20251003-7b9d7ff",
|
|
53
|
+
"expo-insights": "0.10.8-canary-20251003-7b9d7ff",
|
|
54
|
+
"expo-keep-awake": "15.0.8-canary-20251003-7b9d7ff",
|
|
55
|
+
"expo-linear-gradient": "15.0.8-canary-20251003-7b9d7ff",
|
|
56
|
+
"expo-linking": "8.0.9-canary-20251003-7b9d7ff",
|
|
57
|
+
"expo-local-authentication": "17.0.8-canary-20251003-7b9d7ff",
|
|
58
|
+
"expo-localization": "17.0.8-canary-20251003-7b9d7ff",
|
|
59
|
+
"expo-location": "19.0.8-canary-20251003-7b9d7ff",
|
|
60
|
+
"expo-mail-composer": "15.0.8-canary-20251003-7b9d7ff",
|
|
61
|
+
"expo-manifests": "1.0.9-canary-20251003-7b9d7ff",
|
|
62
|
+
"expo-maps": "0.12.9-canary-20251003-7b9d7ff",
|
|
63
|
+
"expo-media-library": "18.3.0-canary-20251003-7b9d7ff",
|
|
64
|
+
"expo-mesh-gradient": "0.4.8-canary-20251003-7b9d7ff",
|
|
65
|
+
"expo-module-template": "11.0.16-canary-20251003-7b9d7ff",
|
|
66
|
+
"expo-modules-core": "3.1.0-canary-20251003-7b9d7ff",
|
|
67
|
+
"expo-navigation-bar": "5.0.9-canary-20251003-7b9d7ff",
|
|
68
|
+
"expo-network": "8.0.8-canary-20251003-7b9d7ff",
|
|
69
|
+
"expo-notifications": "1.0.0-canary-20251003-7b9d7ff",
|
|
70
|
+
"expo-print": "15.0.8-canary-20251003-7b9d7ff",
|
|
71
|
+
"expo-live-photo": "1.0.8-canary-20251003-7b9d7ff",
|
|
72
|
+
"expo-router": "6.1.0-canary-20251003-7b9d7ff",
|
|
73
|
+
"expo-screen-capture": "8.0.9-canary-20251003-7b9d7ff",
|
|
74
|
+
"expo-screen-orientation": "9.0.8-canary-20251003-7b9d7ff",
|
|
75
|
+
"expo-secure-store": "15.0.8-canary-20251003-7b9d7ff",
|
|
76
|
+
"expo-sensors": "15.0.8-canary-20251003-7b9d7ff",
|
|
77
|
+
"expo-sharing": "14.0.8-canary-20251003-7b9d7ff",
|
|
78
|
+
"expo-sms": "14.0.8-canary-20251003-7b9d7ff",
|
|
79
|
+
"expo-speech": "14.0.8-canary-20251003-7b9d7ff",
|
|
80
|
+
"expo-splash-screen": "31.0.11-canary-20251003-7b9d7ff",
|
|
81
|
+
"expo-sqlite": "16.0.9-canary-20251003-7b9d7ff",
|
|
82
|
+
"expo-status-bar": "3.0.9-canary-20251003-7b9d7ff",
|
|
83
|
+
"expo-store-review": "9.0.9-canary-20251003-7b9d7ff",
|
|
84
|
+
"expo-symbols": "1.1.0-canary-20251003-7b9d7ff",
|
|
85
|
+
"expo-system-ui": "6.0.8-canary-20251003-7b9d7ff",
|
|
86
|
+
"expo-task-manager": "14.0.8-canary-20251003-7b9d7ff",
|
|
87
|
+
"expo-tracking-transparency": "6.0.8-canary-20251003-7b9d7ff",
|
|
88
|
+
"expo-updates": "29.1.0-canary-20251003-7b9d7ff",
|
|
89
|
+
"expo-video-thumbnails": "10.0.8-canary-20251003-7b9d7ff",
|
|
90
|
+
"expo-video": "3.0.12-canary-20251003-7b9d7ff",
|
|
91
|
+
"expo-web-browser": "15.0.9-canary-20251003-7b9d7ff",
|
|
92
|
+
"jest-expo": "55.0.0-canary-20251003-7b9d7ff",
|
|
93
93
|
"lottie-react-native": "~7.3.1",
|
|
94
|
-
"react": "19.1.
|
|
95
|
-
"react-dom": "19.1.
|
|
96
|
-
"react-native": "0.
|
|
94
|
+
"react": "19.1.1",
|
|
95
|
+
"react-dom": "19.1.1",
|
|
96
|
+
"react-native": "0.82.0-rc.5",
|
|
97
97
|
"react-native-web": "~0.21.0",
|
|
98
98
|
"react-native-gesture-handler": "~2.28.0",
|
|
99
99
|
"react-native-get-random-values": "~1.11.0",
|
|
@@ -101,17 +101,17 @@
|
|
|
101
101
|
"react-native-maps": "1.20.1",
|
|
102
102
|
"react-native-pager-view": "6.9.1",
|
|
103
103
|
"react-native-worklets": "0.5.1",
|
|
104
|
-
"react-native-reanimated": "~4.1.
|
|
104
|
+
"react-native-reanimated": "~4.1.1",
|
|
105
105
|
"react-native-screens": "~4.16.0",
|
|
106
106
|
"react-native-safe-area-context": "~5.6.0",
|
|
107
107
|
"react-native-svg": "15.12.1",
|
|
108
108
|
"react-native-view-shot": "4.0.3",
|
|
109
109
|
"react-native-webview": "13.15.0",
|
|
110
110
|
"sentry-expo": "~7.0.0",
|
|
111
|
-
"unimodules-app-loader": "6.0.8-canary-
|
|
111
|
+
"unimodules-app-loader": "6.0.8-canary-20251003-7b9d7ff",
|
|
112
112
|
"unimodules-image-loader-interface": "~6.1.0",
|
|
113
113
|
"@shopify/react-native-skia": "2.2.12",
|
|
114
114
|
"@shopify/flash-list": "2.0.2",
|
|
115
|
-
"@sentry/react-native": "~
|
|
115
|
+
"@sentry/react-native": "~7.1.0",
|
|
116
116
|
"react-native-bootsplash": "^6.3.10"
|
|
117
117
|
}
|
|
@@ -18,52 +18,23 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
|
|
|
18
18
|
_ application: UIApplication,
|
|
19
19
|
willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
|
|
20
20
|
) -> Bool {
|
|
21
|
-
|
|
22
|
-
$0.responds(to: #selector(application(_:willFinishLaunchingWithOptions:)))
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// If we can't find a subscriber that implements `willFinishLaunchingWithOptions`, we will delegate the decision if we can handel the passed URL to
|
|
26
|
-
// the `didFinishLaunchingWithOptions` method by returning `true` here.
|
|
27
|
-
// You can read more about how iOS handles deep links here: https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application#discussion
|
|
28
|
-
if parsedSubscribers.isEmpty {
|
|
29
|
-
return true
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return parsedSubscribers.reduce(false) { result, subscriber in
|
|
33
|
-
return subscriber.application?(application, willFinishLaunchingWithOptions: launchOptions) ?? false || result
|
|
34
|
-
}
|
|
21
|
+
return ExpoAppDelegateSubscriberManager.application(application, willFinishLaunchingWithOptions: launchOptions)
|
|
35
22
|
}
|
|
36
23
|
|
|
37
24
|
open func application(
|
|
38
25
|
_ application: UIApplication,
|
|
39
26
|
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
|
|
40
27
|
) -> Bool {
|
|
41
|
-
|
|
42
|
-
// Subscriber result is ignored as it doesn't matter if any subscriber handled the incoming URL – we always return `true` anyway.
|
|
43
|
-
_ = subscriber.application?(application, didFinishLaunchingWithOptions: launchOptions)
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return true
|
|
28
|
+
return ExpoAppDelegateSubscriberManager.application(application, didFinishLaunchingWithOptions: launchOptions)
|
|
47
29
|
}
|
|
48
30
|
|
|
49
31
|
#elseif os(macOS)
|
|
50
32
|
open func applicationWillFinishLaunching(_ notification: Notification) {
|
|
51
|
-
|
|
52
|
-
$0.responds(to: #selector(applicationWillFinishLaunching(_:)))
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
parsedSubscribers.forEach { subscriber in
|
|
56
|
-
subscriber.applicationWillFinishLaunching?(notification)
|
|
57
|
-
}
|
|
33
|
+
ExpoAppDelegateSubscriberManager.applicationWillFinishLaunching(notification)
|
|
58
34
|
}
|
|
59
35
|
|
|
60
36
|
open func applicationDidFinishLaunching(_ notification: Notification) {
|
|
61
|
-
|
|
62
|
-
.subscribers
|
|
63
|
-
.forEach { subscriber in
|
|
64
|
-
// Subscriber result is ignored as it doesn't matter if any subscriber handled the incoming URL – we always return `true` anyway.
|
|
65
|
-
_ = subscriber.applicationDidFinishLaunching?(notification)
|
|
66
|
-
}
|
|
37
|
+
ExpoAppDelegateSubscriberManager.applicationDidFinishLaunching(notification)
|
|
67
38
|
}
|
|
68
39
|
|
|
69
40
|
// TODO: - Configuring and Discarding Scenes
|
|
@@ -75,69 +46,49 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
|
|
|
75
46
|
|
|
76
47
|
@objc
|
|
77
48
|
open func applicationDidBecomeActive(_ application: UIApplication) {
|
|
78
|
-
|
|
79
|
-
.subscribers
|
|
80
|
-
.forEach { $0.applicationDidBecomeActive?(application) }
|
|
49
|
+
ExpoAppDelegateSubscriberManager.applicationDidBecomeActive(application)
|
|
81
50
|
}
|
|
82
51
|
|
|
83
52
|
@objc
|
|
84
53
|
open func applicationWillResignActive(_ application: UIApplication) {
|
|
85
|
-
|
|
86
|
-
.subscribers
|
|
87
|
-
.forEach { $0.applicationWillResignActive?(application) }
|
|
54
|
+
ExpoAppDelegateSubscriberManager.applicationWillResignActive(application)
|
|
88
55
|
}
|
|
89
56
|
|
|
90
57
|
@objc
|
|
91
58
|
open func applicationDidEnterBackground(_ application: UIApplication) {
|
|
92
|
-
|
|
93
|
-
.subscribers
|
|
94
|
-
.forEach { $0.applicationDidEnterBackground?(application) }
|
|
59
|
+
ExpoAppDelegateSubscriberManager.applicationDidEnterBackground(application)
|
|
95
60
|
}
|
|
96
61
|
|
|
97
62
|
open func applicationWillEnterForeground(_ application: UIApplication) {
|
|
98
|
-
|
|
99
|
-
.subscribers
|
|
100
|
-
.forEach { $0.applicationWillEnterForeground?(application) }
|
|
63
|
+
ExpoAppDelegateSubscriberManager.applicationWillEnterForeground(application)
|
|
101
64
|
}
|
|
102
65
|
|
|
103
66
|
open func applicationWillTerminate(_ application: UIApplication) {
|
|
104
|
-
|
|
105
|
-
.subscribers
|
|
106
|
-
.forEach { $0.applicationWillTerminate?(application) }
|
|
67
|
+
ExpoAppDelegateSubscriberManager.applicationWillTerminate(application)
|
|
107
68
|
}
|
|
108
69
|
|
|
109
70
|
#elseif os(macOS)
|
|
110
71
|
@objc
|
|
111
72
|
open func applicationDidBecomeActive(_ notification: Notification) {
|
|
112
|
-
|
|
113
|
-
.subscribers
|
|
114
|
-
.forEach { $0.applicationDidBecomeActive?(notification) }
|
|
73
|
+
ExpoAppDelegateSubscriberManager.applicationDidBecomeActive(notification)
|
|
115
74
|
}
|
|
116
75
|
|
|
117
76
|
@objc
|
|
118
77
|
open func applicationWillResignActive(_ notification: Notification) {
|
|
119
|
-
|
|
120
|
-
.subscribers
|
|
121
|
-
.forEach { $0.applicationWillResignActive?(notification) }
|
|
78
|
+
ExpoAppDelegateSubscriberManager.applicationWillResignActive(notification)
|
|
122
79
|
}
|
|
123
80
|
|
|
124
81
|
@objc
|
|
125
82
|
open func applicationDidHide(_ notification: Notification) {
|
|
126
|
-
|
|
127
|
-
.subscribers
|
|
128
|
-
.forEach { $0.applicationDidHide?(notification) }
|
|
83
|
+
ExpoAppDelegateSubscriberManager.applicationDidHide(notification)
|
|
129
84
|
}
|
|
130
85
|
|
|
131
86
|
open func applicationWillUnhide(_ notification: Notification) {
|
|
132
|
-
|
|
133
|
-
.subscribers
|
|
134
|
-
.forEach { $0.applicationWillUnhide?(notification) }
|
|
87
|
+
ExpoAppDelegateSubscriberManager.applicationWillUnhide(notification)
|
|
135
88
|
}
|
|
136
89
|
|
|
137
90
|
open func applicationWillTerminate(_ notification: Notification) {
|
|
138
|
-
|
|
139
|
-
.subscribers
|
|
140
|
-
.forEach { $0.applicationWillTerminate?(notification) }
|
|
91
|
+
ExpoAppDelegateSubscriberManager.applicationWillTerminate(notification)
|
|
141
92
|
}
|
|
142
93
|
#endif
|
|
143
94
|
|
|
@@ -153,28 +104,7 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
|
|
|
153
104
|
handleEventsForBackgroundURLSession identifier: String,
|
|
154
105
|
completionHandler: @escaping () -> Void
|
|
155
106
|
) {
|
|
156
|
-
|
|
157
|
-
let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
|
|
158
|
-
var subscribersLeft = subs.count
|
|
159
|
-
let dispatchQueue = DispatchQueue(label: "expo.application.handleBackgroundEvents")
|
|
160
|
-
|
|
161
|
-
let handler = {
|
|
162
|
-
dispatchQueue.sync {
|
|
163
|
-
subscribersLeft -= 1
|
|
164
|
-
|
|
165
|
-
if subscribersLeft == 0 {
|
|
166
|
-
completionHandler()
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
if subs.isEmpty {
|
|
172
|
-
completionHandler()
|
|
173
|
-
} else {
|
|
174
|
-
subs.forEach {
|
|
175
|
-
$0.application?(application, handleEventsForBackgroundURLSession: identifier, completionHandler: handler)
|
|
176
|
-
}
|
|
177
|
-
}
|
|
107
|
+
ExpoAppDelegateSubscriberManager.application(application, handleEventsForBackgroundURLSession: identifier, completionHandler: completionHandler)
|
|
178
108
|
}
|
|
179
109
|
|
|
180
110
|
#endif
|
|
@@ -182,15 +112,11 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
|
|
|
182
112
|
// MARK: - Handling Remote Notification Registration
|
|
183
113
|
|
|
184
114
|
open func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
|
|
185
|
-
|
|
186
|
-
.subscribers
|
|
187
|
-
.forEach { $0.application?(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken) }
|
|
115
|
+
ExpoAppDelegateSubscriberManager.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
|
|
188
116
|
}
|
|
189
117
|
|
|
190
118
|
open func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
|
|
191
|
-
|
|
192
|
-
.subscribers
|
|
193
|
-
.forEach { $0.application?(application, didFailToRegisterForRemoteNotificationsWithError: error) }
|
|
119
|
+
ExpoAppDelegateSubscriberManager.application(application, didFailToRegisterForRemoteNotificationsWithError: error)
|
|
194
120
|
}
|
|
195
121
|
|
|
196
122
|
#if os(iOS) || os(tvOS)
|
|
@@ -199,42 +125,7 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
|
|
|
199
125
|
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
|
|
200
126
|
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
|
|
201
127
|
) {
|
|
202
|
-
|
|
203
|
-
let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
|
|
204
|
-
var subscribersLeft = subs.count
|
|
205
|
-
let dispatchQueue = DispatchQueue(label: "expo.application.remoteNotification", qos: .userInteractive)
|
|
206
|
-
var failedCount = 0
|
|
207
|
-
var newDataCount = 0
|
|
208
|
-
|
|
209
|
-
let handler = { (result: UIBackgroundFetchResult) in
|
|
210
|
-
dispatchQueue.sync {
|
|
211
|
-
if result == .failed {
|
|
212
|
-
failedCount += 1
|
|
213
|
-
} else if result == .newData {
|
|
214
|
-
newDataCount += 1
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
subscribersLeft -= 1
|
|
218
|
-
|
|
219
|
-
if subscribersLeft == 0 {
|
|
220
|
-
if newDataCount > 0 {
|
|
221
|
-
completionHandler(.newData)
|
|
222
|
-
} else if failedCount > 0 {
|
|
223
|
-
completionHandler(.failed)
|
|
224
|
-
} else {
|
|
225
|
-
completionHandler(.noData)
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
if subs.isEmpty {
|
|
232
|
-
completionHandler(.noData)
|
|
233
|
-
} else {
|
|
234
|
-
subs.forEach { subscriber in
|
|
235
|
-
subscriber.application?(application, didReceiveRemoteNotification: userInfo, fetchCompletionHandler: handler)
|
|
236
|
-
}
|
|
237
|
-
}
|
|
128
|
+
ExpoAppDelegateSubscriberManager.application(application, didReceiveRemoteNotification: userInfo, fetchCompletionHandler: completionHandler)
|
|
238
129
|
}
|
|
239
130
|
|
|
240
131
|
#elseif os(macOS)
|
|
@@ -242,23 +133,14 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
|
|
|
242
133
|
_ application: NSApplication,
|
|
243
134
|
didReceiveRemoteNotification userInfo: [String: Any]
|
|
244
135
|
) {
|
|
245
|
-
|
|
246
|
-
let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
|
|
247
|
-
|
|
248
|
-
subs.forEach { subscriber in
|
|
249
|
-
subscriber.application?(application, didReceiveRemoteNotification: userInfo)
|
|
250
|
-
}
|
|
136
|
+
ExpoAppDelegateSubscriberManager.application(application, didReceiveRemoteNotification: userInfo)
|
|
251
137
|
}
|
|
252
138
|
#endif
|
|
253
139
|
|
|
254
140
|
// MARK: - Continuing User Activity and Handling Quick Actions
|
|
255
141
|
|
|
256
142
|
open func application(_ application: UIApplication, willContinueUserActivityWithType userActivityType: String) -> Bool {
|
|
257
|
-
return
|
|
258
|
-
.subscribers
|
|
259
|
-
.reduce(false) { result, subscriber in
|
|
260
|
-
return subscriber.application?(application, willContinueUserActivityWithType: userActivityType) ?? false || result
|
|
261
|
-
}
|
|
143
|
+
return ExpoAppDelegateSubscriberManager.application(application, willContinueUserActivityWithType: userActivityType)
|
|
262
144
|
}
|
|
263
145
|
|
|
264
146
|
#if os(iOS) || os(tvOS)
|
|
@@ -267,29 +149,7 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
|
|
|
267
149
|
continue userActivity: NSUserActivity,
|
|
268
150
|
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
|
|
269
151
|
) -> Bool {
|
|
270
|
-
|
|
271
|
-
let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
|
|
272
|
-
var subscribersLeft = subs.count
|
|
273
|
-
let dispatchQueue = DispatchQueue(label: "expo.application.continueUserActivity", qos: .userInteractive)
|
|
274
|
-
var allRestorableObjects = [UIUserActivityRestoring]()
|
|
275
|
-
|
|
276
|
-
let handler = { (restorableObjects: [UIUserActivityRestoring]?) in
|
|
277
|
-
dispatchQueue.sync {
|
|
278
|
-
if let restorableObjects = restorableObjects {
|
|
279
|
-
allRestorableObjects.append(contentsOf: restorableObjects)
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
subscribersLeft -= 1
|
|
283
|
-
|
|
284
|
-
if subscribersLeft == 0 {
|
|
285
|
-
restorationHandler(allRestorableObjects)
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
return subs.reduce(false) { result, subscriber in
|
|
291
|
-
return subscriber.application?(application, continue: userActivity, restorationHandler: handler) ?? false || result
|
|
292
|
-
}
|
|
152
|
+
return ExpoAppDelegateSubscriberManager.application(application, continue: userActivity, restorationHandler: restorationHandler)
|
|
293
153
|
}
|
|
294
154
|
#elseif os(macOS)
|
|
295
155
|
open func application(
|
|
@@ -297,44 +157,16 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
|
|
|
297
157
|
continue userActivity: NSUserActivity,
|
|
298
158
|
restorationHandler: @escaping ([any NSUserActivityRestoring]) -> Void
|
|
299
159
|
) -> Bool {
|
|
300
|
-
|
|
301
|
-
let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
|
|
302
|
-
var subscribersLeft = subs.count
|
|
303
|
-
let dispatchQueue = DispatchQueue(label: "expo.application.continueUserActivity", qos: .userInteractive)
|
|
304
|
-
var allRestorableObjects = [NSUserActivityRestoring]()
|
|
305
|
-
|
|
306
|
-
let handler = { (restorableObjects: [NSUserActivityRestoring]?) in
|
|
307
|
-
dispatchQueue.sync {
|
|
308
|
-
if let restorableObjects = restorableObjects {
|
|
309
|
-
allRestorableObjects.append(contentsOf: restorableObjects)
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
subscribersLeft -= 1
|
|
313
|
-
|
|
314
|
-
if subscribersLeft == 0 {
|
|
315
|
-
restorationHandler(allRestorableObjects)
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
return subs.reduce(false) { result, subscriber in
|
|
321
|
-
return subscriber.application?(application, continue: userActivity, restorationHandler: handler) ?? false || result
|
|
322
|
-
}
|
|
160
|
+
return ExpoAppDelegateSubscriberManager.application(application, continue: userActivity, restorationHandler: restorationHandler)
|
|
323
161
|
}
|
|
324
162
|
#endif
|
|
325
163
|
|
|
326
164
|
open func application(_ application: UIApplication, didUpdate userActivity: NSUserActivity) {
|
|
327
|
-
return
|
|
328
|
-
.subscribers
|
|
329
|
-
.forEach { $0.application?(application, didUpdate: userActivity) }
|
|
165
|
+
return ExpoAppDelegateSubscriberManager.application(application, didUpdate: userActivity)
|
|
330
166
|
}
|
|
331
167
|
|
|
332
168
|
open func application(_ application: UIApplication, didFailToContinueUserActivityWithType userActivityType: String, error: Error) {
|
|
333
|
-
return
|
|
334
|
-
.subscribers
|
|
335
|
-
.forEach {
|
|
336
|
-
$0.application?(application, didFailToContinueUserActivityWithType: userActivityType, error: error)
|
|
337
|
-
}
|
|
169
|
+
return ExpoAppDelegateSubscriberManager.application(application, didFailToContinueUserActivityWithType: userActivityType, error: error)
|
|
338
170
|
}
|
|
339
171
|
|
|
340
172
|
#if os(iOS)
|
|
@@ -343,30 +175,7 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
|
|
|
343
175
|
performActionFor shortcutItem: UIApplicationShortcutItem,
|
|
344
176
|
completionHandler: @escaping (Bool) -> Void
|
|
345
177
|
) {
|
|
346
|
-
|
|
347
|
-
let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
|
|
348
|
-
var subscribersLeft = subs.count
|
|
349
|
-
var result: Bool = false
|
|
350
|
-
let dispatchQueue = DispatchQueue(label: "expo.application.performAction", qos: .userInteractive)
|
|
351
|
-
|
|
352
|
-
let handler = { (succeeded: Bool) in
|
|
353
|
-
dispatchQueue.sync {
|
|
354
|
-
result = result || succeeded
|
|
355
|
-
subscribersLeft -= 1
|
|
356
|
-
|
|
357
|
-
if subscribersLeft == 0 {
|
|
358
|
-
completionHandler(result)
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
if subs.isEmpty {
|
|
364
|
-
completionHandler(result)
|
|
365
|
-
} else {
|
|
366
|
-
subs.forEach { subscriber in
|
|
367
|
-
subscriber.application?(application, performActionFor: shortcutItem, completionHandler: handler)
|
|
368
|
-
}
|
|
369
|
-
}
|
|
178
|
+
ExpoAppDelegateSubscriberManager.application(application, performActionFor: shortcutItem, completionHandler: completionHandler)
|
|
370
179
|
}
|
|
371
180
|
#endif
|
|
372
181
|
|
|
@@ -377,42 +186,7 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
|
|
|
377
186
|
_ application: UIApplication,
|
|
378
187
|
performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
|
|
379
188
|
) {
|
|
380
|
-
|
|
381
|
-
let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
|
|
382
|
-
var subscribersLeft = subs.count
|
|
383
|
-
let dispatchQueue = DispatchQueue(label: "expo.application.performFetch", qos: .userInteractive)
|
|
384
|
-
var failedCount = 0
|
|
385
|
-
var newDataCount = 0
|
|
386
|
-
|
|
387
|
-
let handler = { (result: UIBackgroundFetchResult) in
|
|
388
|
-
dispatchQueue.sync {
|
|
389
|
-
if result == .failed {
|
|
390
|
-
failedCount += 1
|
|
391
|
-
} else if result == .newData {
|
|
392
|
-
newDataCount += 1
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
subscribersLeft -= 1
|
|
396
|
-
|
|
397
|
-
if subscribersLeft == 0 {
|
|
398
|
-
if newDataCount > 0 {
|
|
399
|
-
completionHandler(.newData)
|
|
400
|
-
} else if failedCount > 0 {
|
|
401
|
-
completionHandler(.failed)
|
|
402
|
-
} else {
|
|
403
|
-
completionHandler(.noData)
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
if subs.isEmpty {
|
|
410
|
-
completionHandler(.noData)
|
|
411
|
-
} else {
|
|
412
|
-
subs.forEach { subscriber in
|
|
413
|
-
subscriber.application?(application, performFetchWithCompletionHandler: handler)
|
|
414
|
-
}
|
|
415
|
-
}
|
|
189
|
+
ExpoAppDelegateSubscriberManager.application(application, performFetchWithCompletionHandler: completionHandler)
|
|
416
190
|
}
|
|
417
191
|
|
|
418
192
|
// TODO: - Interacting With WatchKit
|
|
@@ -424,15 +198,11 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
|
|
|
424
198
|
#if os(iOS) || os(tvOS)
|
|
425
199
|
|
|
426
200
|
open func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
|
|
427
|
-
return
|
|
428
|
-
return subscriber.application?(app, open: url, options: options) ?? false || result
|
|
429
|
-
}
|
|
201
|
+
return ExpoAppDelegateSubscriberManager.application(app, open: url, options: options)
|
|
430
202
|
}
|
|
431
203
|
#elseif os(macOS)
|
|
432
204
|
open func application(_ app: NSApplication, open urls: [URL]) {
|
|
433
|
-
|
|
434
|
-
subscriber.application?(app, open: urls)
|
|
435
|
-
}
|
|
205
|
+
ExpoAppDelegateSubscriberManager.application(app, open: urls)
|
|
436
206
|
}
|
|
437
207
|
#endif
|
|
438
208
|
// TODO: - Disallowing Specified App Extension Types
|
|
@@ -449,49 +219,7 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
|
|
|
449
219
|
* a different orientation.
|
|
450
220
|
*/
|
|
451
221
|
open func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
|
|
452
|
-
|
|
453
|
-
let universalOrientationMask = allowedOrientations(for: .unspecified)
|
|
454
|
-
let infoPlistOrientations = deviceOrientationMask.isEmpty ? universalOrientationMask : deviceOrientationMask
|
|
455
|
-
|
|
456
|
-
let parsedSubscribers = ExpoAppDelegateSubscriberRepository.subscribers.filter {
|
|
457
|
-
$0.responds(to: #selector(application(_:supportedInterfaceOrientationsFor:)))
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
// We want to create an intersection of all orientations set by subscribers.
|
|
461
|
-
let subscribersMask: UIInterfaceOrientationMask = parsedSubscribers.reduce(.all) { result, subscriber in
|
|
462
|
-
guard let requestedOrientation = subscriber.application?(application, supportedInterfaceOrientationsFor: window) else {
|
|
463
|
-
return result
|
|
464
|
-
}
|
|
465
|
-
return requestedOrientation.intersection(result)
|
|
466
|
-
}
|
|
467
|
-
return parsedSubscribers.isEmpty ? infoPlistOrientations : subscribersMask
|
|
222
|
+
return ExpoAppDelegateSubscriberManager.application(application, supportedInterfaceOrientationsFor: window)
|
|
468
223
|
}
|
|
469
224
|
#endif
|
|
470
225
|
}
|
|
471
|
-
|
|
472
|
-
#if os(iOS)
|
|
473
|
-
private func allowedOrientations(for userInterfaceIdiom: UIUserInterfaceIdiom) -> UIInterfaceOrientationMask {
|
|
474
|
-
// For now only iPad-specific orientations are supported
|
|
475
|
-
let deviceString = userInterfaceIdiom == .pad ? "~pad" : ""
|
|
476
|
-
var mask: UIInterfaceOrientationMask = []
|
|
477
|
-
guard let orientations = Bundle.main.infoDictionary?["UISupportedInterfaceOrientations\(deviceString)"] as? [String] else {
|
|
478
|
-
return mask
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
for orientation in orientations {
|
|
482
|
-
switch orientation {
|
|
483
|
-
case "UIInterfaceOrientationPortrait":
|
|
484
|
-
mask.insert(.portrait)
|
|
485
|
-
case "UIInterfaceOrientationLandscapeLeft":
|
|
486
|
-
mask.insert(.landscapeLeft)
|
|
487
|
-
case "UIInterfaceOrientationLandscapeRight":
|
|
488
|
-
mask.insert(.landscapeRight)
|
|
489
|
-
case "UIInterfaceOrientationPortraitUpsideDown":
|
|
490
|
-
mask.insert(.portraitUpsideDown)
|
|
491
|
-
default:
|
|
492
|
-
break
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
return mask
|
|
496
|
-
}
|
|
497
|
-
#endif // os(iOS)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo",
|
|
3
|
-
"version": "55.0.0-canary-
|
|
3
|
+
"version": "55.0.0-canary-20251003-7b9d7ff",
|
|
4
4
|
"description": "The Expo SDK",
|
|
5
5
|
"main": "src/Expo.ts",
|
|
6
6
|
"module": "src/Expo.ts",
|
|
@@ -75,23 +75,23 @@
|
|
|
75
75
|
"homepage": "https://github.com/expo/expo/tree/main/packages/expo",
|
|
76
76
|
"dependencies": {
|
|
77
77
|
"@babel/runtime": "^7.20.0",
|
|
78
|
-
"@expo/cli": "54.0
|
|
79
|
-
"@expo/config": "12.0.
|
|
80
|
-
"@expo/config-plugins": "54.0.
|
|
81
|
-
"@expo/devtools": "0.1.8-canary-
|
|
82
|
-
"@expo/fingerprint": "0.15.2-canary-
|
|
78
|
+
"@expo/cli": "54.1.0-canary-20251003-7b9d7ff",
|
|
79
|
+
"@expo/config": "12.0.11-canary-20251003-7b9d7ff",
|
|
80
|
+
"@expo/config-plugins": "54.0.3-canary-20251003-7b9d7ff",
|
|
81
|
+
"@expo/devtools": "0.1.8-canary-20251003-7b9d7ff",
|
|
82
|
+
"@expo/fingerprint": "0.15.2-canary-20251003-7b9d7ff",
|
|
83
83
|
"@expo/metro": "~54.0.0",
|
|
84
|
-
"@expo/metro-config": "54.0.
|
|
84
|
+
"@expo/metro-config": "54.0.7-canary-20251003-7b9d7ff",
|
|
85
85
|
"@expo/vector-icons": "^15.0.2",
|
|
86
86
|
"@ungap/structured-clone": "^1.3.0",
|
|
87
|
-
"babel-preset-expo": "54.0.
|
|
88
|
-
"expo-asset": "12.0.10-canary-
|
|
89
|
-
"expo-constants": "18.0.10-canary-
|
|
90
|
-
"expo-file-system": "19.
|
|
91
|
-
"expo-font": "14.0.9-canary-
|
|
92
|
-
"expo-keep-awake": "15.0.8-canary-
|
|
93
|
-
"expo-modules-autolinking": "3.1.0-canary-
|
|
94
|
-
"expo-modules-core": "3.0
|
|
87
|
+
"babel-preset-expo": "54.0.4-canary-20251003-7b9d7ff",
|
|
88
|
+
"expo-asset": "12.0.10-canary-20251003-7b9d7ff",
|
|
89
|
+
"expo-constants": "18.0.10-canary-20251003-7b9d7ff",
|
|
90
|
+
"expo-file-system": "19.0.17-canary-20251003-7b9d7ff",
|
|
91
|
+
"expo-font": "14.0.9-canary-20251003-7b9d7ff",
|
|
92
|
+
"expo-keep-awake": "15.0.8-canary-20251003-7b9d7ff",
|
|
93
|
+
"expo-modules-autolinking": "3.1.0-canary-20251003-7b9d7ff",
|
|
94
|
+
"expo-modules-core": "3.1.0-canary-20251003-7b9d7ff",
|
|
95
95
|
"pretty-format": "^29.7.0",
|
|
96
96
|
"react-refresh": "^0.14.2",
|
|
97
97
|
"whatwg-url-without-unicode": "8.0.0-3"
|
|
@@ -100,15 +100,15 @@
|
|
|
100
100
|
"@types/node": "^22.14.0",
|
|
101
101
|
"@types/react": "~19.1.10",
|
|
102
102
|
"@types/react-test-renderer": "~19.1.0",
|
|
103
|
-
"expo-module-scripts": "5.0.8-canary-
|
|
104
|
-
"react": "19.1.
|
|
105
|
-
"react-dom": "19.1.
|
|
106
|
-
"react-native": "0.
|
|
103
|
+
"expo-module-scripts": "5.0.8-canary-20251003-7b9d7ff",
|
|
104
|
+
"react": "19.1.1",
|
|
105
|
+
"react-dom": "19.1.1",
|
|
106
|
+
"react-native": "0.82.0-rc.5",
|
|
107
107
|
"web-streams-polyfill": "^3.3.2"
|
|
108
108
|
},
|
|
109
109
|
"peerDependencies": {
|
|
110
|
-
"@expo/dom-webview": "0.2.8-canary-
|
|
111
|
-
"@expo/metro-runtime": "6.1.3-canary-
|
|
110
|
+
"@expo/dom-webview": "0.2.8-canary-20251003-7b9d7ff",
|
|
111
|
+
"@expo/metro-runtime": "6.1.3-canary-20251003-7b9d7ff",
|
|
112
112
|
"react": "*",
|
|
113
113
|
"react-native": "*",
|
|
114
114
|
"react-native-webview": "*"
|
package/template.tgz
CHANGED
|
Binary file
|