React Native apps can access a wide range of device capabilities through dedicated modules and Expo libraries. The expo-location module provides GPS access with permission handling, while expo-image-picker and expo-secure-store handle camera roll and encrypted storage respectively. Push notifications can be implemented using Expo Notifications or Notifee plus react-native-push-notification, requiring registration for push tokens via FCM or APNs. Biometric authentication uses expo-local-authentication or react-native-biometrics to invoke Face ID, Touch ID, or Android's BiometricPrompt, with appropriate fallback to the device passcode. The Share API opens the native share sheet, and Vibration triggers short haptic feedback.
Persistent storage comes in several flavors. AsyncStorage offers a simple, asynchronous key-value store similar to web localStorage, suitable for non-sensitive preferences. SecureStore and react-native-keychain use the iOS Keychain and Android Keystore with hardware-backed encryption, making them the right choice for auth tokens and passwords. For relational data, libraries like WatermelonDB or react-native-mockup-sqlite-storage provide structured storage with offline-first sync patterns that queue mutations locally and push them when connectivity returns, resolved via NetInfo's connectivity events. MMKV is a fast alternative for high-throughput key-value storage when AsyncStorage performance is insufficient.
Network connectivity is detected with @react-native-community/netinfo, which provides real-time updates and access to connection type information. HTTP requests typically use the fetch API, often paired with async/await inside effects or event handlers, while axios adds interceptors, retries, and automatic JSON parsing. For advanced data fetching, useSWR and React Query handle caching and revalidation cleanly. File uploads with progress can be tracked via XMLHttpRequest's onUploadProgress or axios callbacks, or via dedicated libraries like expo-file-system's uploadAsync for background-capable uploads. When requesting sensitive permissions such as the camera roll, declare the appropriate usage description in Info.plist and request runtime permissions using PermissionsAndroid on Android, with the library handling iOS automatically.