Подтвердить что ты не робот

Firebase (FCM), как получить токен

Я первый использую FCM.

Я загружаю образец из firebase/quickstart-android, и я устанавливаю QuickMart FCM. Но я не могу получить какой-либо токен из журнала, даже попав в LOG Кнопка TOKEN в приложении.

Затем я пытаюсь отправить сообщение с консолью Firebase и установить для целевого объекта имя моего приложения. Я получил любое входящее сообщение.

Я хочу знать, можно ли использовать FCM? GCM все в порядке.

Решение:

Потому что я не разработчик Android, просто разработчик backend. Так что мне нужно некоторое время, чтобы его решить. По-моему, в примере есть некоторая ошибка.

введите описание изображения здесь

код:

RegistrationIntentService.java

public class RegistrationIntentService extends IntentService {

    private static final String TAG = "RegIntentService";


    public RegistrationIntentService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        String token = FirebaseInstanceId.getInstance().getToken();
        Log.i(TAG, "FCM Registration Token: " + token);
    }
}

MyFirebaseInstanceIDService.java

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseIIDService";

    /**
     * Called if InstanceID token is updated. This may occur if the security of
     * the previous token had been compromised. Note that this is called when the InstanceID token
     * is initially generated so this is where you would retrieve the token.
     */
    // [START refresh_token]
    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
//        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
//        Log.d(TAG, "Refreshed token: " + refreshedToken);
//
//        // TODO: Implement this method to send any registration to your app servers.
//        sendRegistrationToServer(refreshedToken);
//
        Intent intent = new Intent(this, RegistrationIntentService.class);
        startService(intent);
    }
    // [END refresh_token]

    /**
     * Persist token to third-party servers.
     * <p>
     * Modify this method to associate the user FCM InstanceID token with any server-side account
     * maintained by your application.
     *
     * @param token The new token.
     */
    private void sendRegistrationToServer(String token) {
        // Add custom implementation, as needed.
    }
}

Добавьте это в MainActivity.java.

 Intent intent = new Intent(this, RegistrationIntentService.class);
        startService(intent);

После выполнения выше вы можете получить токен в logcat. Но, наконец, я нахожу удобный способ, чтобы его получить. Просто используйте режим отладки, чтобы установить пример приложения и вы можете получить токен, когда вы впервые установите его.

Но я не t why it can t печатаю журнал, когда я его устанавливаю. Возможно, это связано с мобильной системой.

А потом почему я не могу получить уведомление. FirebaseMessagingService.onMessageReceived не вызывал sendNotification

4b9b3361

Ответ 1

Самый быстрый и хороший для прототипа

Быстрое решение состоит в том, чтобы сохранить его в sharedPrefs и добавить эту логику в метод onCreate в вашей MainActivity или классе, который расширяет Application.

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(this, instanceIdResult -> {
    String newToken = instanceIdResult.getToken();
    Log.e("newToken", newToken);
    getActivity().getPreferences(Context.MODE_PRIVATE).edit().putString("fb", newToken).apply();
});

Log.d("newToken", getActivity().getPreferences(Context.MODE_PRIVATE).getString("fb", "empty :("));

ЧИСТЫЙ ПУТЬ

Лучший вариант - создать сервис и придерживаться аналогичной логики. Сначала создайте новый Сервис

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
        Log.e("newToken", s);
        getSharedPreferences("_", MODE_PRIVATE).edit().putString("fb", s).apply();
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
    }

    public static String getToken(Context context) {
        return context.getSharedPreferences("_", MODE_PRIVATE).getString("fb", "empty");
    }
}

А затем добавить его в файл AndroidManifest

<service
        android:name=".MyFirebaseMessagingService"
        android:stopWithTask="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
</service>

Наконец, вы можете использовать статический метод из вашей службы MyFirebaseMessagingService.getToken(Context);

Самый быстрый, но устарел

Log.d("Firebase", "token "+ FirebaseInstanceId.getInstance().getToken());

Он все еще работает, когда вы используете более старую библиотеку Firebase, чем версия 17.xx

Ответ 2

Важная информация.

если служба Google Play зависла или не работает, то fcm return token = null

Если сервис play работает нормально, метод FirebaseInstanceId.getInstance().getToken() возвращает token

Log.d("FCMToken", "token "+ FirebaseInstanceId.getInstance().getToken());

Ответ 3

Согласно документу

Перенос клиентского приложения GCM в FCM

onTokenRefresh()

Вызывается только, если токен идентификатора экземпляра обновлен

Таким образом, он будет вызываться только в первый раз, когда вы устанавливаете приложение на свое устройство.

Поэтому я предлагаю удалить свое приложение вручную и попробовать снова запустить

определенно вы получите TOKEN

Ответ 4

Команда Firebase Android SDK немного изменила API. Я реализовал логику "Token to Server" следующим образом:

В моем случае FirebaseMessagingService:

public class FirebaseCloudMessagingService extends FirebaseMessagingService {

    ...

    @Override
    public void onNewToken(String token) {
        // sending token to server here
    }

    ...

}

Имейте в виду, что токен для каждого устройства, и он может обновляться Firebase независимо от вашей логики входа в систему. Итак, если у вас есть функциональные возможности входа и выхода, вам нужно рассмотреть дополнительные случаи:

  1. Когда новый пользователь входит в систему, вам необходимо привязать токен к новому пользователю (отправить его на сервер). Потому что токен может быть обновлен во время сеанса старого пользователя, а сервер не знает токен нового пользователя.
  2. Когда пользователь выходит из системы, вам необходимо отсоединить токен. Потому что пользователь больше не должен получать уведомления/сообщения.

Используя новый API, вы можете получить токен следующим образом:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
        @Override
        public void onSuccess(InstanceIdResult instanceIdResult) {
            String token = instanceIdResult.getToken();
            // send it to server
        }
    });

Удачи!

Ответ 5

Попробуйте это. Почему вы используете RegistrationIntentService?

public class FirebaseInstanceIDService extends FirebaseInstanceIdService {    
    @Override
    public void onTokenRefresh() {    
        String token = FirebaseInstanceId.getInstance().getToken();    
        registerToken(token);
    }

    private void registerToken(String token) {

    }
}

Ответ 6

Эта строка должна получить токен FCM для Firebase.

String token = FirebaseInstanceId.getInstance().getToken();
Log.d("MYTAG", "This is your Firebase token" + token);

Сделайте Log.d, чтобы распечатать его на монитор Android.

Ответ 7

Вместо этого:

    // [START refresh_token]
    @Override
    public void onTokenRefresh() {
//        Get updated InstanceID token.
//        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
//        Log.d(TAG, "Refreshed token: " + refreshedToken);
//
//        TODO: Implement this method to send any registration to your app servers.
//        sendRegistrationToServer(refreshedToken);
//
        Intent intent = new Intent(this, RegistrationIntentService.class);
        startService(intent);
    }
    // [END refresh_token]

Сделайте это:

    // [START refresh_token]
    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
//        Log.d(TAG, "Refreshed token: " + refreshedToken);

        // Implement this method to send token to your app server
       sendRegistrationToServer(refreshedToken);

    }
    // [END refresh_token]

И еще одно:

Вам нужно вызвать метод sendRegistrationToServer()который будет обновлять токен на сервере, если вы отправляете push уведомления с сервера.

UPDATE:

Создается новый токен Firebase (вызывается onTokenRefresh()), когда:

  • Приложение удаляет идентификатор экземпляра
  • Приложение восстанавливается на новом устройстве
  • Пользователь удаляет/переустанавливает приложение
  • Пользователь удаляет данные приложения.

Ответ 8

В то же время не забудьте включить это в файл манифеста, чтобы получить идентификатор токена

<service
    android:name=".MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>

Ответ 9

В Firebase firebase-messaging:17.1.0 и новее FirebaseInstanceIdService устарела, вы можете получить onNewToken для класса FirebaseMessagingService как описано на fooobar.com/questions/189238/...

Но если вы хотите просто получить токен в любое время, то теперь вы можете сделать это так:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( this.getActivity(),  new OnSuccessListener<InstanceIdResult>() {
  @Override
  public void onSuccess(InstanceIdResult instanceIdResult) {
    String newToken = instanceIdResult.getToken();
    Log.e("newToken",newToken);
  }
});

Ответ 10

Если вы используете некоторую функцию аутентификации firebase, вы можете взять токен, используя это:

//------GET USER TOKEN-------
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getToken(true)
        .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
            public void onComplete(@NonNull Task<GetTokenResult> task) {
                if (task.isSuccessful()) {
                    String idToken = task.getResult().getToken();
                      // ...
                }
            }
        });

Работать хорошо, если пользователь вошел в систему. getCurrentUser()

Ответ 11

для тех, кто приземляется здесь, до сих пор FirebaseInstanceIdService устарел, используйте вместо этого:

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    @Override
    public void onNewToken(String token) {
        Log.d("MY_TOKEN", "Refreshed token: " + token);

        // If you want to send messages to this application instance or
        // manage this apps subscriptions on the server side, send the
        // Instance ID token to your app server.
        // sendRegistrationToServer(token);
    }
}

и объявить в AndroidManifest

<application... >

<service android:name=".fcm.MyFirebaseMessagingService">
    <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>
</application>

Ответ 12

попробуй это

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(OnSuccessListener<InstanceIdResult> { instanceIdResult ->
             fcm_token = instanceIdResult.token}

Ответ 13

Вы можете использовать следующее в Firebase (FCM) для получения токена:

FirebaseInstanceId.getInstance().getToken();

Ответ 14

Метод getToken() устарел. Вместо этого вы можете использовать getInstanceId().

Если вы хотите обрабатывать результаты при запросе instanceId(token), проверьте этот код.

    FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(instanceIdResult -> {
    if (instanceIdResult != null) {
        String token = instanceIdResult.getToken();
        if (!TextUtils.isEmpty(token)) {
            Log.d(TAG, "retrieve token successful : " + token);
        }
    } else{
        Log.w(TAG, "instanceIdResult should not be null..");
    }
}).addOnFailureListener(e -> {
    //do something with e
}).addOnCanceledListener(() -> {
    //request has canceled
}).addOnCompleteListener(task -> Log.v(TAG, "task result : " + task.getResult().getToken()));

Ответ 15

FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                if (!task.isSuccessful()) {
                    Log.w(TAG, "getInstanceId failed", task.getException());
                    return;
                }

                // Get new Instance ID token
                String **token** = task.getResult().getToken();

            }
        });

Ответ 16

Settings.Secure.getString(getContentResolver(),
                     Settings.Secure.ANDROID_ID);