Expo提供了丰富的原生组件和API,使开发者能够轻松访问移动设备的各种功能。这些组件和API经过精心设计,提供了统一的跨平台接口。
核心原生组件:
- Camera(相机)
javascriptimport { Camera } from 'expo-camera'; // 请求相机权限 const { status } = await Camera.requestCameraPermissionsAsync(); // 使用相机组件 <Camera style={{ flex: 1 }} type={type} />
- Location(位置服务)
javascriptimport * as Location from 'expo-location'; // 请求位置权限 const { status } = await Location.requestForegroundPermissionsAsync(); // 获取当前位置 const location = await Location.getCurrentPositionAsync({});
- Notifications(推送通知)
javascriptimport * as Notifications from 'expo-notifications'; // 请求通知权限 const { status } = await Notifications.requestPermissionsAsync(); // 发送本地通知 await Notifications.scheduleNotificationAsync({ content: { title: 'Hello!', body: 'This is a notification', }, trigger: { seconds: 2 }, });
- Audio(音频)
javascriptimport { Audio } from 'expo-av'; // 播放音频 const { sound } = await Audio.Sound.createAsync( { uri: 'https://example.com/audio.mp3' } ); await sound.playAsync();
- FileSystem(文件系统)
javascriptimport * as FileSystem from 'expo-file-system'; // 读取文件 const content = await FileSystem.readAsStringAsync(fileUri); // 写入文件 await FileSystem.writeAsStringAsync(fileUri, 'Hello World');
- ImagePicker(图片选择器)
javascriptimport * as ImagePicker from 'expo-image-picker'; // 选择图片 const result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ['images'], allowsEditing: true, });
- SecureStore(安全存储)
javascriptimport * as SecureStore from 'expo-secure-store'; // 保存敏感数据 await SecureStore.setItemAsync('token', 'user-token'); // 读取敏感数据 const token = await SecureStore.getItemAsync('token');
- Sensors(传感器)
javascriptimport { Accelerometer } from 'expo-sensors'; // 监听加速度计 Accelerometer.addListener(accelerometerData => { console.log(accelerometerData); });
常用API:
- Constants(常量)
javascriptimport Constants from 'expo-constants'; // 获取设备信息 const deviceName = Constants.deviceName; const platform = Constants.platform;
- Haptics(触觉反馈)
javascriptimport * as Haptics from 'expo-haptics'; // 触发触觉反馈 Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);
- Linking(链接处理)
javascriptimport * as Linking from 'expo-linking'; // 打开URL await Linking.openURL('https://expo.dev'); // 处理深度链接 const url = await Linking.getInitialURL();
- ScreenOrientation(屏幕方向)
javascriptimport * as ScreenOrientation from 'expo-screen-orientation'; // 锁定屏幕方向 await ScreenOrientation.lockAsync( ScreenOrientation.OrientationLock.PORTRAIT );
权限管理:
Expo提供了统一的权限请求API:
javascriptimport * as Permissions from 'expo-permissions'; // 请求权限 const { status, granted } = await Permissions.askAsync( Permissions.CAMERA, Permissions.LOCATION );
最佳实践:
-
权限请求时机:在用户需要使用功能时再请求权限,提供清晰的说明
-
错误处理:妥善处理权限被拒绝的情况,提供友好的用户提示
-
性能优化:及时释放资源,如停止传感器监听、取消音频播放等
-
平台差异:注意不同平台的API差异,使用条件渲染处理平台特定功能
-
异步操作:所有原生API调用都是异步的,使用async/await处理
这些原生组件和API大大简化了跨平台开发,使开发者能够专注于业务逻辑而不是原生实现细节。