programing

Firebase(FCM) 토큰을 가져오는 방법

batch 2023. 6. 20. 21:27
반응형

Firebase(FCM) 토큰을 가져오는 방법

FCM은 처음 사용해 봅니다.

저는 파이어베이스/퀵스타트-안드로이드에서 샘플을 다운로드하고 FCM 퀵스타트를 설치합니다.하지만 앱의 LOG TOKEN 버튼을 눌러도 로그에서 토큰을 얻을 수 없습니다.

그런 다음 Firebase 콘솔로 메시지를 보내고 앱 패키지 이름을 대상으로 설정합니다.메시지를 받았습니다.

FCM을 사용할 수 있는지 알고 싶습니다.GCM 모든 것이 정상입니다.

솔루션:

왜냐하면 저는 안드로이드 개발자가 아니라 백엔드 개발자이기 때문입니다.그래서 그것을 해결하는 데 시간이 좀 걸립니다.제 생각에는 샘플 앱에 버그가 좀 있는 것 같습니다.

enter image description here

코드:

등록.인텐트 서비스.자바

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);
    }
}

내 파이어베이스사례ID 서비스.자바

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's 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's 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에서 토큰을 얻습니다.하지만 마지막으로, 저는 그것을 얻는 편리한 방법을 찾습니다.디버깅 모드를 사용하여 샘플 앱을 설치하면 처음 설치할 때 토큰을 받을 수 있습니다.

그런데 설치할 때 왜 로그가 출력되지 않는지 모르겠습니다.아마도 모바일 시스템과 관련이 있을 것입니다.

알림을 받을 수 없는 이유입니다.FirebaseMessagingService onMessageReceivedsendNotification을 호출하지 않았습니다.

프로토타입에 가장 빠르고 적합

하고 이 를 른빠해결책이하에고다저장이논리것다입니에 입니다.onCreate응용프로그램을 확장하는 기본 활동 또는 클래스의 메서드입니다.

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");
    }
}

Android Manifest 파일에 추가합니다.

<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());

버전 17.x.x보다 이전 Firebase 라이브러리를 사용하는 경우에도 계속 작동합니다.

FirebaseInstanceId it method 수과은방니다입.getInstanceId또한 더 이상 사용되지 않습니다.그래서 당신은 사용해야 합니다.FirebaseMessaging수업과 그것은getToken대신 방법.

FirebaseMessaging.getInstance().getToken().addOnSuccessListener(token -> {
        if (!TextUtils.isEmpty(token)) {
            Log.d(TAG, "retrieve token successful : " + token);
        } else{
            Log.w(TAG, "token should not be null...");
        }
    }).addOnFailureListener(e -> {
        //handle e
    }).addOnCanceledListener(() -> {
        //handle cancel
    }).addOnCompleteListener(task -> Log.v(TAG, "This is the token : " + task.getResult()));

»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()));

전체 솔루션:

Firebase Android SDK를 지원하는 팀이 API를 조금 변경합니다.저는 다음과 같은 "서버로의 토큰" 논리를 구현했습니다.

Firebase Messaging Service의 경우:

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
        }
    });

행운을 빕니다.

중요한 정보입니다.

구글 플레이 서비스가 중단되거나 실행되지 않으면 fcm 리턴 토큰 =null

재생 서비스가 제대로 작동하면 다음과 같습니다.FirebaseInstanceId.getInstance().getToken()메서드 반환token

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

문서에 따르면

GCM 클라이언트 앱을 FCM으로 마이그레이션

onTokenRefresh()

인스턴스인 경우에만 호출됨ID 토큰이 업데이트되었습니다.

따라서 단말기에 앱을 설치할 때 처음에만 호출됩니다.

따라서 수동으로 앱을 제거하고 다시 실행해 보는 것이 좋습니다.

당신은 반드시 토큰을 받을 것입니다.

이거 먹어봐요.사용하는 이유RegistrationIntentService?

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

    private void registerToken(String token) {

    }
}

위의 'com.google'을 사용하는 경우.파이어베이스:파이어베이스-디젤:22.0.0'

Kotlin 방식으로 FCM 토큰(Force) 가져오기:

FirebaseMessaging.getInstance().token.addOnCompleteListener { task: Task<String> ->
   if (!task.isSuccessful) {
     return@addOnCompleteListener
   }

   pushToken = task.result
   Log.i("PUSH_TOKEN", "pushToken: $pushToken")
}

그리고 당신은 onNewToken 메소드를 통해 토큰을 받을 수 있습니다.(이 클래스는 구현해야 함)

class PushNotificationService: FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        Log.e("PUSH_TOKEN", "Refreshed firebase token: $token")
    }
}

AndroidManifest.xmlPushNotificationService를 추가해야 합니다.

<service
  android:name=".PushNotificationService"
  android:exported="false"
  tools:ignore="Instantiatable">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter>
</service>

이 줄은 소방 기지 FCM 토큰을 가져다 줄 것입니다.

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

Log.d를 실행하여 Android 모니터에 출력합니다.

동시에 토큰 ID를 받기 위해 매니페스트 파일에 이를 포함하는 것을 잊지 마십시오.

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

이 대신:

    // [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's 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's server
       sendRegistrationToServer(refreshedToken);

    }
    // [END refresh_token]

그리고 하나 더:

전화해야 합니다.sendRegistrationToServer()서버에서 푸시 알림을 보내는 경우 서버에서 토큰을 업데이트하는 메서드입니다.

업데이트:

새 Firebase 토큰이 생성됩니다(onTokenRefresh()호출됨) 다음과 같은 경우

  • 앱이 인스턴스 ID를 삭제합니다.
  • 앱이 새 장치에 복원됩니다.
  • 사용자가 앱을 제거/재설치합니다.
  • 사용자가 앱 데이터를 지웁니다.

FirebaseInstanceId.getInstance().getInstanceId()사용되지 않습니다.Firebase 문서에 따라 다음 코드를 사용하여 현재 등록 토큰을 검색할 수 있습니다.

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

코틀린과 코루틴을 사용하는 경우 코틀린 코루틴 플레이 라이브러리를 추가합니다.

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:x.x.x'

다음과 같은 간단한 방법을 사용합니다.

FirebaseMessaging.getInstance().token.await()

업데이트 11-12-2020

사용할 때'com.google.firebase:firebase-messaging:21.0.0'지금은 감퇴되었습니다.

이제 우리는 사용해야 합니다.FirebaseInstallations.getInstance().getToken()그리고.FirebaseMessaging.getInstance().token

샘플 코드

FirebaseInstallations.getInstance().getToken(true).addOnCompleteListener {
            firebaseToken = it.result!!.token
        }

// OR

FirebaseMessaging.getInstance().token.addOnCompleteListener {
            if(it.isComplete){
                firebaseToken = it.result.toString()
                Util.printLog(firebaseToken)
            }
        }

이 방법을 사용하여 Firebase가 포함된 장치 토큰을 가져올 수 있습니다.

 FirebaseMessaging.getInstance().getToken().addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
            String deviceToken = task.getResult();
        }
    });

firebase-messaging:17.1.0그리고 새로운 파이어베이스.InstanceIdService가 더 이상 사용되지 않습니다. 다음 정보를 얻을 수 있습니다.onNewToken에서.FirebaseMessagingServicehttps://stackoverflow.com/a/51475096/1351469 에서 설명한 클래스

하지만 언제든지 토큰을 얻고 싶다면 다음과 같이 할 수 있습니다.

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

에서 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();
                      // ...
                }
            }
        });

사용자가 기록된 경우 잘 작동합니다.현재 사용자 가져오기()

활동(2021)에서 fcm 토큰을 가져오는 최신 코드입니다.

FirebaseMessaging.getInstance().getToken()
                .addOnCompleteListener(new OnCompleteListener<String>() {
                    @Override
                    public void onComplete(@NonNull Task<String> task) {
                        if (!task.isSuccessful()) {
                            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
                            return;
                        }
                        // Get new FCM registration token
                        String token = task.getResult();

                        Log.d(TAG, "fcm token : "+token);
                        
                    }
                });

새 토큰의 경우 새 토큰을 추가합니다.Firebase Messaging Service 확장 클래스의 토큰 메서드입니다.

@Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        Log.d(TAG, token);
    }

이것을 먹어보세요.

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

여기에 착륙하는 사람들을 위해, 지금까지.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);
    }
}

Android Manifest에서 선언합니다.

<application... >

<service android:name=".fcm.MyFirebaseMessagingService">
    <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>
</application>
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();

            }
        });

일시 중단 함수 내부의 Firebase 토큰을 가져오는 예

override suspend fun sendTokenToServer() {
    try {
 
        val token = FirebaseMessaging.getInstance().token.await()
        Log.i("TAG", "token " + token)
    } catch (exception:Exception) {

    }
}

짧게 하겠습니다.이 방법은 Firebase 토큰을 검색하는 데 사용되지 않는 유일한 방법입니다.

FirebaseInstallations.getInstance().getToken(true).addOnCompleteListener(task -> { 
   // get token 
   String token = task.getResult().getToken();      
})

코드를 하십시오. - 최파이베버경전우아래코사다용니합드를의스신이어.'com.google.firebase:firebase-messaging:22.0.0'

FirebaseMessaging.getInstance().getToken()
                        .addOnCompleteListener(task -> {

                            if (!task.isSuccessful()) {
                                //handle token error
                                return;
                            }

                            strAppToken = task.getResult();

                        });

Firebase(FCM)에서 다음을 사용하여 토큰을 가져올 수 있습니다.

FirebaseInstanceId.getInstance().getToken();

파이어베이스InstanceId.getInstance().getInstanceId()가 더 이상 사용되지 않습니다.이제 사용자 FCM 토큰 가져오기

 FirebaseMessaging.getInstance().getToken()
            .addOnCompleteListener(new OnCompleteListener<String>() {
                @Override
                public void onComplete(@NonNull Task<String> task) {
                    if (!task.isSuccessful()) {
                        System.out.println("--------------------------");
                        System.out.println(" " + task.getException());
                        System.out.println("--------------------------");
                        return;
                    }

                    // Get new FCM registration token
                    String token = task.getResult();

                    // Log 
                    String msg = "GET TOKEN " + token;
                    System.out.println("--------------------------");
                    System.out.println(" " + msg);
                    System.out.println("--------------------------");

                }
            });

플러터 솔루션:

var token = await FirebaseMessaging.instance.getToken();
Settings.Secure.getString(getContentResolver(),
                     Settings.Secure.ANDROID_ID);

언급URL : https://stackoverflow.com/questions/37787373/firebase-fcm-how-to-get-token

반응형