FirebaseInstanceIdService는 더 이상 사용되지 않습니다


224

firebase 알림 토큰이 새로 고쳐질 때마다 알림 토큰을 얻는 데 사용 된이 클래스를 알고 있기를 바랍니다.이 클래스에서 새로 고친 토큰을 다음 방법에서 가져옵니다.

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

FCM을 구현하고 싶을 때 이것을 사용하기 위해 MyClass를 확장했습니다. FirebaseInstanceIdService

그러나 FirebaseInstanceIdService가 더 이상 사용되지 않음을 표시

아무도 이것을 알고 있습니까?, 더 이상 사용되지 않으므로 새로 고침 된 토큰을 얻으려면이 대신 사용해야하는 메소드 또는 클래스입니다.

나는 사용하고있다 : implementation 'com.google.firebase:firebase-messaging:17.1.0'

나는 이것에 대해 언급 된 내용이없는 것을 확인했다. : FCM 설정 문서


최신 정보

이 문제는 해결되었습니다.

구글은 사용되지 않는 FirebaseInstanceService,

나는 방법을 찾기 위해 질문을했고 FirebaseMessagingService 에서 토큰을 얻을 수 있다는 것을 알게되었습니다 .

이전과 마찬가지로 질문 문서가 업데이트되지 않았지만 이제 Google 문서가 업데이트되어 자세한 정보가 필요하면 다음 Google 문서를 참조하십시오 : FirebaseMessagingService

OLD From : FirebaseInstanceService (더 이상 사용되지 않음)

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

NEW From : FirebaseMessagingService

@Override
public void onNewToken(String s) {
    super.onNewToken(s);
    Log.d("NEW_TOKEN",s);
}

감사.




온라인 설명서가 방금 업데이트되었습니다. firebase.google.com/docs/reference/android/com/google/firebase/...
jackycflau

전화가 필요 / 정확 super.onNewToken(s);합니까? ( firebase.google.com/docs/cloud-messaging/android/client 에서 호출되는 것을 보지 못했습니다 .)
ban-geoengineering

매니페스트에 변화가 있습니까?
Muahmmad Tayyib

답변:


122

여기에 화염병

다음에 대한 참조 문서를FirebaseInstanceIdService 확인하십시오 .

이 클래스는 더 이상 사용되지 않습니다.

의 재정의 onNewToken에 찬성 FirebaseMessagingService합니다. 일단 구현되면이 서비스를 안전하게 제거 할 수 있습니다.

이상하게도 JavaDoc FirebaseMessagingServiceonNewToken메소드를 아직 언급하지 않았습니다. 모든 업데이트 된 문서가 아직 게시되지 않은 것 같습니다. 참조 문서에 대한 업데이트를 게시하고 가이드의 샘플도 업데이트하도록 내부 문제를 제기했습니다.

그 동안 이전 / 더 이상 사용되지 않는 통화와 새 통화가 모두 작동합니다. 어느 쪽이든 문제가 있다면 코드를 게시하면 살펴볼 것입니다.


7
중포 기지 문서는 또한 아직 업데이트되지 않았습니다.
Rosário Pereira Fernandes 0

1
예 @ 프랭크, 방법은 존재하지만 관련 문서는 아직 업데이트되지 않았습니다.
Uttam Panchasara 5

@kev (유효한) 새로운 질문처럼 들립니다. 최소한의 완전한 코드 스 니펫으로 새 게시물을 작성하십시오.
Frank van Puffelen

@FrankvanPuffelen은 이미했습니다. 보세요 stackoverflow.com/questions/51296171/…
kev

1
이 Xamarin Android 용 업데이트에 대해서도 찾았습니다. FirebaseMessagingService를 확장하는 클래스에 OnNewToken 메소드를 추가했습니다. 그러나 그 방법은 맞지 않습니다. 어떻게해야하는지 알 수 없습니다. xamarin의 Android Manifest 파일과 다릅니다.
Prabesh

133

예, FirebaseInstanceIdService 더 이상 사용되지 않습니다

FROM DOCS :- 이 클래스는 더 이상 사용되지 않습니다. 찬성 overriding onNewToken에서 FirebaseMessagingService. 일단 구현되면이 서비스를 안전하게 제거 할 수 있습니다.

FirebaseInstanceIdServiceFCM 토큰을 얻기 위해 서비스 를 사용할 필요가 없습니다. 안전하게 FirebaseInstanceIdService서비스를 제거 할 수 있습니다

이제 우리가해야 할 @Override onNewToken 얻을 TokenFirebaseMessagingService

샘플 코드

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onNewToken(String s) {
        Log.e("NEW_TOKEN", s);
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        Map<String, String> params = remoteMessage.getData();
        JSONObject object = new JSONObject(params);
        Log.e("JSON_OBJECT", object.toString());

        String NOTIFICATION_CHANNEL_ID = "Nilesh_channel";

        long pattern[] = {0, 1000, 500, 1000};

        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "Your Notifications",
                    NotificationManager.IMPORTANCE_HIGH);

            notificationChannel.setDescription("");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.setVibrationPattern(pattern);
            notificationChannel.enableVibration(true);
            mNotificationManager.createNotificationChannel(notificationChannel);
        }

        // to diaplay notification in DND Mode
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = mNotificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID);
            channel.canBypassDnd();
        }

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);

        notificationBuilder.setAutoCancel(true)
                .setColor(ContextCompat.getColor(this, R.color.colorAccent))
                .setContentTitle(getString(R.string.app_name))
                .setContentText(remoteMessage.getNotification().getBody())
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.ic_launcher_background)
                .setAutoCancel(true);


        mNotificationManager.notify(1000, notificationBuilder.build());
    }
}

편집하다

다음 FirebaseMessagingService과 같이 매니페스트 파일 을 등록해야 합니다.

    <service
        android:name=".MyFirebaseMessagingService"
        android:stopWithTask="false">
        <intent-filter>

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

활동에서 토큰을 얻는 방법

.getToken(); 사용보다 활동에서 토큰을 가져와야하는 경우에도 더 이상 사용되지 않습니다. getInstanceId ()

이제 getInstanceId ()토큰 생성 에 사용해야 합니다

getInstanceId ()IDFirebase프로젝트에 대해 자동 생성 된 토큰을 반환합니다 .

인스턴스 ID가 아직 없으면 Firebase 백엔드에 주기적으로 정보를 전송하기 시작합니다.

보고

  • 작업은 당신이를 통해 결과를 확인하는 데 사용할 수있는 InstanceIdResult이는 보유 IDtoken.

샘플 코드

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

     }
 });

편집 2

kotlin의 작업 코드는 다음과 같습니다.

class MyFirebaseMessagingService : FirebaseMessagingService() {

    override fun onNewToken(p0: String?) {

    }

    override fun onMessageReceived(remoteMessage: RemoteMessage?) {


        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        val NOTIFICATION_CHANNEL_ID = "Nilesh_channel"

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val notificationChannel = NotificationChannel(NOTIFICATION_CHANNEL_ID, "Your Notifications", NotificationManager.IMPORTANCE_HIGH)

            notificationChannel.description = "Description"
            notificationChannel.enableLights(true)
            notificationChannel.lightColor = Color.RED
            notificationChannel.vibrationPattern = longArrayOf(0, 1000, 500, 1000)
            notificationChannel.enableVibration(true)
            notificationManager.createNotificationChannel(notificationChannel)
        }

        // to diaplay notification in DND Mode
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID)
            channel.canBypassDnd()
        }

        val notificationBuilder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)

        notificationBuilder.setAutoCancel(true)
                .setColor(ContextCompat.getColor(this, R.color.colorAccent))
                .setContentTitle(getString(R.string.app_name))
                .setContentText(remoteMessage!!.getNotification()!!.getBody())
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.ic_launcher_background)
                .setAutoCancel(true)


        notificationManager.notify(1000, notificationBuilder.build())

    }
}

1
의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Samuel Liew

아무도 FirebaseMessagingService를 가져 오는 방법을 보여주지 않는 이유는 무엇입니까?
temirbek

12

이:

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken()

더 이상 사용되지 않는 솔루션이라고 가정하십시오.

FirebaseInstanceId.getInstance().getToken()

편집하다

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken() 작업이 아직 완료되지 않은 경우 예외를 생성 할 수 있으므로 (으로 설명 된 .addOnSuccessListener) 마녀 Nilesh Rathod 가 올바른 방법입니다.

코 틀린 :

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(this) { instanceIdResult ->
        val newToken = instanceIdResult.token
        Log.e("newToken", newToken)
    }

5

Kotlin은 다른 답변에 표시된 것보다 훨씬 간단한 코드를 허용합니다.

새로 고쳐질 때마다 새 토큰을 얻으려면 :

class MyFirebaseMessagingService: FirebaseMessagingService() {

    override fun onNewToken(token: String?) {
        Log.d("FMS_TOKEN", token)
    }
    ...
}

런타임시 어디서나 토큰을 가져 오려면 다음을 수행하십시오.

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
    Log.d("FMS_TOKEN", it.token)
}

5

FirebaseinstanceIdService더 이상 사용되지 않습니다. "FirebaseMessagingService"를 사용해야합니다

바다 이미지 :

여기에 이미지 설명을 입력하십시오

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
        Log.e("NEW_TOKEN",s);
    }

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

4

KOTLIN에서 :- 토큰 을 DB 또는 공유 환경 설정 에 저장하려면 FirebaseMessagingService 에서 onNewToken을 재정의하십시오.

override fun onNewToken(token: String) {
        super.onNewToken(token)
    }

런타임에 토큰을 얻고 사용하십시오.

FirebaseInstanceId.getInstance().instanceId
                        .addOnSuccessListener(this@SplashActivity) { instanceIdResult ->
                            val mToken = instanceIdResult.token
                            println("printing  fcm token: $mToken")
                        }

이제 override fun onNewToken(token: String)(물음표 제외)입니다.
Csaba Toth

1

FCM 구현 클래스 :

 public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> data = remoteMessage.getData();
if(data != null) {
 // Do something with Token
  }
}
}
// FirebaseInstanceId.getInstance().getToken();
@Override
public void onNewToken(String token) {
  super.onNewToken(token);
  if (!token.isEmpty()) {
  Log.e("NEW_TOKEN",token);
 }
}
}

그리고 Activity 또는 APP에서 initialize를 호출하십시오.

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(
                instanceIdResult -> {
                    String newToken = instanceIdResult.getToken();
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.i("FireBaseToken", "onFailure : " + e.toString());
                    }
                });

AndroidManifest.xml :

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

** "INSTANCE_ID_EVENT"를 추가 한 경우 비활성화해야합니다.


1

FirebaseMessagingService() 대신에 사용해야 합니다FirebaseInstanceIdService

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.