react-native-permissions là lib chuẩn cho iOS/Android permission.
API thống nhất:
import { check, request, PERMISSIONS, RESULTS } from 'react-native-permissions'
async function requestCamera() {
const permission = Platform.select({
ios: PERMISSIONS.IOS.CAMERA,
android: PERMISSIONS.ANDROID.CAMERA,
})!
const status = await check(permission)
switch (status) {
case RESULTS.UNAVAILABLE:
// device không có camera
break
case RESULTS.DENIED:
// chưa được hỏi → request lần đầu
const result = await request(permission)
return result === RESULTS.GRANTED
case RESULTS.GRANTED:
return true
case RESULTS.BLOCKED:
// user từ chối permanent → mở Settings
Linking.openSettings()
break
}
}Setup config:
- iOS: Info.plist thêm key NSCameraUsageDescription, NSLocationWhenInUseUsageDescription, ... với mô tả lý do (App Store reject nếu thiếu hoặc generic).
- Android: AndroidManifest.xml thêm <uses-permission>. Android 6+ cần runtime request, lib tự handle.
Pattern UX 2026:
1. Pre-prompt: trước khi popup native, hiển thị custom modal explain why → tăng grant rate.
2. Just-in-time request: chỉ request khi feature cần (vd request camera khi user nhấn "Take photo", không request lúc app start).
3. Graceful fallback: nếu denied, app vẫn hoạt động không crash; chỉ hide feature liên quan.
4. Settings deeplink: với BLOCKED, deep link vào Settings app cho user enable manual.
iOS 14+ specific:
- PERMISSIONS.IOS.LOCATION_WHEN_IN_USE vs LOCATION_ALWAYS — request when-in-use trước, sau đó upgrade lên always khi cần background.
- App Tracking Transparency (PERMISSIONS.IOS.APP_TRACKING_TRANSPARENCY) — bắt buộc nếu dùng IDFA.