--- name: rn-native-features description: Native iOS features in Expo React Native apps. Use when implementing camera, push notifications, haptics, permissions, device sensors, or other native APIs in Expo. --- # Native Features (Expo) ## Permissions Pattern Always request permissions before using native features: ```typescript import * as Camera from 'expo-camera'; async function requestCameraPermission() { const { status } = await Camera.requestCameraPermissionsAsync(); if (status !== 'granted') { // Guide user to settings if denied Alert.alert( 'Camera Access Required', 'Please enable camera access in Settings to take photos.', [ { text: 'Cancel', style: 'cancel' }, { text: 'Open Settings', onPress: () => Linking.openSettings() }, ] ); return false; } return true; } ``` ### Check permission status first ```typescript import * as Camera from 'expo-camera'; function usePermission() { const [permission, requestPermission] = Camera.useCameraPermissions(); // permission.granted - boolean // permission.canAskAgain - false if user selected "Don't ask again" // permission.status - 'granted' | 'denied' | 'undetermined' return { permission, requestPermission }; } ``` ## Camera ### Basic Camera with Photo Capture ```typescript import { CameraView, useCameraPermissions } from 'expo-camera'; import { useRef, useState } from 'react'; export function CameraScreen() { const [permission, requestPermission] = useCameraPermissions(); const [facing, setFacing] = useState<'front' | 'back'>('back'); const cameraRef = useRef(null); if (!permission) return ; if (!permission.granted) { return ( Camera access is required