Skip to content

@clerk/expo v3: useSignIn().isLoaded stays false forever in iOS Simulator (Expo SDK 55) #8236

@charian47

Description

@charian47

After migrating from @clerk/clerk-expo v2.19.25 to @clerk/expo v3.1.5, useSignIn().isLoaded and useSignUp().isLoaded never become true in the iOS Simulator. Auth works perfectly on physical devices (iPhone 17 Pro, iOS 26).

Environment

Component Version
@clerk/expo 3.1.5
Expo SDK 55.0.6
React Native 0.83.2
React 19.2.0
Simulator device iPhone 16e
Simulator iOS 26.3
Xcode 26.4 (Build 17E192)
macOS Darwin 25.4.0
Physical device (works) iPhone 17 Pro, iOS 26

@clerk/expo is added to the app.json plugins array. Build output confirms: ✅ Clerk iOS plugin loaded.

What we verified

  • Network works: curl from the simulator to the Clerk API (https://<instance>.clerk.accounts.dev/v1/environment) returns the full environment config successfully.
  • Publishable key is valid: Test mode key, confirmed via API response.
  • Plugin loads: Build output shows ✅ Clerk iOS plugin loaded.
  • Physical device works: Same code, same key — auth works perfectly on iPhone 17 Pro.
  • Not a timing issue: We polled isLoaded for 15+ seconds (30 attempts at 500ms). It never becomes true. The client from useClientContext() is permanently null.
  • Worked with v2: @clerk/clerk-expo v2.19.25 worked in the same simulator environment.

Steps to reproduce

  1. Create an Expo app with @clerk/expo v3 and add it to app.json plugins
  2. Build and run in iOS Simulator via npx expo run:ios
  3. Navigate to a screen using useSignIn() or useSignUp()
  4. Check isLoaded — it stays false forever

Expected behavior

isLoaded should become true after Clerk initializes, as it does on physical devices.

Additional context

The configureNativeClerk() function in ClerkProvider.js silently swallows errors when the native module fails — the debug logging is compiled out with if (false) guards (lines 92, 130, 153, 162, 168). This makes it extremely hard to diagnose what's going wrong during initialization. Even adding a 15-second polling timeout doesn't help because the client is never populated, not just delayed.

This may be related to previously closed issues #1584 and #3563, but those were closed/locked and this is specific to @clerk/expo v3 on iOS Simulator.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions