requestPermissions method
Requests notification permissions from the user.
On iOS, this shows the system permission prompt if permissions haven't been determined yet. Once denied, users must enable permissions in Settings.
On Android 13+, this shows the runtime permission prompt.
Returns the resulting permission status.
Implementation
Future<NotificationPermissionStatus> requestPermissions({
bool provisional = false,
}) async {
try {
// Get status before request to detect blocked requests
final statusBefore = await getPermissionStatus();
final settings = await FirebaseMessaging.instance.requestPermission(
alert: true,
badge: true,
sound: true,
provisional: provisional,
criticalAlert: false,
announcement: false,
carPlay: false,
);
final status = _convertAuthorizationStatus(settings.authorizationStatus);
// Track the result using the permission helper
if (status == NotificationPermissionStatus.denied) {
// Check if this is a permanent denial
// iOS: Always permanent after first denial
// Android: Permanent after second denial
final isPermanent = !kIsWeb &&
((Platform.isIOS || Platform.isMacOS) ||
(await _permissionHelper.getPermissionDenialCount()) >= 1);
await _permissionHelper.recordDenial(isPermanent: isPermanent);
} else if (status == NotificationPermissionStatus.authorized ||
status == NotificationPermissionStatus.provisional) {
// Permission granted - clear any stored denial info
await _permissionHelper.autoClearIfGranted();
} else if (statusBefore == NotificationPermissionStatus.notDetermined &&
status == NotificationPermissionStatus.notDetermined) {
// Status didn't change - request may have been blocked
await _permissionHelper.recordBlockedRequest();
}
logi('Permission request result: $status');
return status;
} catch (e, stackTrace) {
loge(e, 'Error requesting permissions', stackTrace);
_onError?.call('Error requesting permissions: $e', stackTrace);
return NotificationPermissionStatus.denied;
}
}