Skip to content

[ui][iOS] - Add support for custom SwiftUI views and modifiers#42350

Merged
intergalacticspacehighway merged 20 commits intomainfrom
expo-ui-external-modifiers
Feb 4, 2026
Merged

[ui][iOS] - Add support for custom SwiftUI views and modifiers#42350
intergalacticspacehighway merged 20 commits intomainfrom
expo-ui-external-modifiers

Conversation

@intergalacticspacehighway
Copy link
Copy Markdown
Contributor

@intergalacticspacehighway intergalacticspacehighway commented Jan 20, 2026

Why

Add public API to extend custom SwiftUI views/modifiers in Expo UI.

How

  • Added public static methods in ViewModifierRegistry to register and unregister modifiers
  • Added documentation in guide and linked from SwiftUI overview and modifiers page. Thanks @amandeepmittal for the idea.

Test Plan

Added example of local expo module with custom SwiftUI View and a modifier.

Simulator Screenshot - iPhone 17 Pro - 2026-01-20 at 23 26 10

Checklist

@github-actions
Copy link
Copy Markdown
Contributor

Subscribed to pull request

File Patterns Mentions
docs/** @amandeepmittal
packages/expo-ui/** @aleqsio, @behenate, @douglowder

Generated by CodeMention

@expo-bot expo-bot added the bot: suggestions ExpoBot has some suggestions label Jan 20, 2026
@expo-bot expo-bot added bot: passed checks ExpoBot has nothing to complain about and removed bot: suggestions ExpoBot has some suggestions labels Jan 20, 2026
@expo-bot
Copy link
Copy Markdown
Collaborator

expo-bot commented Jan 20, 2026

The Pull Request introduced fingerprint changes against the base commit: 60aa34a

Fingerprint diff
[
  {
    "op": "changed",
    "beforeSource": {
      "type": "dir",
      "filePath": "../../packages/expo-ui/ios",
      "reasons": [
        "expoAutolinkingIos"
      ],
      "hash": "f46aff8f3358cd4c2989dcae376d83d7afe62884"
    },
    "afterSource": {
      "type": "dir",
      "filePath": "../../packages/expo-ui/ios",
      "reasons": [
        "expoAutolinkingIos"
      ],
      "hash": "2bf44ae8b68c7eda4f6b9d0dce549c62f80d9f66"
    }
  },
  {
    "op": "changed",
    "beforeSource": {
      "type": "dir",
      "filePath": "ios",
      "reasons": [
        "bareNativeDir"
      ],
      "hash": "c97eabb0e04e42ccbe91fdef6de17c5347faa560"
    },
    "afterSource": {
      "type": "dir",
      "filePath": "ios",
      "reasons": [
        "bareNativeDir"
      ],
      "hash": "ee8188bf1fce766175b137ba743c775fbdec0bda"
    }
  },
  {
    "op": "added",
    "addedSource": {
      "type": "dir",
      "filePath": "modules/test-expo-ui/ios",
      "reasons": [
        "expoAutolinkingIos"
      ],
      "hash": "663b001c35c6a2f0125c05d0ed2a0bfa11d46d95"
    }
  },
  {
    "op": "changed",
    "beforeSource": {
      "type": "contents",
      "id": "expoAutolinkingConfig:ios",
      "contents": "{\"extraDependencies\":[],\"coreFeatures\":[\"swiftui\",\"compose\"],\"modules\":[{\"packageName\":\"@expo/app-integrity\",\"pods\":[{\"podName\":\"ExpoAppIntegrity\",\"podspecDir\":\"../../packages/expo-app-integrity/ios\"}],\"swiftModuleNames\":[\"ExpoAppIntegrity\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"IntegrityModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"@expo/dom-webview\",\"pods\":[{\"podName\":\"ExpoDomWebView\",\"podspecDir\":\"../../packages/@expo/dom-webview/ios\"}],\"swiftModuleNames\":[\"ExpoDomWebView\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"DomWebViewModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.2\"},{\"packageName\":\"@expo/log-box\",\"pods\":[{\"podName\":\"ExpoLogBox\",\"podspecDir\":\"../../packages/@expo/log-box\"}],\"swiftModuleNames\":[\"ExpoLogBox\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"@expo/ui\",\"pods\":[{\"podName\":\"ExpoUI\",\"podspecDir\":\"../../packages/expo-ui/ios\"}],\"swiftModuleNames\":[\"ExpoUI\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoUIModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"coreFeatures\":[\"swiftui\",\"compose\"],\"packageVersion\":\"55.0.0-preview.4\"},{\"packageName\":\"benchmarking-module\",\"pods\":[{\"podName\":\"BenchmarkingModule\",\"podspecDir\":\"modules/benchmarking/ios\"}],\"swiftModuleNames\":[\"BenchmarkingModule\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BenchmarkingExpoModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"0.0.1\"},{\"packageName\":\"expo\",\"pods\":[{\"podName\":\"Expo\",\"podspecDir\":\"../../packages/expo\"}],\"swiftModuleNames\":[\"Expo\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoFetchModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.0-preview.9\"},{\"packageName\":\"expo-age-range\",\"pods\":[{\"podName\":\"ExpoAgeRange\",\"podspecDir\":\"../../packages/expo-age-range/ios\"}],\"swiftModuleNames\":[\"ExpoAgeRange\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"AgeRangeModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"0.2.6\"},{\"packageName\":\"expo-apple-authentication\",\"pods\":[{\"podName\":\"ExpoAppleAuthentication\",\"podspecDir\":\"../../packages/expo-apple-authentication/ios\"}],\"swiftModuleNames\":[\"ExpoAppleAuthentication\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"AppleAuthenticationModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-application\",\"pods\":[{\"podName\":\"EXApplication\",\"podspecDir\":\"../../packages/expo-application/ios\"}],\"swiftModuleNames\":[\"EXApplication\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ApplicationModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-asset\",\"pods\":[{\"podName\":\"ExpoAsset\",\"podspecDir\":\"../../packages/expo-asset/ios\"}],\"swiftModuleNames\":[\"ExpoAsset\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"AssetModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.3\"},{\"packageName\":\"expo-audio\",\"pods\":[{\"podName\":\"ExpoAudio\",\"podspecDir\":\"../../packages/expo-audio/ios\"}],\"swiftModuleNames\":[\"ExpoAudio\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"AudioModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-background-fetch\",\"pods\":[{\"podName\":\"ExpoBackgroundFetch\",\"podspecDir\":\"../../packages/expo-background-fetch/ios\"}],\"swiftModuleNames\":[\"ExpoBackgroundFetch\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BackgroundFetchModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-background-task\",\"pods\":[{\"podName\":\"ExpoBackgroundTask\",\"podspecDir\":\"../../packages/expo-background-task/ios\"}],\"swiftModuleNames\":[\"ExpoBackgroundTask\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BackgroundTaskModule\"}],\"appDelegateSubscribers\":[\"BackgroundTaskAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-battery\",\"pods\":[{\"podName\":\"ExpoBattery\",\"podspecDir\":\"../../packages/expo-battery/ios\"}],\"swiftModuleNames\":[\"ExpoBattery\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BatteryModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-blob\",\"pods\":[{\"podName\":\"ExpoBlob\",\"podspecDir\":\"../../packages/expo-blob/ios\"}],\"swiftModuleNames\":[\"ExpoBlob\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoBlob\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-blur\",\"pods\":[{\"podName\":\"ExpoBlur\",\"podspecDir\":\"../../packages/expo-blur/ios\"}],\"swiftModuleNames\":[\"ExpoBlur\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BlurViewModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-brightness\",\"pods\":[{\"podName\":\"ExpoBrightness\",\"podspecDir\":\"../../packages/expo-brightness/ios\"}],\"swiftModuleNames\":[\"ExpoBrightness\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BrightnessModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-brownfield\",\"pods\":[{\"podName\":\"ExpoBrownfield\",\"podspecDir\":\"../../packages/expo-brownfield/ios\"}],\"swiftModuleNames\":[\"ExpoBrownfield\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoBrownfieldModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.6\"},{\"packageName\":\"expo-calendar\",\"pods\":[{\"podName\":\"ExpoCalendar\",\"podspecDir\":\"../../packages/expo-calendar/ios\"}],\"swiftModuleNames\":[\"ExpoCalendar\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"CalendarModule\"},{\"name\":null,\"class\":\"CalendarNextModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-camera\",\"pods\":[{\"podName\":\"ExpoCamera\",\"podspecDir\":\"../../packages/expo-camera/ios\"}],\"swiftModuleNames\":[\"ExpoCamera\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"CameraViewModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-cellular\",\"pods\":[{\"podName\":\"ExpoCellular\",\"podspecDir\":\"../../packages/expo-cellular/ios\"}],\"swiftModuleNames\":[\"ExpoCellular\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"CellularModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-clipboard\",\"pods\":[{\"podName\":\"ExpoClipboard\",\"podspecDir\":\"../../packages/expo-clipboard/ios\"}],\"swiftModuleNames\":[\"ExpoClipboard\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ClipboardModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-constants\",\"pods\":[{\"podName\":\"EXConstants\",\"podspecDir\":\"../../packages/expo-constants/ios\"}],\"swiftModuleNames\":[\"EXConstants\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ConstantsModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.3\"},{\"packageName\":\"expo-contacts\",\"pods\":[{\"podName\":\"ExpoContacts\",\"podspecDir\":\"../../packages/expo-contacts/ios\"}],\"swiftModuleNames\":[\"ExpoContacts\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ContactsModule\"},{\"name\":null,\"class\":\"ContactAccessButtonModule\"},{\"name\":null,\"class\":\"ContactsNextModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-crypto\",\"pods\":[{\"podName\":\"ExpoCrypto\",\"podspecDir\":\"../../packages/expo-crypto/ios\"}],\"swiftModuleNames\":[\"ExpoCrypto\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"CryptoModule\"},{\"name\":null,\"class\":\"AesCryptoModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-dev-client\",\"pods\":[{\"podName\":\"expo-dev-client\",\"podspecDir\":\"../../packages/expo-dev-client/ios\"}],\"swiftModuleNames\":[\"expo_dev_client\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-dev-launcher\",\"pods\":[{\"podName\":\"expo-dev-launcher\",\"podspecDir\":\"../../packages/expo-dev-launcher\"}],\"swiftModuleNames\":[\"EXDevLauncher\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"DevLauncherModule\"}],\"appDelegateSubscribers\":[\"ExpoDevLauncherAppDelegateSubscriber\"],\"reactDelegateHandlers\":[\"ExpoDevLauncherReactDelegateHandler\"],\"debugOnly\":true,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"expo-dev-menu\",\"pods\":[{\"podName\":\"expo-dev-menu\",\"podspecDir\":\"../../packages/expo-dev-menu\"}],\"swiftModuleNames\":[\"EXDevMenu\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"DevMenuModule\"},{\"name\":null,\"class\":\"DevMenuInternalModule\"},{\"name\":null,\"class\":\"DevMenuPreferences\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[\"ExpoDevMenuReactDelegateHandler\"],\"debugOnly\":true,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-dev-menu-interface\",\"pods\":[{\"podName\":\"expo-dev-menu-interface\",\"podspecDir\":\"../../packages/expo-dev-menu-interface/ios\"}],\"swiftModuleNames\":[\"expo_dev_menu_interface\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.1\"},{\"packageName\":\"expo-device\",\"pods\":[{\"podName\":\"ExpoDevice\",\"podspecDir\":\"../../packages/expo-device/ios\"}],\"swiftModuleNames\":[\"ExpoDevice\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"DeviceModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"expo-document-picker\",\"pods\":[{\"podName\":\"ExpoDocumentPicker\",\"podspecDir\":\"../../packages/expo-document-picker/ios\"}],\"swiftModuleNames\":[\"ExpoDocumentPicker\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"DocumentPickerModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-eas-client\",\"pods\":[{\"podName\":\"EASClient\",\"podspecDir\":\"../../packages/expo-eas-client/ios\"}],\"swiftModuleNames\":[\"EASClient\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"EASClientModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.2\"},{\"packageName\":\"expo-file-system\",\"pods\":[{\"podName\":\"ExpoFileSystem\",\"podspecDir\":\"../../packages/expo-file-system/ios\"}],\"swiftModuleNames\":[\"ExpoFileSystem\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"FileSystemModule\"},{\"name\":null,\"class\":\"FileSystemLegacyModule\"}],\"appDelegateSubscribers\":[\"FileSystemBackgroundSessionHandler\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-font\",\"pods\":[{\"podName\":\"ExpoFont\",\"podspecDir\":\"../../packages/expo-font/ios\"}],\"swiftModuleNames\":[\"ExpoFont\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"FontLoaderModule\"},{\"name\":null,\"class\":\"FontUtilsModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.3\"},{\"packageName\":\"expo-gl\",\"pods\":[{\"podName\":\"ExpoGL\",\"podspecDir\":\"../../packages/expo-gl\"}],\"swiftModuleNames\":[\"ExpoGL\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoGLModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-glass-effect\",\"pods\":[{\"podName\":\"ExpoGlassEffect\",\"podspecDir\":\"../../packages/expo-glass-effect/ios\"}],\"swiftModuleNames\":[\"ExpoGlassEffect\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"GlassEffectModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-haptics\",\"pods\":[{\"podName\":\"ExpoHaptics\",\"podspecDir\":\"../../packages/expo-haptics/ios\"}],\"swiftModuleNames\":[\"ExpoHaptics\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"HapticsModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-image\",\"pods\":[{\"podName\":\"ExpoImage\",\"podspecDir\":\"../../packages/expo-image/ios\"}],\"swiftModuleNames\":[\"ExpoImage\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ImageModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.3\"},{\"packageName\":\"expo-image-manipulator\",\"pods\":[{\"podName\":\"ExpoImageManipulator\",\"podspecDir\":\"../../packages/expo-image-manipulator/ios\"}],\"swiftModuleNames\":[\"ExpoImageManipulator\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ImageManipulatorModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-image-picker\",\"pods\":[{\"podName\":\"ExpoImagePicker\",\"podspecDir\":\"../../packages/expo-image-picker/ios\"}],\"swiftModuleNames\":[\"ExpoImagePicker\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ImagePickerModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-insights\",\"pods\":[{\"podName\":\"ExpoInsights\",\"podspecDir\":\"../../packages/expo-insights/ios\"}],\"swiftModuleNames\":[\"ExpoInsights\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"InsightsModule\"}],\"appDelegateSubscribers\":[\"InsightsAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"expo-json-utils\",\"pods\":[{\"podName\":\"EXJSONUtils\",\"podspecDir\":\"../../packages/expo-json-utils/ios\"}],\"swiftModuleNames\":[\"EXJSONUtils\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.0\"},{\"packageName\":\"expo-keep-awake\",\"pods\":[{\"podName\":\"ExpoKeepAwake\",\"podspecDir\":\"../../packages/expo-keep-awake/ios\"}],\"swiftModuleNames\":[\"ExpoKeepAwake\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"KeepAwakeModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.2\"},{\"packageName\":\"expo-linear-gradient\",\"pods\":[{\"podName\":\"ExpoLinearGradient\",\"podspecDir\":\"../../packages/expo-linear-gradient/ios\"}],\"swiftModuleNames\":[\"ExpoLinearGradient\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"LinearGradientModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-linking\",\"pods\":[{\"podName\":\"ExpoLinking\",\"podspecDir\":\"../../packages/expo-linking/ios\"}],\"swiftModuleNames\":[\"ExpoLinking\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoLinkingModule\"}],\"appDelegateSubscribers\":[\"LinkingAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.3\"},{\"packageName\":\"expo-live-photo\",\"pods\":[{\"podName\":\"ExpoLivePhoto\",\"podspecDir\":\"../../packages/expo-live-photo/ios\"}],\"swiftModuleNames\":[\"ExpoLivePhoto\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"LivePhotoModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-local-authentication\",\"pods\":[{\"podName\":\"ExpoLocalAuthentication\",\"podspecDir\":\"../../packages/expo-local-authentication/ios\"}],\"swiftModuleNames\":[\"ExpoLocalAuthentication\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"LocalAuthenticationModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-localization\",\"pods\":[{\"podName\":\"ExpoLocalization\",\"podspecDir\":\"../../packages/expo-localization/ios\"}],\"swiftModuleNames\":[\"ExpoLocalization\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"LocalizationModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-location\",\"pods\":[{\"podName\":\"ExpoLocation\",\"podspecDir\":\"../../packages/expo-location/ios\"}],\"swiftModuleNames\":[\"ExpoLocation\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"LocationModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"expo-mail-composer\",\"pods\":[{\"podName\":\"ExpoMailComposer\",\"podspecDir\":\"../../packages/expo-mail-composer/ios\"}],\"swiftModuleNames\":[\"ExpoMailComposer\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"MailComposerModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-manifests\",\"pods\":[{\"podName\":\"EXManifests\",\"podspecDir\":\"../../packages/expo-manifests/ios\"}],\"swiftModuleNames\":[\"EXManifests\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-maps\",\"pods\":[{\"podName\":\"ExpoMaps\",\"podspecDir\":\"../../packages/expo-maps/ios\"}],\"swiftModuleNames\":[\"ExpoMaps\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"MapsModule\"},{\"name\":null,\"class\":\"AppleMapsModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"coreFeatures\":[\"swiftui\",\"compose\"],\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-media-library\",\"pods\":[{\"podName\":\"ExpoMediaLibrary\",\"podspecDir\":\"../../packages/expo-media-library/ios\"}],\"swiftModuleNames\":[\"ExpoMediaLibrary\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"MediaLibraryModule\"},{\"name\":null,\"class\":\"MediaLibraryNextModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-mesh-gradient\",\"pods\":[{\"podName\":\"ExpoMeshGradient\",\"podspecDir\":\"../../packages/expo-mesh-gradient/ios\"}],\"swiftModuleNames\":[\"ExpoMeshGradient\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"MeshGradientModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"coreFeatures\":[\"swiftui\",\"compose\"],\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-modules-core\",\"pods\":[{\"podName\":\"ExpoModulesCore\",\"podspecDir\":\"../../packages/expo-modules-core\"},{\"podName\":\"ExpoModulesJSI\",\"podspecDir\":\"../../packages/expo-modules-core\"}],\"swiftModuleNames\":[\"ExpoModulesCore\",\"ExpoModulesJSI\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.7\"},{\"packageName\":\"expo-network\",\"pods\":[{\"podName\":\"ExpoNetwork\",\"podspecDir\":\"../../packages/expo-network/ios\"}],\"swiftModuleNames\":[\"ExpoNetwork\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"NetworkModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-notifications\",\"pods\":[{\"podName\":\"ExpoNotifications\",\"podspecDir\":\"../../packages/expo-notifications/ios\"}],\"swiftModuleNames\":[\"ExpoNotifications\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BackgroundModule\"},{\"name\":null,\"class\":\"BadgeModule\"},{\"name\":null,\"class\":\"CategoriesModule\"},{\"name\":null,\"class\":\"EmitterModule\"},{\"name\":null,\"class\":\"HandlerModule\"},{\"name\":null,\"class\":\"PermissionsModule\"},{\"name\":null,\"class\":\"PresentationModule\"},{\"name\":null,\"class\":\"PushTokenModule\"},{\"name\":null,\"class\":\"SchedulerModule\"},{\"name\":null,\"class\":\"ServerRegistrationModule\"}],\"appDelegateSubscribers\":[\"NotificationsAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"expo-print\",\"pods\":[{\"podName\":\"ExpoPrint\",\"podspecDir\":\"../../packages/expo-print/ios\"}],\"swiftModuleNames\":[\"ExpoPrint\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoPrintModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-router\",\"pods\":[{\"podName\":\"ExpoRouter\",\"podspecDir\":\"../../packages/expo-router/ios\"}],\"swiftModuleNames\":[\"ExpoRouter\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoHeadModule\"},{\"name\":null,\"class\":\"LinkPreviewNativeModule\"},{\"name\":null,\"class\":\"RouterToolbarModule\"}],\"appDelegateSubscribers\":[\"ExpoHeadAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.0-preview.6\"},{\"packageName\":\"expo-screen-capture\",\"pods\":[{\"podName\":\"ExpoScreenCapture\",\"podspecDir\":\"../../packages/expo-screen-capture/ios\"}],\"swiftModuleNames\":[\"ExpoScreenCapture\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ScreenCaptureModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-screen-orientation\",\"pods\":[{\"podName\":\"ExpoScreenOrientation\",\"podspecDir\":\"../../packages/expo-screen-orientation/ios\"}],\"swiftModuleNames\":[\"ExpoScreenOrientation\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ScreenOrientationModule\"}],\"appDelegateSubscribers\":[\"ScreenOrientationAppDelegate\"],\"reactDelegateHandlers\":[\"ScreenOrientationReactDelegateHandler\"],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-secure-store\",\"pods\":[{\"podName\":\"ExpoSecureStore\",\"podspecDir\":\"../../packages/expo-secure-store/ios\"}],\"swiftModuleNames\":[\"ExpoSecureStore\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"SecureStoreModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-sensors\",\"pods\":[{\"podName\":\"ExpoSensors\",\"podspecDir\":\"../../packages/expo-sensors/ios\"}],\"swiftModuleNames\":[\"ExpoSensors\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"AccelerometerModule\"},{\"name\":null,\"class\":\"BarometerModule\"},{\"name\":null,\"class\":\"DeviceMotionModule\"},{\"name\":null,\"class\":\"GyroscopeModule\"},{\"name\":null,\"class\":\"MagnetometerModule\"},{\"name\":null,\"class\":\"MagnetometerUncalibratedModule\"},{\"name\":null,\"class\":\"PedometerModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-sharing\",\"pods\":[{\"podName\":\"ExpoSharing\",\"podspecDir\":\"../../packages/expo-sharing/ios\"}],\"swiftModuleNames\":[\"ExpoSharing\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"SharingModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"expo-sms\",\"pods\":[{\"podName\":\"ExpoSMS\",\"podspecDir\":\"../../packages/expo-sms/ios\"}],\"swiftModuleNames\":[\"ExpoSMS\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoSMSModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-speech\",\"pods\":[{\"podName\":\"ExpoSpeech\",\"podspecDir\":\"../../packages/expo-speech/ios\"}],\"swiftModuleNames\":[\"ExpoSpeech\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"SpeechModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-splash-screen\",\"pods\":[{\"podName\":\"ExpoSplashScreen\",\"podspecDir\":\"../../packages/expo-splash-screen/ios\"}],\"swiftModuleNames\":[\"ExpoSplashScreen\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"SplashScreenModule\"}],\"appDelegateSubscribers\":[\"SplashScreenAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-sqlite\",\"pods\":[{\"podName\":\"ExpoSQLite\",\"podspecDir\":\"../../packages/expo-sqlite/ios\"}],\"swiftModuleNames\":[\"ExpoSQLite\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"SQLiteModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-store-review\",\"pods\":[{\"podName\":\"ExpoStoreReview\",\"podspecDir\":\"../../packages/expo-store-review/ios\"}],\"swiftModuleNames\":[\"ExpoStoreReview\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"StoreReviewModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-structured-headers\",\"pods\":[{\"podName\":\"EXStructuredHeaders\",\"podspecDir\":\"../../packages/expo-structured-headers/ios\"}],\"swiftModuleNames\":[\"EXStructuredHeaders\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.0\"},{\"packageName\":\"expo-symbols\",\"pods\":[{\"podName\":\"ExpoSymbols\",\"podspecDir\":\"../../packages/expo-symbols/ios\"}],\"swiftModuleNames\":[\"ExpoSymbols\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"SymbolModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.3\"},{\"packageName\":\"expo-system-ui\",\"pods\":[{\"podName\":\"ExpoSystemUI\",\"podspecDir\":\"../../packages/expo-system-ui/ios\"}],\"swiftModuleNames\":[\"ExpoSystemUI\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoSystemUIModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-task-manager\",\"pods\":[{\"podName\":\"ExpoTaskManager\",\"podspecDir\":\"../../packages/expo-task-manager/ios\"}],\"swiftModuleNames\":[\"ExpoTaskManager\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"TaskManagerModule\"}],\"appDelegateSubscribers\":[\"TaskManagerAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-tracking-transparency\",\"pods\":[{\"podName\":\"ExpoTrackingTransparency\",\"podspecDir\":\"../../packages/expo-tracking-transparency/ios\"}],\"swiftModuleNames\":[\"ExpoTrackingTransparency\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"TrackingTransparencyModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-updates\",\"pods\":[{\"podName\":\"EXUpdates\",\"podspecDir\":\"../../packages/expo-updates/ios\"}],\"swiftModuleNames\":[\"EXUpdates\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"UpdatesModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[\"ExpoUpdatesReactDelegateHandler\"],\"debugOnly\":false,\"packageVersion\":\"55.0.6\"},{\"packageName\":\"expo-updates-interface\",\"pods\":[{\"podName\":\"EXUpdatesInterface\",\"podspecDir\":\"../../packages/expo-updates-interface/ios\"}],\"swiftModuleNames\":[\"EXUpdatesInterface\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.1.1\"},{\"packageName\":\"expo-video\",\"pods\":[{\"podName\":\"ExpoVideo\",\"podspecDir\":\"../../packages/expo-video/ios\"}],\"swiftModuleNames\":[\"ExpoVideo\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"VideoModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-video-thumbnails\",\"pods\":[{\"podName\":\"ExpoVideoThumbnails\",\"podspecDir\":\"../../packages/expo-video-thumbnails/ios\"}],\"swiftModuleNames\":[\"ExpoVideoThumbnails\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"VideoThumbnailsModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-web-browser\",\"pods\":[{\"podName\":\"ExpoWebBrowser\",\"podspecDir\":\"../../packages/expo-web-browser/ios\"}],\"swiftModuleNames\":[\"ExpoWebBrowser\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"WebBrowserModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"unimodules-app-loader\",\"pods\":[{\"podName\":\"UMAppLoader\",\"podspecDir\":\"../../packages/unimodules-app-loader/ios\"}],\"swiftModuleNames\":[\"UMAppLoader\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.2\"},{\"packageName\":\"worklets-tester\",\"pods\":[{\"podName\":\"WorkletsTester\",\"podspecDir\":\"modules/worklets-tester/ios\"}],\"swiftModuleNames\":[\"WorkletsTester\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"WorkletsTesterModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"0.0.1\"}]}",
      "reasons": [
        "expoAutolinkingIos"
      ],
      "hash": "a7bc285b17cea715f0beb72ed0b9b00c56079c0d"
    },
    "afterSource": {
      "type": "contents",
      "id": "expoAutolinkingConfig:ios",
      "contents": "{\"extraDependencies\":[],\"coreFeatures\":[\"swiftui\",\"compose\"],\"modules\":[{\"packageName\":\"@expo/app-integrity\",\"pods\":[{\"podName\":\"ExpoAppIntegrity\",\"podspecDir\":\"../../packages/expo-app-integrity/ios\"}],\"swiftModuleNames\":[\"ExpoAppIntegrity\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"IntegrityModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"@expo/dom-webview\",\"pods\":[{\"podName\":\"ExpoDomWebView\",\"podspecDir\":\"../../packages/@expo/dom-webview/ios\"}],\"swiftModuleNames\":[\"ExpoDomWebView\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"DomWebViewModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.2\"},{\"packageName\":\"@expo/log-box\",\"pods\":[{\"podName\":\"ExpoLogBox\",\"podspecDir\":\"../../packages/@expo/log-box\"}],\"swiftModuleNames\":[\"ExpoLogBox\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"@expo/ui\",\"pods\":[{\"podName\":\"ExpoUI\",\"podspecDir\":\"../../packages/expo-ui/ios\"}],\"swiftModuleNames\":[\"ExpoUI\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoUIModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"coreFeatures\":[\"swiftui\",\"compose\"],\"packageVersion\":\"55.0.0-preview.4\"},{\"packageName\":\"benchmarking-module\",\"pods\":[{\"podName\":\"BenchmarkingModule\",\"podspecDir\":\"modules/benchmarking/ios\"}],\"swiftModuleNames\":[\"BenchmarkingModule\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BenchmarkingExpoModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"0.0.1\"},{\"packageName\":\"expo\",\"pods\":[{\"podName\":\"Expo\",\"podspecDir\":\"../../packages/expo\"}],\"swiftModuleNames\":[\"Expo\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoFetchModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.0-preview.9\"},{\"packageName\":\"expo-age-range\",\"pods\":[{\"podName\":\"ExpoAgeRange\",\"podspecDir\":\"../../packages/expo-age-range/ios\"}],\"swiftModuleNames\":[\"ExpoAgeRange\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"AgeRangeModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"0.2.6\"},{\"packageName\":\"expo-apple-authentication\",\"pods\":[{\"podName\":\"ExpoAppleAuthentication\",\"podspecDir\":\"../../packages/expo-apple-authentication/ios\"}],\"swiftModuleNames\":[\"ExpoAppleAuthentication\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"AppleAuthenticationModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-application\",\"pods\":[{\"podName\":\"EXApplication\",\"podspecDir\":\"../../packages/expo-application/ios\"}],\"swiftModuleNames\":[\"EXApplication\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ApplicationModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-asset\",\"pods\":[{\"podName\":\"ExpoAsset\",\"podspecDir\":\"../../packages/expo-asset/ios\"}],\"swiftModuleNames\":[\"ExpoAsset\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"AssetModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.3\"},{\"packageName\":\"expo-audio\",\"pods\":[{\"podName\":\"ExpoAudio\",\"podspecDir\":\"../../packages/expo-audio/ios\"}],\"swiftModuleNames\":[\"ExpoAudio\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"AudioModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-background-fetch\",\"pods\":[{\"podName\":\"ExpoBackgroundFetch\",\"podspecDir\":\"../../packages/expo-background-fetch/ios\"}],\"swiftModuleNames\":[\"ExpoBackgroundFetch\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BackgroundFetchModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-background-task\",\"pods\":[{\"podName\":\"ExpoBackgroundTask\",\"podspecDir\":\"../../packages/expo-background-task/ios\"}],\"swiftModuleNames\":[\"ExpoBackgroundTask\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BackgroundTaskModule\"}],\"appDelegateSubscribers\":[\"BackgroundTaskAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-battery\",\"pods\":[{\"podName\":\"ExpoBattery\",\"podspecDir\":\"../../packages/expo-battery/ios\"}],\"swiftModuleNames\":[\"ExpoBattery\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BatteryModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-blob\",\"pods\":[{\"podName\":\"ExpoBlob\",\"podspecDir\":\"../../packages/expo-blob/ios\"}],\"swiftModuleNames\":[\"ExpoBlob\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoBlob\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-blur\",\"pods\":[{\"podName\":\"ExpoBlur\",\"podspecDir\":\"../../packages/expo-blur/ios\"}],\"swiftModuleNames\":[\"ExpoBlur\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BlurViewModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-brightness\",\"pods\":[{\"podName\":\"ExpoBrightness\",\"podspecDir\":\"../../packages/expo-brightness/ios\"}],\"swiftModuleNames\":[\"ExpoBrightness\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BrightnessModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-brownfield\",\"pods\":[{\"podName\":\"ExpoBrownfield\",\"podspecDir\":\"../../packages/expo-brownfield/ios\"}],\"swiftModuleNames\":[\"ExpoBrownfield\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoBrownfieldModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.6\"},{\"packageName\":\"expo-calendar\",\"pods\":[{\"podName\":\"ExpoCalendar\",\"podspecDir\":\"../../packages/expo-calendar/ios\"}],\"swiftModuleNames\":[\"ExpoCalendar\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"CalendarModule\"},{\"name\":null,\"class\":\"CalendarNextModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-camera\",\"pods\":[{\"podName\":\"ExpoCamera\",\"podspecDir\":\"../../packages/expo-camera/ios\"}],\"swiftModuleNames\":[\"ExpoCamera\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"CameraViewModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-cellular\",\"pods\":[{\"podName\":\"ExpoCellular\",\"podspecDir\":\"../../packages/expo-cellular/ios\"}],\"swiftModuleNames\":[\"ExpoCellular\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"CellularModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-clipboard\",\"pods\":[{\"podName\":\"ExpoClipboard\",\"podspecDir\":\"../../packages/expo-clipboard/ios\"}],\"swiftModuleNames\":[\"ExpoClipboard\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ClipboardModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-constants\",\"pods\":[{\"podName\":\"EXConstants\",\"podspecDir\":\"../../packages/expo-constants/ios\"}],\"swiftModuleNames\":[\"EXConstants\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ConstantsModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.3\"},{\"packageName\":\"expo-contacts\",\"pods\":[{\"podName\":\"ExpoContacts\",\"podspecDir\":\"../../packages/expo-contacts/ios\"}],\"swiftModuleNames\":[\"ExpoContacts\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ContactsModule\"},{\"name\":null,\"class\":\"ContactAccessButtonModule\"},{\"name\":null,\"class\":\"ContactsNextModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-crypto\",\"pods\":[{\"podName\":\"ExpoCrypto\",\"podspecDir\":\"../../packages/expo-crypto/ios\"}],\"swiftModuleNames\":[\"ExpoCrypto\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"CryptoModule\"},{\"name\":null,\"class\":\"AesCryptoModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-dev-client\",\"pods\":[{\"podName\":\"expo-dev-client\",\"podspecDir\":\"../../packages/expo-dev-client/ios\"}],\"swiftModuleNames\":[\"expo_dev_client\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-dev-launcher\",\"pods\":[{\"podName\":\"expo-dev-launcher\",\"podspecDir\":\"../../packages/expo-dev-launcher\"}],\"swiftModuleNames\":[\"EXDevLauncher\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"DevLauncherModule\"}],\"appDelegateSubscribers\":[\"ExpoDevLauncherAppDelegateSubscriber\"],\"reactDelegateHandlers\":[\"ExpoDevLauncherReactDelegateHandler\"],\"debugOnly\":true,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"expo-dev-menu\",\"pods\":[{\"podName\":\"expo-dev-menu\",\"podspecDir\":\"../../packages/expo-dev-menu\"}],\"swiftModuleNames\":[\"EXDevMenu\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"DevMenuModule\"},{\"name\":null,\"class\":\"DevMenuInternalModule\"},{\"name\":null,\"class\":\"DevMenuPreferences\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[\"ExpoDevMenuReactDelegateHandler\"],\"debugOnly\":true,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-dev-menu-interface\",\"pods\":[{\"podName\":\"expo-dev-menu-interface\",\"podspecDir\":\"../../packages/expo-dev-menu-interface/ios\"}],\"swiftModuleNames\":[\"expo_dev_menu_interface\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.1\"},{\"packageName\":\"expo-device\",\"pods\":[{\"podName\":\"ExpoDevice\",\"podspecDir\":\"../../packages/expo-device/ios\"}],\"swiftModuleNames\":[\"ExpoDevice\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"DeviceModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"expo-document-picker\",\"pods\":[{\"podName\":\"ExpoDocumentPicker\",\"podspecDir\":\"../../packages/expo-document-picker/ios\"}],\"swiftModuleNames\":[\"ExpoDocumentPicker\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"DocumentPickerModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-eas-client\",\"pods\":[{\"podName\":\"EASClient\",\"podspecDir\":\"../../packages/expo-eas-client/ios\"}],\"swiftModuleNames\":[\"EASClient\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"EASClientModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.2\"},{\"packageName\":\"expo-file-system\",\"pods\":[{\"podName\":\"ExpoFileSystem\",\"podspecDir\":\"../../packages/expo-file-system/ios\"}],\"swiftModuleNames\":[\"ExpoFileSystem\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"FileSystemModule\"},{\"name\":null,\"class\":\"FileSystemLegacyModule\"}],\"appDelegateSubscribers\":[\"FileSystemBackgroundSessionHandler\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-font\",\"pods\":[{\"podName\":\"ExpoFont\",\"podspecDir\":\"../../packages/expo-font/ios\"}],\"swiftModuleNames\":[\"ExpoFont\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"FontLoaderModule\"},{\"name\":null,\"class\":\"FontUtilsModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.3\"},{\"packageName\":\"expo-gl\",\"pods\":[{\"podName\":\"ExpoGL\",\"podspecDir\":\"../../packages/expo-gl\"}],\"swiftModuleNames\":[\"ExpoGL\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoGLModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-glass-effect\",\"pods\":[{\"podName\":\"ExpoGlassEffect\",\"podspecDir\":\"../../packages/expo-glass-effect/ios\"}],\"swiftModuleNames\":[\"ExpoGlassEffect\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"GlassEffectModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-haptics\",\"pods\":[{\"podName\":\"ExpoHaptics\",\"podspecDir\":\"../../packages/expo-haptics/ios\"}],\"swiftModuleNames\":[\"ExpoHaptics\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"HapticsModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-image\",\"pods\":[{\"podName\":\"ExpoImage\",\"podspecDir\":\"../../packages/expo-image/ios\"}],\"swiftModuleNames\":[\"ExpoImage\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ImageModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.3\"},{\"packageName\":\"expo-image-manipulator\",\"pods\":[{\"podName\":\"ExpoImageManipulator\",\"podspecDir\":\"../../packages/expo-image-manipulator/ios\"}],\"swiftModuleNames\":[\"ExpoImageManipulator\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ImageManipulatorModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-image-picker\",\"pods\":[{\"podName\":\"ExpoImagePicker\",\"podspecDir\":\"../../packages/expo-image-picker/ios\"}],\"swiftModuleNames\":[\"ExpoImagePicker\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ImagePickerModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-insights\",\"pods\":[{\"podName\":\"ExpoInsights\",\"podspecDir\":\"../../packages/expo-insights/ios\"}],\"swiftModuleNames\":[\"ExpoInsights\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"InsightsModule\"}],\"appDelegateSubscribers\":[\"InsightsAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"expo-json-utils\",\"pods\":[{\"podName\":\"EXJSONUtils\",\"podspecDir\":\"../../packages/expo-json-utils/ios\"}],\"swiftModuleNames\":[\"EXJSONUtils\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.0\"},{\"packageName\":\"expo-keep-awake\",\"pods\":[{\"podName\":\"ExpoKeepAwake\",\"podspecDir\":\"../../packages/expo-keep-awake/ios\"}],\"swiftModuleNames\":[\"ExpoKeepAwake\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"KeepAwakeModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.2\"},{\"packageName\":\"expo-linear-gradient\",\"pods\":[{\"podName\":\"ExpoLinearGradient\",\"podspecDir\":\"../../packages/expo-linear-gradient/ios\"}],\"swiftModuleNames\":[\"ExpoLinearGradient\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"LinearGradientModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-linking\",\"pods\":[{\"podName\":\"ExpoLinking\",\"podspecDir\":\"../../packages/expo-linking/ios\"}],\"swiftModuleNames\":[\"ExpoLinking\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoLinkingModule\"}],\"appDelegateSubscribers\":[\"LinkingAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.3\"},{\"packageName\":\"expo-live-photo\",\"pods\":[{\"podName\":\"ExpoLivePhoto\",\"podspecDir\":\"../../packages/expo-live-photo/ios\"}],\"swiftModuleNames\":[\"ExpoLivePhoto\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"LivePhotoModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-local-authentication\",\"pods\":[{\"podName\":\"ExpoLocalAuthentication\",\"podspecDir\":\"../../packages/expo-local-authentication/ios\"}],\"swiftModuleNames\":[\"ExpoLocalAuthentication\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"LocalAuthenticationModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-localization\",\"pods\":[{\"podName\":\"ExpoLocalization\",\"podspecDir\":\"../../packages/expo-localization/ios\"}],\"swiftModuleNames\":[\"ExpoLocalization\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"LocalizationModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-location\",\"pods\":[{\"podName\":\"ExpoLocation\",\"podspecDir\":\"../../packages/expo-location/ios\"}],\"swiftModuleNames\":[\"ExpoLocation\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"LocationModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"expo-mail-composer\",\"pods\":[{\"podName\":\"ExpoMailComposer\",\"podspecDir\":\"../../packages/expo-mail-composer/ios\"}],\"swiftModuleNames\":[\"ExpoMailComposer\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"MailComposerModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-manifests\",\"pods\":[{\"podName\":\"EXManifests\",\"podspecDir\":\"../../packages/expo-manifests/ios\"}],\"swiftModuleNames\":[\"EXManifests\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-maps\",\"pods\":[{\"podName\":\"ExpoMaps\",\"podspecDir\":\"../../packages/expo-maps/ios\"}],\"swiftModuleNames\":[\"ExpoMaps\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"MapsModule\"},{\"name\":null,\"class\":\"AppleMapsModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"coreFeatures\":[\"swiftui\",\"compose\"],\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-media-library\",\"pods\":[{\"podName\":\"ExpoMediaLibrary\",\"podspecDir\":\"../../packages/expo-media-library/ios\"}],\"swiftModuleNames\":[\"ExpoMediaLibrary\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"MediaLibraryModule\"},{\"name\":null,\"class\":\"MediaLibraryNextModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-mesh-gradient\",\"pods\":[{\"podName\":\"ExpoMeshGradient\",\"podspecDir\":\"../../packages/expo-mesh-gradient/ios\"}],\"swiftModuleNames\":[\"ExpoMeshGradient\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"MeshGradientModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"coreFeatures\":[\"swiftui\",\"compose\"],\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-modules-core\",\"pods\":[{\"podName\":\"ExpoModulesCore\",\"podspecDir\":\"../../packages/expo-modules-core\"},{\"podName\":\"ExpoModulesJSI\",\"podspecDir\":\"../../packages/expo-modules-core\"}],\"swiftModuleNames\":[\"ExpoModulesCore\",\"ExpoModulesJSI\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.7\"},{\"packageName\":\"expo-network\",\"pods\":[{\"podName\":\"ExpoNetwork\",\"podspecDir\":\"../../packages/expo-network/ios\"}],\"swiftModuleNames\":[\"ExpoNetwork\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"NetworkModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-notifications\",\"pods\":[{\"podName\":\"ExpoNotifications\",\"podspecDir\":\"../../packages/expo-notifications/ios\"}],\"swiftModuleNames\":[\"ExpoNotifications\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"BackgroundModule\"},{\"name\":null,\"class\":\"BadgeModule\"},{\"name\":null,\"class\":\"CategoriesModule\"},{\"name\":null,\"class\":\"EmitterModule\"},{\"name\":null,\"class\":\"HandlerModule\"},{\"name\":null,\"class\":\"PermissionsModule\"},{\"name\":null,\"class\":\"PresentationModule\"},{\"name\":null,\"class\":\"PushTokenModule\"},{\"name\":null,\"class\":\"SchedulerModule\"},{\"name\":null,\"class\":\"ServerRegistrationModule\"}],\"appDelegateSubscribers\":[\"NotificationsAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"expo-print\",\"pods\":[{\"podName\":\"ExpoPrint\",\"podspecDir\":\"../../packages/expo-print/ios\"}],\"swiftModuleNames\":[\"ExpoPrint\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoPrintModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-router\",\"pods\":[{\"podName\":\"ExpoRouter\",\"podspecDir\":\"../../packages/expo-router/ios\"}],\"swiftModuleNames\":[\"ExpoRouter\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoHeadModule\"},{\"name\":null,\"class\":\"LinkPreviewNativeModule\"},{\"name\":null,\"class\":\"RouterToolbarModule\"}],\"appDelegateSubscribers\":[\"ExpoHeadAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.0-preview.6\"},{\"packageName\":\"expo-screen-capture\",\"pods\":[{\"podName\":\"ExpoScreenCapture\",\"podspecDir\":\"../../packages/expo-screen-capture/ios\"}],\"swiftModuleNames\":[\"ExpoScreenCapture\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ScreenCaptureModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-screen-orientation\",\"pods\":[{\"podName\":\"ExpoScreenOrientation\",\"podspecDir\":\"../../packages/expo-screen-orientation/ios\"}],\"swiftModuleNames\":[\"ExpoScreenOrientation\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ScreenOrientationModule\"}],\"appDelegateSubscribers\":[\"ScreenOrientationAppDelegate\"],\"reactDelegateHandlers\":[\"ScreenOrientationReactDelegateHandler\"],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-secure-store\",\"pods\":[{\"podName\":\"ExpoSecureStore\",\"podspecDir\":\"../../packages/expo-secure-store/ios\"}],\"swiftModuleNames\":[\"ExpoSecureStore\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"SecureStoreModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-sensors\",\"pods\":[{\"podName\":\"ExpoSensors\",\"podspecDir\":\"../../packages/expo-sensors/ios\"}],\"swiftModuleNames\":[\"ExpoSensors\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"AccelerometerModule\"},{\"name\":null,\"class\":\"BarometerModule\"},{\"name\":null,\"class\":\"DeviceMotionModule\"},{\"name\":null,\"class\":\"GyroscopeModule\"},{\"name\":null,\"class\":\"MagnetometerModule\"},{\"name\":null,\"class\":\"MagnetometerUncalibratedModule\"},{\"name\":null,\"class\":\"PedometerModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-sharing\",\"pods\":[{\"podName\":\"ExpoSharing\",\"podspecDir\":\"../../packages/expo-sharing/ios\"}],\"swiftModuleNames\":[\"ExpoSharing\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"SharingModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.5\"},{\"packageName\":\"expo-sms\",\"pods\":[{\"podName\":\"ExpoSMS\",\"podspecDir\":\"../../packages/expo-sms/ios\"}],\"swiftModuleNames\":[\"ExpoSMS\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoSMSModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-speech\",\"pods\":[{\"podName\":\"ExpoSpeech\",\"podspecDir\":\"../../packages/expo-speech/ios\"}],\"swiftModuleNames\":[\"ExpoSpeech\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"SpeechModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-splash-screen\",\"pods\":[{\"podName\":\"ExpoSplashScreen\",\"podspecDir\":\"../../packages/expo-splash-screen/ios\"}],\"swiftModuleNames\":[\"ExpoSplashScreen\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"SplashScreenModule\"}],\"appDelegateSubscribers\":[\"SplashScreenAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-sqlite\",\"pods\":[{\"podName\":\"ExpoSQLite\",\"podspecDir\":\"../../packages/expo-sqlite/ios\"}],\"swiftModuleNames\":[\"ExpoSQLite\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"SQLiteModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-store-review\",\"pods\":[{\"podName\":\"ExpoStoreReview\",\"podspecDir\":\"../../packages/expo-store-review/ios\"}],\"swiftModuleNames\":[\"ExpoStoreReview\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"StoreReviewModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-structured-headers\",\"pods\":[{\"podName\":\"EXStructuredHeaders\",\"podspecDir\":\"../../packages/expo-structured-headers/ios\"}],\"swiftModuleNames\":[\"EXStructuredHeaders\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.0\"},{\"packageName\":\"expo-symbols\",\"pods\":[{\"podName\":\"ExpoSymbols\",\"podspecDir\":\"../../packages/expo-symbols/ios\"}],\"swiftModuleNames\":[\"ExpoSymbols\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"SymbolModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.3\"},{\"packageName\":\"expo-system-ui\",\"pods\":[{\"podName\":\"ExpoSystemUI\",\"podspecDir\":\"../../packages/expo-system-ui/ios\"}],\"swiftModuleNames\":[\"ExpoSystemUI\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"ExpoSystemUIModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-task-manager\",\"pods\":[{\"podName\":\"ExpoTaskManager\",\"podspecDir\":\"../../packages/expo-task-manager/ios\"}],\"swiftModuleNames\":[\"ExpoTaskManager\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"TaskManagerModule\"}],\"appDelegateSubscribers\":[\"TaskManagerAppDelegateSubscriber\"],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-tracking-transparency\",\"pods\":[{\"podName\":\"ExpoTrackingTransparency\",\"podspecDir\":\"../../packages/expo-tracking-transparency/ios\"}],\"swiftModuleNames\":[\"ExpoTrackingTransparency\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"TrackingTransparencyModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-updates\",\"pods\":[{\"podName\":\"EXUpdates\",\"podspecDir\":\"../../packages/expo-updates/ios\"}],\"swiftModuleNames\":[\"EXUpdates\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"UpdatesModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[\"ExpoUpdatesReactDelegateHandler\"],\"debugOnly\":false,\"packageVersion\":\"55.0.6\"},{\"packageName\":\"expo-updates-interface\",\"pods\":[{\"podName\":\"EXUpdatesInterface\",\"podspecDir\":\"../../packages/expo-updates-interface/ios\"}],\"swiftModuleNames\":[\"EXUpdatesInterface\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.1.1\"},{\"packageName\":\"expo-video\",\"pods\":[{\"podName\":\"ExpoVideo\",\"podspecDir\":\"../../packages/expo-video/ios\"}],\"swiftModuleNames\":[\"ExpoVideo\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"VideoModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-video-thumbnails\",\"pods\":[{\"podName\":\"ExpoVideoThumbnails\",\"podspecDir\":\"../../packages/expo-video-thumbnails/ios\"}],\"swiftModuleNames\":[\"ExpoVideoThumbnails\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"VideoThumbnailsModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"expo-web-browser\",\"pods\":[{\"podName\":\"ExpoWebBrowser\",\"podspecDir\":\"../../packages/expo-web-browser/ios\"}],\"swiftModuleNames\":[\"ExpoWebBrowser\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"WebBrowserModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.4\"},{\"packageName\":\"test-expo-ui\",\"pods\":[{\"podName\":\"TestExpoUi\",\"podspecDir\":\"modules/test-expo-ui/ios\"}],\"swiftModuleNames\":[\"TestExpoUi\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"TestExpoUiModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"0.0.1\"},{\"packageName\":\"unimodules-app-loader\",\"pods\":[{\"podName\":\"UMAppLoader\",\"podspecDir\":\"../../packages/unimodules-app-loader/ios\"}],\"swiftModuleNames\":[\"UMAppLoader\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"55.0.2\"},{\"packageName\":\"worklets-tester\",\"pods\":[{\"podName\":\"WorkletsTester\",\"podspecDir\":\"modules/worklets-tester/ios\"}],\"swiftModuleNames\":[\"WorkletsTester\"],\"flags\":{\"inhibit_warnings\":false},\"modules\":[{\"name\":null,\"class\":\"WorkletsTesterModule\"}],\"appDelegateSubscribers\":[],\"reactDelegateHandlers\":[],\"debugOnly\":false,\"packageVersion\":\"0.0.1\"}]}",
      "reasons": [
        "expoAutolinkingIos"
      ],
      "hash": "eceb4a15b6062ca119cfa76ebddb476e991e6d94"
    }
  }
]

Generated by PR labeler 🤖

Comment on lines +203 to +211
OnCreate {
ViewModifierRegistry.register("customBorder") { params, appContext, _ in
return try CustomBorderModifier(from: params, appContext: appContext)
}
}

OnDestroy {
ViewModifierRegistry.unregister("customBorder")
}
Copy link
Copy Markdown
Contributor Author

@intergalacticspacehighway intergalacticspacehighway Jan 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Later we can add a custom DSL for registering modifiers. I tried below, but it will require some changes in core to support multiple definitions (It will wrap OnCreate and OnDestroy internally).

Modifier("customBorder", CustomBorderModifier.self)

Once we finalise modifiers on Android we can think of a consistent DSL pattern. For now i just added explicit register/unregister in ViewModifierRegistry. cc - @Kudo wyt?


If you haven't installed Expo UI yet:

<APIInstallSection />
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<APIInstallSection />
<APIInstallSection />

This component only works when used inside SDK docs. Please replace this by a Terminal component that describes the whole command.

CleanShot 2026-01-21 at 19 18 44@2x

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, we don't need the If you are installing this in... in this guide, which is coming from the APIInstallSection component.

Copy link
Copy Markdown
Contributor Author

@intergalacticspacehighway intergalacticspacehighway Jan 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh i forgot to put packageName: '@expo/ui' in the frontmatter, the component works then. Should i put it? (removed "If you are installing")

Image

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd avoid putting the package name in the front matter since this is now outside of the Reference. Please add the terminal component manually.

Copy link
Copy Markdown
Contributor Author

@intergalacticspacehighway intergalacticspacehighway Jan 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense. Updated - 62a3746

Screenshot 2026-01-21 at 8 20 06 PM

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!


Export your native view from the module's index file using `requireNativeView`:

```ts index.ts
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is index.ts part of the module my-ui? I think so. Please add the complete path here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for catching, fixed in all snippets

@expo expo deleted a comment from expo-bot Jan 28, 2026
Copy link
Copy Markdown
Contributor

@Kudo Kudo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested verdict: 💬 COMMENT

Review: [ui][iOS] - Add support for custom SwiftUI views and modifiers

This PR exposes ViewModifierRegistry.register() and ViewModifierRegistry.unregister() as public static methods, enabling third-party Expo modules to register custom SwiftUI modifiers. It also adds comprehensive documentation and a working example module in native-component-list.

What works well:

  • Clean API surface: static register/unregister methods delegate to the existing singleton, keeping the architecture intact.
  • The example module (test-expo-ui) demonstrates both custom views and custom modifiers end-to-end.
  • The JS-side createModifier was already public with documentation intent for third-party use — this PR completes the native-side story.
  • Documentation is thorough, step-by-step, and follows existing patterns.

Key concerns:

  • Thread safety: The mutable modifierFactories dictionary has no synchronization. Currently safe because all writes happen during init(), but making register()/unregister() public opens it to concurrent read-write races.
  • No guard against overwriting built-in modifiers.
  • The ModiferFactory typealias has a typo (ModiferModifier) that's now part of the public API.

* This system uses ViewModifier structs for better performance than AnyView wrapping.
*/
internal class ViewModifierRegistry {
public class ViewModifierRegistry {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[🏗️ design] [design] Thread safety concern: ViewModifierRegistry is being made public with mutable state (modifierFactories dictionary) but has no synchronization mechanism. Currently this is safe because all writes happen during init(), but with public register()/unregister() methods, third-party code can call these at any time — including concurrently with applyModifier() reads on the render thread.

Options to consider:

  1. Add @MainActor to the class (simplest — ensures all access is on the main thread)
  2. Add a lock around modifierFactories mutations
  3. Document that register() must only be called during OnCreate (before views render) — this is the current pattern in the example, but nothing enforces it

Option 3 is pragmatically fine if you trust module authors to follow the pattern, since OnCreate runs synchronously during module initialization before any views are rendered. But it's worth a brief doc comment on the public register() method noting this constraint.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

makes sense, added a note to the functions and also in the docs. Thanks!

static let shared = ViewModifierRegistry()

internal typealias ModiferFactory = ([String: Any], AppContext, EventDispatcher) throws -> any ViewModifier
public typealias ModiferFactory = ([String: Any], AppContext, EventDispatcher) throws -> any ViewModifier
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[🐧 nit] [nit] The typealias ModiferFactory has a typo — should be ModifierFactory. Since this is now being promoted to public API, this typo becomes part of the public contract. Worth fixing before shipping if there are no existing consumers outside the package.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

my bad. please help me to fix the typo

factory: @escaping ModiferFactory
) {
shared.register(type, factory: factory)
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[🏗️ design] [design] No guard against overwriting built-in modifiers. A third-party module could call register("padding", factory: ...) and silently replace the built-in padding modifier. Consider either:

  1. Checking if the key already exists and logging a warning / throwing
  2. Documenting that overwriting built-in modifiers is unsupported behavior

At minimum, a log warning would help developers debug unexpected behavior if two modules register the same modifier name.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a warning log

@@ -1332,6 +1349,13 @@ internal class ViewModifierRegistry {
modifierFactories[type] = factory
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[🐧 nit] [suggestion] The new instance-level unregister() method lacks an access modifier, defaulting to internal. This is inconsistent with the instance-level register() method (also internal). Both are fine since the public API goes through the static methods, but it may be worth adding explicit internal for clarity.

VStack {
Text(props.title)
.font(.headline)
Children() // Renders React children
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[💡 suggestion] [suggestion] The guide shows @ObservedObject public var props but the example module's MyCustomView.swift uses @ObservedObject var props (no public). They should be consistent. The docs version with public is more correct since ExpoSwiftUI.View protocol likely requires public access.

"apple": {
"modules": ["TestExpoUiModule"]
}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's move the module to apps/bare-expo/modules. we used to test NCL from bare-expo or expo-go.
in the NCL screen, maybe to check if the custom module exists. otherwise when we tested from expo-go, it may break

Copy link
Copy Markdown
Contributor

@Kudo Kudo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

generally looks good. let's merge it after addressing the nit comments

children?: React.ReactNode;
}

export const MyCustomView = requireNativeView<MyCustomViewProps>('TestExpoUi', 'MyCustomView');
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

may need the lines otherwise the view with onTapPress modifier will not work

modifiers={modifiers}
{...(modifiers ? createViewModifierEventListener(modifiers) : undefined)}

children?: React.ReactNode;
}

export const MyCustomView = requireNativeView<MyCustomViewProps>('MyUi', 'MyCustomView');
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto. should cover createViewModifierEventListener in the doc

modifiers={modifiers}
{...(modifiers ? createViewModifierEventListener(modifiers) : undefined)}

</VStack>
</Host>
);
}
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested it on bare-expo and plain NCL app

@intergalacticspacehighway intergalacticspacehighway merged commit 374915d into main Feb 4, 2026
15 checks passed
@intergalacticspacehighway intergalacticspacehighway deleted the expo-ui-external-modifiers branch February 4, 2026 17:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants