No notification permission enforcement on web
This commit is contained in:
+65
-32
@@ -1,5 +1,6 @@
|
||||
import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/foundation.dart' show kIsWeb;
|
||||
import 'package:audioplayers/audioplayers.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:supabase_flutter/supabase_flutter.dart';
|
||||
@@ -56,17 +57,37 @@ Future<void> main() async {
|
||||
|
||||
// ensure token saved right away if already signed in
|
||||
final supaClient = Supabase.instance.client;
|
||||
final initialToken = await FirebaseMessaging.instance.getToken();
|
||||
if (initialToken != null && supaClient.auth.currentUser != null) {
|
||||
debugPrint('initial FCM token for signed-in user: $initialToken');
|
||||
final ctrl = NotificationsController(supaClient);
|
||||
await ctrl.registerFcmToken(initialToken);
|
||||
String? initialToken;
|
||||
if (!kIsWeb) {
|
||||
try {
|
||||
initialToken = await FirebaseMessaging.instance.getToken();
|
||||
} catch (e) {
|
||||
debugPrint('FCM getToken failed: $e');
|
||||
initialToken = null;
|
||||
}
|
||||
if (initialToken != null && supaClient.auth.currentUser != null) {
|
||||
debugPrint('initial FCM token for signed-in user: $initialToken');
|
||||
final ctrl = NotificationsController(supaClient);
|
||||
await ctrl.registerFcmToken(initialToken);
|
||||
}
|
||||
}
|
||||
|
||||
// listen for auth changes to register/unregister token accordingly
|
||||
supaClient.auth.onAuthStateChange.listen((data) async {
|
||||
final event = data.event;
|
||||
final token = await FirebaseMessaging.instance.getToken();
|
||||
if (kIsWeb) {
|
||||
debugPrint(
|
||||
'auth state change $event on web: skipping FCM token handling',
|
||||
);
|
||||
return;
|
||||
}
|
||||
String? token;
|
||||
try {
|
||||
token = await FirebaseMessaging.instance.getToken();
|
||||
} catch (e) {
|
||||
debugPrint('FCM getToken failed during auth change: $e');
|
||||
token = null;
|
||||
}
|
||||
debugPrint('auth state change $event, token=$token');
|
||||
if (token == null) return;
|
||||
final ctrl = NotificationsController(supaClient);
|
||||
@@ -77,18 +98,20 @@ Future<void> main() async {
|
||||
}
|
||||
});
|
||||
|
||||
// on Android 13+ we must request POST_NOTIFICATIONS at runtime; without it
|
||||
// notifications are automatically denied and cannot be re‑enabled from the
|
||||
// system settings. The helper uses `permission_handler`.
|
||||
final granted = await ensureNotificationPermission();
|
||||
if (!granted) {
|
||||
// we don’t block startup, but it’s worth logging so developers notice. A
|
||||
// real app might show a dialog pointing the user to settings.
|
||||
// debugPrint('notification permission not granted');
|
||||
}
|
||||
if (!kIsWeb) {
|
||||
// on Android 13+ we must request POST_NOTIFICATIONS at runtime; without it
|
||||
// notifications are automatically denied and cannot be re‑enabled from the
|
||||
// system settings. The helper uses `permission_handler`.
|
||||
final granted = await ensureNotificationPermission();
|
||||
if (!granted) {
|
||||
// we don’t block startup, but it’s worth logging so developers notice.
|
||||
// A real app might show a dialog pointing the user to settings.
|
||||
// debugPrint('notification permission not granted');
|
||||
}
|
||||
|
||||
// request FCM permission (iOS/Android13+) and handle foreground messages
|
||||
await FirebaseMessaging.instance.requestPermission();
|
||||
// request FCM permission (iOS/Android13+) and handle foreground messages
|
||||
await FirebaseMessaging.instance.requestPermission();
|
||||
}
|
||||
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
|
||||
final notification = message.notification;
|
||||
if (notification != null) {
|
||||
@@ -160,25 +183,35 @@ class NotificationSoundObserver extends ProviderObserver {
|
||||
|
||||
if (profile != null) {
|
||||
// signed in: save current token and keep listening for refreshes
|
||||
FirebaseMessaging.instance.getToken().then((token) {
|
||||
if (token != null) {
|
||||
debugPrint('profile observer registering token: $token');
|
||||
if (!kIsWeb) {
|
||||
FirebaseMessaging.instance
|
||||
.getToken()
|
||||
.then((token) {
|
||||
if (token != null) {
|
||||
debugPrint('profile observer registering token: $token');
|
||||
controller.registerFcmToken(token);
|
||||
}
|
||||
})
|
||||
.catchError((e) => debugPrint('getToken error: $e'));
|
||||
_tokenSub = FirebaseMessaging.instance.onTokenRefresh.listen((token) {
|
||||
debugPrint('token refreshed: $token');
|
||||
controller.registerFcmToken(token);
|
||||
}
|
||||
});
|
||||
_tokenSub = FirebaseMessaging.instance.onTokenRefresh.listen((token) {
|
||||
debugPrint('token refreshed: $token');
|
||||
controller.registerFcmToken(token);
|
||||
});
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// signed out: unregister whatever token we currently have
|
||||
_tokenSub?.cancel();
|
||||
FirebaseMessaging.instance.getToken().then((token) {
|
||||
if (token != null) {
|
||||
debugPrint('profile observer unregistering token: $token');
|
||||
controller.unregisterFcmToken(token);
|
||||
}
|
||||
});
|
||||
if (!kIsWeb) {
|
||||
FirebaseMessaging.instance
|
||||
.getToken()
|
||||
.then((token) {
|
||||
if (token != null) {
|
||||
debugPrint('profile observer unregistering token: $token');
|
||||
controller.unregisterFcmToken(token);
|
||||
}
|
||||
})
|
||||
.catchError((e) => debugPrint('getToken error: $e'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user