Android

FirebaseMessaging.getInstance().getToken() 메서드가 호출안됨

becky(지은) 2024. 3. 30. 16:16

fcm을 사용하려고 여러 세팅을 하던 도중에, 새로운 토큰은 발급 받았으나
새 토큰이 불러와지지 않는 문제가 발생했다.

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    String CHANNEL_ID;
    String CHANNEL_NAME;
    int userId;
    ChatApiService service;
    private static final String TAG = "FCM Service";

    // 서비스가 생성될 때 호출되며, 여기서 FCM 토큰을 요청하는 것이 좋습니다.
    @Override
    public void onCreate() {
        super.onCreate();
        userId = SharedPreferencesHelper.getUserId(getApplicationContext());
        Retrofit retrofit = RetrofitClient.getClient();
        service = retrofit.create(ChatApiService.class);

        // 현재 토큰을 가져오기
        FirebaseMessaging.getInstance().getToken().
                addOnCompleteListener(new OnCompleteListener<String>() {
                    @Override
                    public void onComplete(@NonNull Task<String> task) {
                        if (!task.isSuccessful()) {
                            Log.w(TAG, "토큰 생성 실패", task.getException());
                            return;
                        }
                        // 새로운 토큰 생성 성공 시
                        String token = task.getResult();
                        Log.d(TAG,token);
                    }
                });
    }


FirebaseMessaging.getInstance().getToken() 메서드를 호출했을때, 어떤 Log 도 찍히지 않는 문제가 발생했다.
구글링을 해봐도 뾰족한 수가 없었다.

새 토큰은 디바이스에 관계없이 잘 발급되는 상황이었기에
firebase 설정문제는 아니라는 생각이 들었다.

그래서 선언부를 MyFirebaseMessagingService 클래스에서 ChatActivity로 바꿔주었다.

public class ChatActivity extends AppCompatActivity implements DateMarkerListener {
    ChatApiService service;
    ProfileApiService profileService;
    private int currentUserId;
    private ChatClient chatClient;
    private RecyclerView recyclerView;
    private MessageAdapter messageAdapter;
    private List<Message> messages = new ArrayList<>();
    private int chatRoomId;
    String myProfileImg;
    String partnerProfileImg;

    //네트워크 작업(채팅)을 수행할 때 주의해야 할 중요한 점 중 하나는 네트워크 작업을 메인 스레드에서 실행하지 않아야 한다는 것!!!

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);

        String TAG = "FCM Service";
        // 현재 토큰을 가져오기
        FirebaseMessaging.getInstance().getToken().
                addOnCompleteListener(new OnCompleteListener<String>() {
                    @Override
                    public void onComplete(@NonNull Task<String> task) {
                        if (!task.isSuccessful()) {
                            Log.w(TAG, "토큰 생성 실패", task.getException());
                            return;
                        }
                        // 새로운 토큰 생성 성공 시
                        String token = task.getResult();
                        Log.d(TAG,token);
                    }
                });



이제는 기존 토큰이 잘 호출된다.



원인이 무엇일까 찾아보니...

MyFirebaseMessagingService의 onCreate 메서드 내에서 실행되지 않는 문제의 원인 중 하나로 Firebase의 초기화 상태를 고려해볼 수 있습니다. FirebaseMessagingService가 시작될 때 Firebase 초기화가 완전히 완료되지 않았을 가능성이 있습니다. 특히, 앱의 시작 과정에서 다양한 컴포넌트와 서비스가 초기화되는 동안, Firebase 관련 서비스나 기능들의 초기화 순서와 타이밍이 영향을 받을 수 있습니다.

Firebase와 같은 서비스는 애플리케이션의 다른 초기화 작업이 완료된 후에 완전히 활성화되기 때문에, FirebaseMessagingService가 시작되는 시점에는 Firebase 인스턴스의 초기화가 아직 진행 중일 수 있습니다. 이러한 이유로, onCreate 메서드 내에서 바로 FirebaseMessaging.getInstance().getToken()를 호출하면 예상대로 동작하지 않을 수 있습니다.