Skip to content

Commit 6473567

Browse files
committed
New implementation FirebaseMessaging.getToken
* New getTokenWithClassFirebaseMessaging method that uses the newer FirebaseMessaging.getToken() API added in firebase-messaging:21.0.0. * Since all apps may not have updated to firebase-messaging:21.0.0 or newer we are catching NoClassDefFoundError & NoSuchMethodError and falling back to FirebaseInstanceId.getToken
1 parent 5c35bdd commit 6473567

File tree

1 file changed

+23
-0
lines changed

1 file changed

+23
-0
lines changed

OneSignalSDK/onesignal/src/main/java/com/onesignal/PushRegistratorFCM.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,18 @@ String getProviderName() {
9191
@Override
9292
String getToken(String senderId) throws Throwable {
9393
initFirebaseApp(senderId);
94+
95+
try {
96+
return getTokenWithClassFirebaseMessaging();
97+
} catch (NoClassDefFoundError | NoSuchMethodError e) {
98+
// Class or method wil be missing at runtime if firebase-message older than 21.0.0 is used.
99+
OneSignal.Log(
100+
OneSignal.LOG_LEVEL.INFO,
101+
"FirebaseMessaging.getToken not found, attempting to use FirebaseInstanceId.getToken"
102+
);
103+
}
104+
105+
// Fallback for firebase-message versions older than 21.0.0
94106
return getTokenWithClassFirebaseInstanceId(senderId);
95107
}
96108

@@ -99,6 +111,17 @@ private String getTokenWithClassFirebaseInstanceId(String senderId) throws IOExc
99111
return instanceId.getToken(senderId, FirebaseMessaging.INSTANCE_ID_SCOPE);
100112
}
101113

114+
@WorkerThread
115+
private String getTokenWithClassFirebaseMessaging() throws ExecutionException, InterruptedException {
116+
// We use firebaseApp.get(FirebaseMessaging.class) instead of FirebaseMessaging.getInstance()
117+
// as the latter uses the default Firebase app. We need to use a custom Firebase app as
118+
// the senderId is provided at runtime.
119+
FirebaseMessaging fcmInstance = firebaseApp.get(FirebaseMessaging.class);
120+
// FirebaseMessaging.getToken API was introduced in firebase-messaging:21.0.0
121+
Task<String> tokenTask = fcmInstance.getToken();
122+
return Tasks.await(tokenTask);
123+
}
124+
102125
private void initFirebaseApp(String senderId) {
103126
if (firebaseApp != null)
104127
return;

0 commit comments

Comments
 (0)