目录
1. 摄像头(Camera)
iOS:
原生 API:
AVFoundation
框架(AVCaptureSession
、AVCaptureDevice
)。权限:
NSCameraUsageDescription
(必须描述用途)。技术细节:
支持多摄像头切换(广角、超广角、LiDAR)。
后台使用受限(锁屏后必须释放摄像头)。
React Native 库:
react-native-vision-camera
(推荐)或react-native-camera
。
Android:
原生 API:
Camera2
(Android 5.0+)或CameraX
(Jetpack 组件)。权限:
android.permission.CAMERA
。技术细节:
需处理动态权限请求(Android 6.0+)。
屏幕旋转需手动适配(
OrientationEventListener
)。
差异点:
Android 允许后台使用摄像头(需前台服务),但可能被系统限制。
2. 麦克风(Microphone)
iOS:
原生 API:
AVAudioSession
(管理音频会话)。权限:
NSMicrophoneUsageDescription
。技术细节:
后台录音需开启
Audio
后台模式(Info.plist
中配置)。
React Native 库:
react-native-audio-record
、react-native-voice
。
Android:
原生 API:
MediaRecorder
或AudioRecord
。权限:
RECORD_AUDIO
。技术细节:
后台录音需通过
foreground service
保持活跃。
差异点:
Android 支持更灵活的音频格式和低延迟录音。
3. 加速度计(Accelerometer)
iOS:
原生 API: Core Motion 框架(
CMMotionManager
)。权限: 无需显式权限。
数据频率: 最高 100Hz,需手动控制采样率。
代码示例:
let motionManager = CMMotionManager()
motionManager.startAccelerometerUpdates(to: .main) { data, error in
print(data?.acceleration)
}
Android:
原生 API:
SensorManager
(Sensor.TYPE_ACCELEROMETER
)。权限: 无。
代码示例:
SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(listener, accelerometer, SensorManager.SENSOR_DELAY_UI);
差异点:
Android 设备传感器精度差异较大(需校准处理)。
4. 陀螺仪(Gyroscope)
iOS:
原生 API: Core Motion 框架(
CMMotionManager
)。数据融合: 结合加速度计和陀螺仪实现姿态跟踪(如 ARKit)。
React Native 库:
react-native-sensors
。
Android:
原生 API:
Sensor.TYPE_GYROSCOPE
。校准: 需调用
SensorManager.getRotationMatrix
处理漂移。差异点:
iOS 自动优化传感器数据,Android 需手动处理噪声和漂移。
5. 磁力计(Magnetometer)
iOS:
原生 API: Core Motion(
CMMagnetometerData
)。用途: 电子罗盘需结合加速度计数据计算方位。
代码示例:
motionManager.startMagnetometerUpdates(to: .main) { data, error in
print(data?.magneticField)
}
Android:
原生 API:
Sensor.TYPE_MAGNETIC_FIELD
。干扰处理: 需排除设备自身磁场干扰(如通过
Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR
)。差异点:
Android 提供更底层的磁场数据,但需开发者处理校准。
6. 近距离传感器(Proximity Sensor)
iOS:
原生 API:
UIDevice.proximityState
(仅用于通话场景)。限制: 无法自定义阈值,仅返回
YES/NO
。- 代码示例:
UIDevice.current.isProximityMonitoringEnabled = true
NotificationCenter.default.addObserver(self, selector: #selector(proximityChanged), name: UIDevice.proximityStateDidChangeNotification, object: nil)
Android:
原生 API:
Sensor.TYPE_PROXIMITY
。灵活度: 可获取实际距离(厘米),但依赖硬件支持。
差异点:
Android 支持更广泛的场景(如非通话应用)。
7. 光线传感器(Light Sensor)
iOS:
限制: 无公开 API,仅系统自动调节亮度使用。
绕过方案: 越狱设备或私有 API(可能导致 App 审核被拒)。
Android:
原生 API:
Sensor.TYPE_LIGHT
。代码示例:
Sensor lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
sensorManager.registerListener(listener, lightSensor, SensorManager.SENSOR_DELAY_NORMAL);
差异点:
Android 开放数据,但部分低端设备无此传感器。
8. GPS(定位)
iOS:
原生 API: Core Location(
CLLocationManager
)。权限:
NSLocationWhenInUseUsageDescription
或NSLocationAlwaysUsageDescription
。高精度模式:
desiredAccuracy = kCLLocationAccuracyBest
.
Android:
原生 API:
LocationManager
或 Fused Location Provider(Google Play Services)。权限:
ACCESS_FINE_LOCATION
。差异点:
Android 需处理国产手机阉割 Google Play Services 的问题(如华为设备)。
9. 蓝牙(Bluetooth)
iOS:
原生 API: Core Bluetooth(
CBCentralManager
、CBPeripheral
)。限制: 仅支持 BLE,后台模式需声明
bluetooth-central
。代码示例:
let centralManager = CBCentralManager()
centralManager.scanForPeripherals(withServices: nil)
Android:
原生 API:
BLE:
BluetoothLeScanner
。经典蓝牙:
BluetoothSocket
。
权限:
BLUETOOTH
、BLUETOOTH_ADMIN
及位置权限(Android 12+)。差异点:
Android 支持经典蓝牙和 BLE,但需处理碎片化问题(如小米蓝牙兼容性)。
10. NFC(近场通信)
iOS:
原生 API: Core NFC(仅读取 NDEF 标签)。
限制: iPhone 7 及以上,需用户主动触发扫描。
代码示例:
let session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true)
session.begin()
Android:
原生 API:
NfcAdapter
。功能: 支持读写、模拟卡片(需 API 19+)。
差异点:
Android 提供更完整的 NFC 功能(如 HCE 模拟卡片)。
11. 指纹/面部识别(Biometrics)
iOS:
原生 API: Local Authentication(
LAContext
)。权限: Face ID 需
NSFaceIDUsageDescription
。代码示例:
let context = LAContext()
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "Unlock") { success, error in }
Android:
原生 API: BiometricPrompt(API 28+)。
权限:
USE_BIOMETRIC
。差异点:
Android 支持多种生物特征(指纹、面部、虹膜)。
12. 气压计(Barometer)
iOS:
原生 API:
CMAltimeter
(iPhone 6 及以上)。数据格式: 返回海拔变化(相对值),非绝对气压值。
Android:
原生 API:
Sensor.TYPE_PRESSURE
。限制: 仅部分设备支持(如三星 Galaxy 系列)。
13. 温度/湿度传感器
通用限制: 手机通常无开放 API,需通过外接蓝牙传感器(如
react-native-ble-plx
)或设备厂商私有 SDK(如 Samsung 的 S Health)。
14. 心率传感器
iOS:
集成方式: 通过 HealthKit 读取 Apple Watch 或第三方设备数据。
代码示例:
Android:
实现方式: 通过 BLE 读取蓝牙心率带,或依赖设备硬件(如 Samsung Galaxy 手机)。
15. 红外传感器(Infrared)
iOS:
限制: 无公开 API,仅 MFi 认证设备可用(如遥控类 App)。
Android:
原生 API:
ConsumerIrManager
(部分设备支持,如华为)。代码示例:
ConsumerIrManager irManager = (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE);
irManager.transmit(frequency, pattern);
16. 超声波传感器
通用实现: 依赖麦克风和扬声器发射/接收声波,通过
react-native-audio
捕获信号,使用 FFT 算法计算距离。限制: 精度受环境噪音影响,需复杂信号处理。
17. 触觉反馈(Haptic Feedback)
iOS:
原生 API:
UIFeedbackGenerator
(支持三种类型:UIImpactFeedbackStyle
、UINotificationFeedbackType
、UISelectionFeedback
)。代码示例:
let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()
Android:
原生 API:
Vibrator
(支持振动强度和模式控制)。代码示例:
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
vibrator.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE));
18. USB接口(USB Port)
iOS:
限制: 仅支持 MFi 认证外设(需私有 API,无公开方案)。
Android:
原生 API:
UsbManager
(需 USB Host 模式支持)。代码示例:
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
关键差异总结
模块 | iOS | Android |
---|---|---|
摄像头后台使用 | 禁止 | 允许(需前台服务) |
NFC 功能 | 仅读取 NDEF | 完整读写、模拟卡片 |
生物识别多样性 | Face ID/Touch ID | 指纹、面部、虹膜 |
传感器开放度 | 限制较多(如光线传感器) | 开放更多底层数据 |
蓝牙类型支持 | 仅 BLE | BLE + 经典蓝牙 |
USB 外设支持 | 仅 MFi 认证设备 | 灵活支持 OTG 外设 |
通用注意事项
权限动态请求: 使用
react-native-permissions
处理 iOS 和 Android 的动态权限逻辑。后台限制: iOS 对后台硬件使用(如 GPS、蓝牙)限制严格,需明确声明用途。
设备兼容性: 检测硬件是否支持(如通过
SensorManager.getDefaultSensor
返回null
表示不支持)。性能优化: 高频传感器数据需在 Native 层处理,避免跨桥接层传递导致性能瓶颈。
法律合规: 涉及用户隐私数据(如面部识别)需遵循 GDPR、CCPA 等法规。