requestPermissions method

Future<NotificationPermissionStatus> requestPermissions({
  1. bool provisional = false,
})

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;
  }
}