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-contextAdd "@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.