[{"data":1,"prerenderedAt":22},["ShallowReactive",2],{"articolo-gestire-i-permessi-in-flutter-con-permission-handler-guida-completa":3,"comments-article-gestire-i-permessi-in-flutter-con-permission-handler-guida-completa":21},{"id":4,"title":5,"slug":6,"excerpt":7,"body":8,"cover_image":9,"video_url":10,"status":11,"published_at":12,"meta_title":13,"meta_description":14,"category":15,"author":19},26,"Gestire i permessi in Flutter con permission_handler: guida completa","gestire-i-permessi-in-flutter-con-permission-handler-guida-completa","Richiedere e gestire i permessi runtime (fotocamera, posizione, notifiche) in modo robusto su Android e iOS con il pacchetto permission_handler. Configurazione, flussi e best practice.","## Perché serve gestire i permessi\n\nLe app moderne accedono a risorse sensibili: fotocamera, microfono, posizione, contatti, archiviazione. Sia Android che iOS richiedono che l'utente conceda esplicitamente questi accessi a runtime. Gestire male questo flusso porta a crash, recensioni negative e funzionalità bloccate.\n\nIn Flutter lo standard di fatto è il pacchetto **permission_handler**, che astrae le differenze tra piattaforme con un'API uniforme.\n\n## Installazione\n\nAggiungi la dipendenza:\n\n```yaml\ndependencies:\n  permission_handler: ^11.3.1\n```\n\n## Configurazione Android\n\nDichiara i permessi nel file `android\u002Fapp\u002Fsrc\u002Fmain\u002FAndroidManifest.xml`:\n\n```xml\n\u003Cuses-permission android:name=\"android.permission.CAMERA\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.POST_NOTIFICATIONS\" \u002F>\n```\n\nDa Android 13 (API 33) le notifiche richiedono il permesso runtime `POST_NOTIFICATIONS`.\n\n## Configurazione iOS\n\nSu iOS devi aggiungere le stringhe di motivazione (purpose strings) in `ios\u002FRunner\u002FInfo.plist`. Senza queste l'app verrà rifiutata da App Store:\n\n```xml\n\u003Ckey>NSCameraUsageDescription\u003C\u002Fkey>\n\u003Cstring>L'app usa la fotocamera per scattare foto del profilo.\u003C\u002Fstring>\n\u003Ckey>NSLocationWhenInUseUsageDescription\u003C\u002Fkey>\n\u003Cstring>La posizione serve per mostrarti i contenuti vicini.\u003C\u002Fstring>\n```\n\nInoltre permission_handler su iOS richiede di abilitare i permessi tramite macro nel `Podfile`, decommentando le voci pertinenti nella sezione `post_install`:\n\n```ruby\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_ios_build_settings(target)\n    target.build_configurations.each do |config|\n      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [\n        '$(inherited)',\n        'PERMISSION_CAMERA=1',\n        'PERMISSION_LOCATION=1',\n      ]\n    end\n  end\nend\n```\n\n## Richiedere un permesso\n\nL'API base ruota attorno all'enum `Permission` e alla classe `PermissionStatus`:\n\n```dart\nimport 'package:permission_handler\u002Fpermission_handler.dart';\n\nFuture\u003Cbool> richiediFotocamera() async {\n  final status = await Permission.camera.request();\n  return status.isGranted;\n}\n```\n\nIl metodo `request()` mostra il dialog di sistema solo se necessario; se il permesso è già concesso ritorna immediatamente lo stato.\n\n## Gli stati possibili\n\n`PermissionStatus` può assumere diversi valori, e gestirli tutti è la chiave per un flusso robusto:\n\n- `granted`: permesso concesso.\n- `denied`: negato, ma è ancora possibile richiederlo di nuovo.\n- `permanentlyDenied`: negato in modo permanente (l'utente ha scelto \"Non chiedere più\"). Va gestito aprendo le impostazioni.\n- `restricted`: bloccato a livello di sistema (es. controllo parentale, solo iOS).\n- `limited`: accesso parziale (es. solo alcune foto, iOS 14+).\n\n```dart\nFuture\u003Cvoid> gestisciPosizione(BuildContext context) async {\n  final status = await Permission.locationWhenInUse.request();\n\n  switch (status) {\n    case PermissionStatus.granted:\n    case PermissionStatus.limited:\n      \u002F\u002F Procedi con la funzionalità\n      break;\n    case PermissionStatus.denied:\n      _mostraMessaggio(context, 'Permesso necessario per continuare.');\n      break;\n    case PermissionStatus.permanentlyDenied:\n      _mostraDialogImpostazioni(context);\n      break;\n    case PermissionStatus.restricted:\n      _mostraMessaggio(context, 'Accesso bloccato dal sistema.');\n      break;\n    default:\n      break;\n  }\n}\n```\n\n## Aprire le impostazioni dell'app\n\nQuando un permesso è `permanentlyDenied` l'unica via è invitare l'utente ad abilitarlo manualmente:\n\n```dart\nvoid _mostraDialogImpostazioni(BuildContext context) {\n  showDialog(\n    context: context,\n    builder: (_) => AlertDialog(\n      title: const Text('Permesso richiesto'),\n      content: const Text(\n        'Abilita il permesso dalle impostazioni per usare questa funzione.',\n      ),\n      actions: [\n        TextButton(\n          onPressed: () => Navigator.pop(context),\n          child: const Text('Annulla'),\n        ),\n        TextButton(\n          onPressed: () {\n            openAppSettings();\n            Navigator.pop(context);\n          },\n          child: const Text('Apri impostazioni'),\n        ),\n      ],\n    ),\n  );\n}\n```\n\nLa funzione globale `openAppSettings()` apre la schermata di sistema dell'app.\n\n## Controllare lo stato senza richiedere\n\nA volte vuoi solo sapere se un permesso è concesso, senza mostrare il dialog (per esempio all'avvio per decidere cosa visualizzare):\n\n```dart\nfinal status = await Permission.notification.status;\nif (status.isGranted) {\n  \u002F\u002F Mostra contenuti che richiedono il permesso\n}\n```\n\n## Richiedere più permessi insieme\n\nÈ possibile richiedere un gruppo di permessi in un'unica chiamata:\n\n```dart\nMap\u003CPermission, PermissionStatus> esiti = await [\n  Permission.camera,\n  Permission.microphone,\n].request();\n\nif (esiti[Permission.camera]!.isGranted &&\n    esiti[Permission.microphone]!.isGranted) {\n  \u002F\u002F Avvia registrazione video\n}\n```\n\n## Best practice\n\n- **Chiedi al momento giusto**: richiedi un permesso solo quando l'utente attiva la funzionalità che lo necessita, non all'avvio. Aumenta il tasso di concessione.\n- **Spiega il perché**: mostra una schermata o un dialog \"di pre-permesso\" che spiega il motivo prima di lanciare il dialog di sistema.\n- **Gestisci sempre il rifiuto permanente**: non lasciare l'utente in un vicolo cieco, offri il link alle impostazioni.\n- **Ricontrolla al ritorno in foreground**: l'utente può revocare i permessi dalle impostazioni mentre l'app è in background. Usa `WidgetsBindingObserver` per riverificare lo stato.\n- **Centralizza la logica**: incapsula la gestione dei permessi in un service dedicato, per evitare codice duplicato e facilitare i test.\n\n```dart\nclass PermessiService {\n  Future\u003Cbool> assicuraFotocamera() async {\n    final status = await Permission.camera.status;\n    if (status.isGranted) return true;\n    if (status.isPermanentlyDenied) return false;\n    return (await Permission.camera.request()).isGranted;\n  }\n}\n```\n\n## Conclusione\n\nUna gestione attenta dei permessi non è solo un requisito tecnico, ma un fattore di fiducia per l'utente. Con `permission_handler` hai un'API coerente tra Android e iOS: il resto dipende dal contesto e dalla chiarezza con cui comunichi le tue richieste. Centralizza la logica, gestisci tutti gli stati e chiedi sempre al momento opportuno.","https:\u002F\u002Fflutter.it\u002Fstorage\u002Farticles\u002F06709bbb-1894-4d4f-83e3-d68324a7ce7c.jpg",null,"published","2026-06-30T04:00:41+00:00","Permessi in Flutter con permission_handler: guida","Come richiedere e gestire i permessi runtime in Flutter con permission_handler: configurazione Android\u002FiOS, stati, impostazioni e best practice.",{"id":16,"name":17,"slug":18},1,"Guide","guide",{"id":16,"name":20},"Flutter Bot",[],1785219604009]