diff --git a/packages/firebase_messaging/firebase_messaging/lib/src/messaging.dart b/packages/firebase_messaging/firebase_messaging/lib/src/messaging.dart index d75ccaf2f1b8..98ba663fb40d 100644 --- a/packages/firebase_messaging/firebase_messaging/lib/src/messaging.dart +++ b/packages/firebase_messaging/firebase_messaging/lib/src/messaging.dart @@ -116,9 +116,11 @@ class FirebaseMessaging extends FirebasePluginPlatform { /// On web, a [vapidKey] is required. Future getToken({ String? vapidKey, + Object? serviceWorkerRegistration, }) { return _delegate.getToken( vapidKey: vapidKey, + serviceWorkerRegistration: serviceWorkerRegistration, ); } diff --git a/packages/firebase_messaging/firebase_messaging/test/mock.dart b/packages/firebase_messaging/firebase_messaging/test/mock.dart index 2493e87ee85b..1e4f9ce07481 100644 --- a/packages/firebase_messaging/firebase_messaging/test/mock.dart +++ b/packages/firebase_messaging/firebase_messaging/test/mock.dart @@ -96,9 +96,9 @@ class MockFirebaseMessaging extends Mock } @override - Future getToken({String? vapidKey}) { + Future getToken({String? vapidKey, Object? serviceWorkerRegistration}) { return super.noSuchMethod( - Invocation.method(#getToken, [], {#vapidKey: vapidKey}), + Invocation.method(#getToken, [], {#vapidKey: vapidKey, #serviceWorkerRegistration: serviceWorkerRegistration}), returnValue: Future.value(''), returnValueForMissingStub: Future.value('')); } diff --git a/packages/firebase_messaging/firebase_messaging_platform_interface/lib/src/method_channel/method_channel_messaging.dart b/packages/firebase_messaging/firebase_messaging_platform_interface/lib/src/method_channel/method_channel_messaging.dart index 498158f4ee36..e96339a7d2ac 100644 --- a/packages/firebase_messaging/firebase_messaging_platform_interface/lib/src/method_channel/method_channel_messaging.dart +++ b/packages/firebase_messaging/firebase_messaging_platform_interface/lib/src/method_channel/method_channel_messaging.dart @@ -240,6 +240,7 @@ class MethodChannelFirebaseMessaging extends FirebaseMessagingPlatform { @override Future getToken({ String? vapidKey, // not used yet; web only property + Object? serviceWorkerRegistration, // not used yet; web only property }) async { await _APNSTokenCheck(); diff --git a/packages/firebase_messaging/firebase_messaging_platform_interface/lib/src/platform_interface/platform_interface_messaging.dart b/packages/firebase_messaging/firebase_messaging_platform_interface/lib/src/platform_interface/platform_interface_messaging.dart index 727c4df4b608..6f14213a86c2 100644 --- a/packages/firebase_messaging/firebase_messaging_platform_interface/lib/src/platform_interface/platform_interface_messaging.dart +++ b/packages/firebase_messaging/firebase_messaging_platform_interface/lib/src/platform_interface/platform_interface_messaging.dart @@ -173,6 +173,8 @@ abstract class FirebaseMessagingPlatform extends PlatformInterface { /// Returns the default FCM token for this device and optionally [senderId]. Future getToken({ String? vapidKey, + // Should always be a ServiceWorkerRegistration + Object? serviceWorkerRegistration, }) { throw UnimplementedError('getToken() is not implemented'); } diff --git a/packages/firebase_messaging/firebase_messaging_web/lib/firebase_messaging_web.dart b/packages/firebase_messaging/firebase_messaging_web/lib/firebase_messaging_web.dart index 84298cd3593a..ab3d16d159f8 100644 --- a/packages/firebase_messaging/firebase_messaging_web/lib/firebase_messaging_web.dart +++ b/packages/firebase_messaging/firebase_messaging_web/lib/firebase_messaging_web.dart @@ -106,7 +106,8 @@ class FirebaseMessagingWeb extends FirebaseMessagingPlatform { } @override - Future getToken({String? vapidKey}) async { + Future getToken({String? vapidKey, Object? serviceWorkerRegistration}) async { + assert(serviceWorkerRegistration is web.ServiceWorkerRegistration); _delegate; if (!_initialized) { @@ -115,7 +116,7 @@ class FirebaseMessagingWeb extends FirebaseMessagingPlatform { } return convertWebExceptions( - () => _delegate.getToken(vapidKey: vapidKey), + () => _delegate.getToken(vapidKey: vapidKey, serviceWorkerRegistration: serviceWorkerRegistration as web.ServiceWorkerRegistration?), ); } diff --git a/packages/firebase_messaging/firebase_messaging_web/lib/src/interop/messaging.dart b/packages/firebase_messaging/firebase_messaging_web/lib/src/interop/messaging.dart index d3a0e2673b4a..14124a44185e 100644 --- a/packages/firebase_messaging/firebase_messaging_web/lib/src/interop/messaging.dart +++ b/packages/firebase_messaging/firebase_messaging_web/lib/src/interop/messaging.dart @@ -9,6 +9,7 @@ import 'dart:async'; import 'dart:js_interop'; import 'package:firebase_core_web/firebase_core_web_interop.dart'; +import 'package:web/web.dart' as web; import 'messaging_interop.dart' as messaging_interop; @@ -43,7 +44,7 @@ class Messaging extends JsObjectWrapper { /// After calling [requestPermission] you can call this method to get an FCM registration token /// that can be used to send push messages to this user. - Future getToken({String? vapidKey}) async { + Future getToken({String? vapidKey, web.ServiceWorkerRegistration? serviceWorkerRegistration}) async { try { final token = (await messaging_interop .getToken( @@ -51,7 +52,8 @@ class Messaging extends JsObjectWrapper { vapidKey == null ? null : messaging_interop.GetTokenOptions( - vapidKey: vapidKey.toJS)) + vapidKey: vapidKey.toJS, + serviceWorkerRegistration: serviceWorkerRegistration)) .toDart) .toDart; return token; diff --git a/packages/firebase_messaging/firebase_messaging_web/lib/src/interop/messaging_interop.dart b/packages/firebase_messaging/firebase_messaging_web/lib/src/interop/messaging_interop.dart index 99dfc1103834..c51a53522403 100644 --- a/packages/firebase_messaging/firebase_messaging_web/lib/src/interop/messaging_interop.dart +++ b/packages/firebase_messaging/firebase_messaging_web/lib/src/interop/messaging_interop.dart @@ -11,6 +11,7 @@ library; import 'dart:js_interop'; import 'package:firebase_core_web/firebase_core_web_interop.dart'; +import 'package:web/web.dart' as web; @JS() @staticInterop @@ -56,11 +57,9 @@ extension ObserverJsImplX on Observer { @staticInterop @anonymous class GetTokenOptions { - // TODO - I imagine we won't be implementing serviceWorkerRegistration type as it extends EventTarget class - // external String get serviceWorkerRegistration external factory GetTokenOptions({ JSString? vapidKey, - /*dynamic serviceWorkerRegistration */ + web.ServiceWorkerRegistration? serviceWorkerRegistration }); }