FirebaseInstanceIdService không được dùng nữa


223

Hy vọng tất cả các bạn biết về lớp này, được sử dụng để nhận mã thông báo bất cứ khi nào mã thông báo firebase được làm mới, chúng tôi nhận được mã thông báo được làm mới từ lớp này, Từ phương pháp sau.

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

Để sử dụng điều này như tôi muốn triển khai FCM, tôi đã mở rộng MyClass từ FirebaseInstanceIdService

Nhưng, Hiển thị rằng FirebaseInstanceIdService không được dùng nữa

Có ai biết điều này không?, Phương pháp hoặc lớp nào tôi nên sử dụng thay vì phương thức này để nhận mã thông báo được làm mới vì điều này không được chấp nhận.

Tôi đang sử dụng : implementation 'com.google.firebase:firebase-messaging:17.1.0'

Tôi đã kiểm tra tài liệu cho cùng không có gì được đề cập về điều này. : TÀI LIỆU CÀI ĐẶT FCM


CẬP NHẬT

Vấn đề này đã được cố định.

Khi Google không chấp nhận FirebaseInstanceService,

Tôi đã hỏi câu hỏi để tìm đường và tôi biết rằng chúng tôi có thể nhận được mã thông báo từ FirebaseMessagingService ,

Như trước đây, khi tôi hỏi Tài liệu câu hỏi chưa được cập nhật nhưng Bây giờ tài liệu Google đã cập nhật để biết thêm thông tin, hãy tham khảo tài liệu google này: FirebaseMessagingService

OLD Từ: FirebaseInstanceService (Không dùng nữa)

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

MỚI Từ: FirebaseMessagingService

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

Cảm ơn.


1
Đăng chéo trên GitHub
Rosário Pereira Fernandes


tài liệu trực tuyến vừa được cập nhật. firebase.google.com/docs/reference/android/com/google/firebase/
mẹo

Có cần thiết / chính xác để gọi super.onNewToken(s);? (Tôi không thấy nó được gọi trên firebase.google.com/docs/cloud-messaging/android/client .)
ban-geengineering

sẽ có bất kỳ thay đổi trong bảng kê khai?
Muahmmad Tayyib

Câu trả lời:


122

xe cứu hỏa ở đây

Kiểm tra tài liệu tham khảo choFirebaseInstanceIdService :

Lớp học này đã bị phản đối.

Trong việc ủng hộ ghi đè onNewTokentrong FirebaseMessagingService. Một khi điều đó đã được thực hiện, dịch vụ này có thể được gỡ bỏ một cách an toàn.

Thật kỳ lạ, JavaDoc FirebaseMessagingServicevẫn chưa đề cập đến onNewTokenphương thức này. Có vẻ như không phải tất cả các tài liệu cập nhật đã được xuất bản. Tôi đã gửi một vấn đề nội bộ để có được các bản cập nhật cho các tài liệu tham khảo được xuất bản và để các mẫu trong hướng dẫn cũng được cập nhật.

Trong khi đó, cả các cuộc gọi cũ / không dùng nữa và các cuộc gọi mới sẽ hoạt động. Nếu bạn gặp rắc rối với một trong hai, hãy đăng mã và tôi sẽ xem xét.


7
Các căn cứ hỏa lực Documents cũng chưa được cập nhật.
Rosário Pereira Fernandes

1
Có @frank, phương thức tồn tại, nhưng các tài liệu liên quan chưa được cập nhật.
Uttam Panchasara

@kev Nghe có vẻ như một câu hỏi mới (hợp lệ). Vui lòng tạo một bài đăng mới, với một đoạn mã hoàn chỉnh tối thiểu.
Frank van Puffelen

@FrankvanPuffelen đã làm. Có một cái nhìn. stackoverflow.com/questions/51296171/ từ
kev

1
Tôi cũng tìm thấy về bản cập nhật này cho Xamarin Android. Đã thêm phương thức OnNewToken trong lớp mở rộng FirebaseMessagingService. Nhưng phương pháp đó không trúng. Tôi không thể tìm ra những gì tôi nên làm. Có khác nhau trong tập tin Android Manifest cho xamarin.
Mitchesh

133

FirebaseInstanceIdService bị phản đối

TỪ DOCS: - Lớp này không được dùng nữa. Ủng hộ overriding onNewTokentrong FirebaseMessagingService. Một khi điều đó đã được thực hiện, dịch vụ này có thể được gỡ bỏ một cách an toàn.

Không cần sử dụng FirebaseInstanceIdServicedịch vụ để nhận mã thông báo FCM Bạn có thể xóa FirebaseInstanceIdServicedịch vụ một cách an toàn

Bây giờ chúng ta cần phải @Override onNewToken có được TokentrongFirebaseMessagingService

MẪU MÃ

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

BIÊN TẬP

Bạn cần phải đăng ký FirebaseMessagingServicetệp kê khai của bạn như thế này

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

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

làm thế nào để có được mã thông báo trong hoạt động của bạn

.getToken(); cũng không được chấp nhận nếu bạn cần nhận mã thông báo trong hoạt động của mình hơn Sử dụng getInstanceId ()

Bây giờ chúng tôi cần sử dụng getInstanceId ()để tạo mã thông báo

getInstanceId ()Trả về IDvà tự động tạo mã thông báo cho Firebasedự án này .

Điều này tạo ra một ID Instance nếu nó chưa tồn tại, nó bắt đầu gửi thông tin định kỳ đến phụ trợ Firebase.

Trả về

  • Nhiệm vụ mà bạn có thể sử dụng để xem kết quả thông qua InstanceIdResultđó giữ IDtoken.

MẪU MÃ

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

     }
 });

CHỈNH SỬA 2

Đây là mã làm việc cho 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
Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Samuel Liew

Tại sao không ai chỉ cách nhập FirebaseMessagingService?
temirbek

12

Và điều này:

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

giả sử là giải pháp không dùng nữa:

FirebaseInstanceId.getInstance().getToken()

BIÊN TẬP

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken() có thể tạo ra ngoại lệ nếu nhiệm vụ chưa hoàn thành, vì vậy phương pháp phù thủy Nilesh Rathod mô tả (với .addOnSuccessListener) là cách chính xác để thực hiện.

Kotlin:

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

5

Kotlin cho phép mã thậm chí đơn giản hơn những gì được hiển thị trong các câu trả lời khác.

Để nhận mã thông báo mới bất cứ khi nào nó được làm mới:

class MyFirebaseMessagingService: FirebaseMessagingService() {

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

Để nhận mã thông báo từ mọi nơi trong thời gian chạy:

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

5

FirebaseinstanceIdServicebị phản đối Vì vậy, phải sử dụng "FirebaseMessagingService"

Xin vui lòng gửi hình ảnh trên biển:

nhập mô tả hình ảnh ở đây

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

Trong KOTLINE: - Nếu bạn muốn lưu Token vào DB hoặc chia sẻ tùy chọn thì hãy ghi đè lên NewToken trong FirebaseMessagingService

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

Nhận mã thông báo vào thời gian chạy, sử dụng

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

Bây giờ là nó override fun onNewToken(token: String)(không có dấu chấm hỏi).
Csaba Toth

1

Lớp thực hiện 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);
 }
}
}

Và gọi khởi tạo của nó trong Hoạt động hoặc APP:

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>

** Nếu bạn đã thêm "INSTANCE_ID_EVENT", đừng nhớ tắt nó.


1

Bạn phải sử dụng FirebaseMessagingService() thay vìFirebaseInstanceIdService

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.