Flutter iOS: Permission Handler sempre retorna permanentlyDenied? Veja como resolver!
Se você trabalha com Flutter e está tentando usar o plugin permission_handler
para pedir permissões de câmera, microfone, fotos ou localização no iOS, provavelmente já passou por este problema:
- Você configura tudo no
pubspec.yaml
eInfo.plist
- Instala no iPhone/iPad, mas o plugin sempre retorna
PermissionStatus.permanentlyDenied
- Nos Ajustes do iOS, nem aparece a permissão para ativar
✅ Como resolver: Ative as permissões no Podfile
No seu arquivo ios/Podfile
, adicione este bloco dentro do post_install
:
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
'PERMISSION_CAMERA=1',
# Adicione outras permissões conforme necessário
# 'PERMISSION_MICROPHONE=1',
# 'PERMISSION_PHOTOS=1',
# 'PERMISSION_LOCATION=1',
]
end
end
end
📦 Checklist para permissão funcionar no iOS/Flutter
- pubspec.yaml: Adicione
permission_handler: ^12.0.0+1
- Info.plist: Inclua a chave
NSCameraUsageDescription
com uma descrição adequada - Podfile: Adicione as flags conforme acima
- Limpe e reinstale tudo:
flutter clean
flutter pub get
cd ios
pod install --repo-update
cd .. - Teste no dispositivo físico, não no simulador!
🧑💻 Código exemplo de solicitação de permissão
import 'package:permission_handler/permission_handler.dart';
Future<void> requestCameraPermission(BuildContext context) async {
final status = await Permission.camera.request();
if (status.isGranted) {
// Permissão concedida, siga com a funcionalidade
} else if (status.isPermanentlyDenied) {
// Mostre um alerta e abra as configurações do app
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Permissão obrigatória'),
content: Text('Ative a permissão de câmera nos Ajustes do iOS para usar esta função.'),
actions: [
TextButton(
onPressed: () => openAppSettings(),
child: Text('Abrir Ajustes'),
),
],
),
);
}
}
Se você passou por esse problema, compartilhe este post para ajudar outros desenvolvedores!