requestPermission method
Requests notification permission outside of the initial login flow.
Returns PermissionStatus from permission_handler so the UI has full
control over what to show the user:
- PermissionStatus.granted → switch stays on.
- PermissionStatus.limited → iOS 14+ partial grant, switch stays on.
- PermissionStatus.denied → switch goes back to off, can try again later.
- PermissionStatus.permanentlyDenied → show a dialog explaining the situation, then call openNotificationSettings if the user confirms.
- PermissionStatus.restricted → device policy (parental controls/MDM) blocks notifications, user cannot change this themselves — show an informational message.
Implementation
Future<PermissionStatus> requestPermission() async {
final PermissionStatus status = await Permission.notification.status;
_logger.info('[Notifications] requestPermission — current status: ${status.name}');
if (status.isGranted) {
if (!_initialized) await initNotifications();
return PermissionStatus.granted;
}
// iOS 14+: partial grant — notifications work with limitations, treat as granted.
if (status.isLimited) {
_logger.info('[Notifications] Permission limited (iOS 14+) — treating as granted.');
if (!_initialized) await initNotifications();
return PermissionStatus.limited;
}
// Device policy (parental controls/MDM) blocks notifications — user cannot change this.
// Opening settings will not help, so we return early without prompting.
if (status.isRestricted) {
_logger.info('[Notifications] Permission restricted by device policy.');
return PermissionStatus.restricted;
}
if (status.isPermanentlyDenied) {
_logger.info('[Notifications] Permission permanently denied.');
return PermissionStatus.permanentlyDenied;
}
// Status is denied — show the system prompt again.
final PermissionStatus result = await Permission.notification.request();
_logger.info('[Notifications] Re-request result: ${result.name}');
if (result.isGranted) {
await initNotifications();
return PermissionStatus.granted;
}
if (result.isLimited) {
_logger.info('[Notifications] Permission limited (iOS 14+) after request — treating as granted.');
await initNotifications();
return PermissionStatus.limited;
}
if (result.isRestricted) {
_logger.info('[Notifications] Permission restricted by device policy after request.');
return PermissionStatus.restricted;
}
if (result.isPermanentlyDenied) {
_logger.info('[Notifications] Permission permanently denied after re-request.');
return PermissionStatus.permanentlyDenied;
}
return PermissionStatus.denied;
}