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 e Info.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

  1. pubspec.yaml: Adicione permission_handler: ^12.0.0+1
  2. Info.plist: Inclua a chave NSCameraUsageDescription com uma descrição adequada
  3. Podfile: Adicione as flags conforme acima
  4. Limpe e reinstale tudo:
    flutter clean
    flutter pub get
    cd ios
    pod install --repo-update
    cd ..

  5. 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!