Skip to content

[pull] main from expo:main#751

Merged
pull[bot] merged 6 commits intocode:mainfrom
expo:main
Apr 7, 2026
Merged

[pull] main from expo:main#751
pull[bot] merged 6 commits intocode:mainfrom
expo:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull bot commented Apr 7, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

ramonclaudio and others added 6 commits April 7, 2026 12:20
Add `textContentType` modifier for setting the semantic meaning of text
input areas. Wraps SwiftUI's
[`textContentType(_:)`](https://developer.apple.com/documentation/swiftui/view/textcontenttype(_:)-ufdv)
(iOS 13+), mapping to all 45
[`UITextContentType`](https://developer.apple.com/documentation/uikit/uitextcontenttype)
values.

Enables iOS autofill for passwords, emails, addresses, credit cards, OTP
codes, and more.

```tsx
import { textContentType } from "@expo/ui/swift-ui/modifiers";

<TextField
  placeholder="Username"
  modifiers={[textContentType("username")]}
/>

<SecureField
  placeholder="Password"
  modifiers={[textContentType("password")]}
/>
```

Without this modifier, text fields cannot participate in the iOS
keychain autofill system. Values introduced in iOS 17+
(`creditCardExpiration`, `birthdate`, etc.) and iOS 17.4+
(`cellularEID`, `cellularIMEI`) include `#available` guards with
sensible fallbacks.

# Test Plan

- `yarn build` in `packages/expo-ui`: clean
- `yarn lint --fix` in `packages/expo-ui`: clean
- `yarn lint` in `packages/expo-ui`: clean
- `yarn test` in `packages/expo-ui`: 42/42 passing
- Regenerated docs API data with `et generate-docs-api-data -p expo-ui`
- Applied `.username` to TextField and `.password` to SecureField in
bare-expo, verified iOS password autofill suggestion appears above
keyboard
# Why

`playsInSilentMode` was only supported on iOS. On Android, the property
was filtered out in `setAudioModeAsync` and had no effect. This adds
Android support so apps can respect the device's silent/vibrate mode.

# How

- Added `playsInSilentMode` field (default `true`) to the `AudioMode`
record in `AudioRecords.kt`
- Stored the value in `AudioModule.kt` when `setAudioModeAsync` is
called
- Added a ringer mode check before playback — when `playsInSilentMode`
is `false` and `AudioManager.getRingerMode()` is not
`RINGER_MODE_NORMAL`, playback is suppressed
- Updated `ExpoAudio.ts` to forward `playsInSilentMode` to the Android
native module (previously filtered out)
- Removed `@platform ios` from the `playsInSilentMode` JSDoc and added
Android-specific documentation

# Test Plan

- Call `setAudioModeAsync({ playsInSilentMode: false })`
- Put Android device in silent/vibrate mode → playback should be
suppressed
- Put Android device in normal ringer mode → playback should work
- Verify default behavior (`playsInSilentMode: true`) is unchanged —
audio plays regardless of ringer mode

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [x] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
… values to JS (#44550)

# Why

PR #41339 moved EXConstantsService from expo-constants to
expo-modules-core as ConstantsProvider when rewriting to Swift.

The Swift code puts optional return values:

getManifest() → [String: Any]?, getBuildVersion() → String?) directly
into a [String: Any] dictionary literal. This wraps the optional as
Optional<T> typed as Any, creating a double-optional when accessed via
subscript. The Expo modules bridge can't unwrap this and sends null to
JS.

The old ObjC code used EXNullIfNil() which always returned a concrete
type, avoiding this issue.

Partly fixes these issues (also need additional fix):  #44527,  #44528
Additional fix for above issues: #44551

# How

This commit fixes this by explicitly testing getManifest()'s result
value before assigning it to the return value in the `constants`
accessor.

In addition it unwraps getBuildNumber() with ?? "" to avoid the same
issue there.

Also added test that fails with the old code and passes with the new
code.

# Test Plan

- Added failing swift tests for both manifest and buildNumber. Passes
with these fixes.
- Also tested in the issue reproduction project:
https://github.com/uniquedevs/expo-constants-null-repro-55

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).

---------

Co-authored-by: Expo Bot <34669131+expo-bot@users.noreply.github.com>
# Why 

The function `getManifest` in the new ConstantsProvider.swift file
previously read the `EXConstants.bundle` using `Bundle(for:)` which
fails when running using precompiled XCFrameworks since then
the´Bundle(for:)` function will try to read the bundle from the
XCFramework itself.

# How

This commit fixes this by explicitly reading the bundle using
`Bundle.main.resourceURL` which works when building from source and
running with precompiled XCFrameworks.

Fixes #44528 and #44527
Required fix: #44550

# Test-plan

Tested in the issue reproduction:
https://github.com/uniquedevs/expo-constants-null-repro-55

Both with source + xcframeworks.

NOTE: ExpoModulesCore is built with `s.static_framework = true` when
`!use_framework` is set - so this error should only be visible when
using precompiled frameworks - `EXPO_USE_PRECOMPILED_MODULES=1` - when
running `pod install`.

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).

---------

Co-authored-by: Expo Bot <34669131+expo-bot@users.noreply.github.com>
…44554)

# Why

When building using precompiled XCFrameworks, we disable use_framework
for the modules that are already built as XCFramework.

A guard to avoid doing this when NOT using precompiled XCFrameworks was
missing.

# How

Added guard to avoid this when not using precompiled frameworks.

# Test-plan

Tested in stand-alone project both with/without precompiled xcframeworks
when use_framework is set.

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).

---------

Co-authored-by: Expo Bot <34669131+expo-bot@users.noreply.github.com>
@pull pull bot locked and limited conversation to collaborators Apr 7, 2026
@pull pull bot added the ⤵️ pull label Apr 7, 2026
@pull pull bot merged commit 3458ab1 into code:main Apr 7, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants