davips
davips

Reputation: 45

FirebaseInstanceId.getInstance().getToken() without using Default FirebaseApp

I´m trying to use FCM to send Firebase Notifications, but I have a Application using one Firebase Project and a library using another Firebase Project. I want to receive the token from library Firebase Project to receive Firebase Notifications.

When I try directly receive the token using:

FirebaseInstanceId.getInstance().getToken();

I received a valid token, but from Application Firebase Project. If i try to force in getInstance() the library Firebase Project, using:

FirebaseInstanceId.getInstance(FirebaseApp.getInstance("ABC")).getToken();

I receive null. If I try to use Application or Library Firebase Project passing parameters in getToken() as:

FirebaseInstanceId.getInstance().getToken(getApplication().getResources().getString(R.string.gcm_defaultSenderId), FirebaseMessaging.INSTANCE_ID_SCOPE);

or

FirebaseInstanceId.getInstance(FirebaseApp.getInstance("ABC")).getToken(getApplication().getResources().getString(R.string.gcm_defaultSenderId), FirebaseMessaging.INSTANCE_ID_SCOPE);

I received the same valid token from Application Firebase Project.

the R.string.gcm_defaultSenderId is from library project resources

There is another way to receive Library Firebase Project token or I'm doing something wrong?

Upvotes: 1

Views: 7333

Answers (2)

davips
davips

Reputation: 45

I made a mistake in FirebaseApp.initializeApp(), because I forgot to set:

.setGcmSenderId(getApplication().getResources().getString(R.string.gcm_defaultSenderId))

in FirebaseOptions.Builder(). After that change, I receive a valid Library Firebase Token in getToken() and in onTokenRefresh()

Upvotes: 0

Bob Snyder
Bob Snyder

Reputation: 38289

This is my understanding of what you are observing based on my experiments and the documentation.

When you first call getToken() using a FirebaseApp other then the default, there is no token and communication with the server is required to produce one. A null value is returned and the process to fetch a token is initiated. The documentation for getToken() says it returns "the master token or null if the token is not yet available". After a few seconds the token is received. You can detect that event using the onTokenRefresh() method of FirebaseInstanceIdService, if you have implemented that. On subsequent calls to getToken() for the non-default app, the token will be present and returned immediately by getToken().

I think the calls to get a scoped token always return a token because they are blocking (see docs), and wait for the interaction with the server to complete before returning a result.

Upvotes: 2

Related Questions