Expo

The Expo integration uses @usergist/feedback-react-native, including the same feedback, surveys, in-app messages, feature requests, analytics, identity, and push APIs.

Use Expo 56 or 57 development and production builds on iOS/Android. Expo Go cannot load UserGist's native bridge. Web targets use the separate Web SDK.

Startup presentation readiness

Initialize with presentationPaused: true at app launch. Analytics, consent, identity, and networking continue while campaign UI waits. After the existing startup loading and navigation have finished and the loaded screen is visible, call resumePresentation(). Mount any required UserGist UI provider before that callback. Readiness must work for both anonymous and identified users.

Call pausePresentation() before another flow that must not be interrupted. Pausing does not dismiss an already visible SDK surface. Queued feedback, surveys, and in-app messages are discarded if their consent is withdrawn or the user changes, even if consent is granted again before resuming. Repeated initialization keeps the first readiness setting; repeated resume calls do not show the same queued work twice. The option defaults to false for existing integrations, so upgrading alone does not enable startup deferral.

Do not resume from a splash screen, an app-root mount that still shows loading, a disappearing screen, or a fixed timer. Use the host's existing completion callback; the SDK cannot infer when arbitrary startup navigation has finished.

// After the loaded screen and startup navigation are ready:
UserGist.resumePresentation()

Install

Expo support is currently a prerelease: the npm next channel resolves to 0.2.0-beta.2. Signed physical-device acceptance is still required before production readiness can be confirmed.

npx expo install @usergist/feedback-react-native@next \
  @react-native-async-storage/async-storage react-native-safe-area-context

Add "@usergist/feedback-react-native" to expo.plugins. Initialize once with UserGist.init({ writeKey: 'rk_dev_REPLACE_ME', environment: 'development', presentationPaused: true }). This returns synchronously; render the app while SDK networking continues. Wrap your existing UI in UserGistProvider; with Expo Router, do this around Slot or Stack in app/_layout.tsx.

Anonymous visitors do not need login. Identify signed-in users with a scoped subject token minted by the authenticated backend. Connect consent to your app's decisions and await reset() on logout. Our demo's consent controls are for testing; they are not mandatory customer UI.

This release includes identity completion, token renewal, profile set/unset, and installation-scoped logout. Follow the identity guide for backend-verified guest accounts and the upgrade guide when moving an existing integration to this release.

Push

Configure the plugin with push.mode: 'automatic' and push.ios.apsEnvironment: 'development' or 'production' according to signing. Set the app bundle/package identifiers and android.googleServicesFile. Keep APNs private keys and FCM service-account credentials in UserGist.

The plugin generates the iOS notification extension and shared App Group, and declares the extension to EAS for provisioning. Runtime APNs registration reads the plugin's signing setting when you call enablePush(), independently of the SDK data environment. Call it only after opt-in and successful push consent synchronization.

If you already use expo-notifications, preserve its plugin and handlers, select push.mode: 'expo-notifications', and configure before initializing:

import * as Notifications from 'expo-notifications'
import { configureExpoNotifications } from '@usergist/feedback-react-native/expo'
configureExpoNotifications(Notifications)

The helper uses native APNs/FCM tokens, not ExpoPushToken. UserGist and unrelated notifications retain separate handling; disabling UserGist does not remove the app's shared provider token.

Conflicts

An existing custom notification extension or FCM service requires explicit composition. The plugin stops with the conflicting target/service name instead of replacing it. Preserve that integration and use the host-forwarded Push API documented under React Native. Do not enable two FCM services.

Rebuild after native/plugin changes using Expo run commands or EAS Build. EAS Update cannot add the missing native bridge. Use --no-clean for Expo 57 prebuild when retaining existing native directories.

Full configuration, custom extension identifiers, and the release acceptance checklist ship as EXPO.md and EXPO-ACCEPTANCE.md in the package. To verify push delivery, use your app’s credentials, register its token, and confirm a test notification arrives.