diff --git a/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java b/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java index 3d0048d4e8ea..c122be556339 100644 --- a/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java +++ b/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java @@ -248,6 +248,22 @@ public void onComplete(@NonNull Task task) { result.success(task.getResult().getToken()); } }); + } else if ("getInstanceID".equals(call.method)) { + FirebaseInstanceId.getInstance() + .getInstanceId() + .addOnCompleteListener( + new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (!task.isSuccessful()) { + Log.w(TAG, "getInstanceID, error fetching instanceID: ", task.getException()); + result.success(null); + return; + } + + result.success(task.getResult().getId()); + } + }); } else if ("deleteInstanceID".equals(call.method)) { new Thread( new Runnable() { diff --git a/packages/firebase_messaging/example/lib/main.dart b/packages/firebase_messaging/example/lib/main.dart index d248b9c5cbc6..093fc4fbd210 100644 --- a/packages/firebase_messaging/example/lib/main.dart +++ b/packages/firebase_messaging/example/lib/main.dart @@ -88,7 +88,8 @@ class PushMessagingExample extends StatefulWidget { } class _PushMessagingExampleState extends State { - String _homeScreenText = "Waiting for token..."; + String _idStatusText = "Waiting for ID..."; + String _tokenStatusText = "Waiting for token..."; bool _topicButtonsDisabled = false; final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); @@ -159,12 +160,19 @@ class _PushMessagingExampleState extends State { .listen((IosNotificationSettings settings) { print("Settings registered: $settings"); }); + _firebaseMessaging.getId().then((id) { + assert(id != null); + setState(() { + _idStatusText = "Instance ID: $id"; + }); + print(_idStatusText); + }); _firebaseMessaging.getToken().then((String token) { assert(token != null); setState(() { - _homeScreenText = "Push Messaging token: $token"; + _tokenStatusText = "Push Messaging token: $token"; }); - print(_homeScreenText); + print(_tokenStatusText); }); } @@ -189,7 +197,10 @@ class _PushMessagingExampleState extends State { child: Column( children: [ Center( - child: Text(_homeScreenText), + child: Text(_idStatusText), + ), + Center( + child: Text(_tokenStatusText), ), Row(children: [ Expanded( diff --git a/packages/firebase_messaging/ios/Classes/FLTFirebaseMessagingPlugin.m b/packages/firebase_messaging/ios/Classes/FLTFirebaseMessagingPlugin.m index b6a33a73d9dd..a2bd45c4140c 100644 --- a/packages/firebase_messaging/ios/Classes/FLTFirebaseMessagingPlugin.m +++ b/packages/firebase_messaging/ios/Classes/FLTFirebaseMessagingPlugin.m @@ -167,6 +167,17 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result result(instanceIDResult.token); } }]; + } else if ([@"getInstanceID" isEqualToString:method]) { + [[FIRInstanceID instanceID] + instanceIDWithHandler:^(FIRInstanceIDResult *_Nullable instanceIDResult, + NSError *_Nullable error) { + if (error != nil) { + NSLog(@"getInstanceID, error fetching instanceID: %@", error); + result(nil); + } else { + result(instanceIDResult.instanceID); + } + }]; } else if ([@"deleteInstanceID" isEqualToString:method]) { [[FIRInstanceID instanceID] deleteIDWithHandler:^void(NSError *_Nullable error) { if (error.code != 0) { diff --git a/packages/firebase_messaging/lib/firebase_messaging.dart b/packages/firebase_messaging/lib/firebase_messaging.dart index e17206f18c52..d3cd471dfa33 100644 --- a/packages/firebase_messaging/lib/firebase_messaging.dart +++ b/packages/firebase_messaging/lib/firebase_messaging.dart @@ -150,6 +150,11 @@ class FirebaseMessaging { return await _channel.invokeMethod('getToken'); } + /// Returns the FCM stable ID. + Future getId() async { + return await _channel.invokeMethod('getInstanceID'); + } + /// Subscribe to topic in background. /// /// [topic] must match the following regular expression: diff --git a/packages/firebase_messaging/test/firebase_messaging_test.dart b/packages/firebase_messaging/test/firebase_messaging_test.dart index ef7d489cfb06..97c8abf18807 100644 --- a/packages/firebase_messaging/test/firebase_messaging_test.dart +++ b/packages/firebase_messaging/test/firebase_messaging_test.dart @@ -151,6 +151,11 @@ void main() { verify(mockChannel.invokeMethod('unsubscribeFromTopic', myTopic)); }); + test('getId', () { + firebaseMessaging.getId(); + verify(mockChannel.invokeMethod('getInstanceID')); + }); + test('getToken', () { firebaseMessaging.getToken(); verify(mockChannel.invokeMethod('getToken'));